pragma Singleton
import QtQuick
import Quickshell
import "themes"

QtObject {
    id: root

    readonly property var theme: Snowy

    // ────────────────────────────────────────────────────────────────────────
    // Widgets
    // ────────────────────────────────────────────────────────────────────────
    property bool enableBgDate:  true
    property bool sideBarSysInfo: true
    property bool sideBarMpris: true
    property bool sideBarWeather: true
    property string sideBarPosition: "right"  // "left" or "right"
    property bool enablePolkit:  true

    // ────────────────────────────────────────────────────────────────────────
    // BAR
    // ────────────────────────────────────────────────────────────────────────
	 property string barPosition: "bottom"
	 property int    barHeight:   35
	 property int    margin:      15
	 property int    radius:      20
			
	// ────────────────────────────────────────────────────────────────────────
	// FRAME
	// ────────────────────────────────────────────────────────────────────────
	property string frameVariant:      "bar"  // "card" or "bar"
	property int    frameBorderWidth:  3
	property int    frameBarPadTop:    5     // bar variant: padding from top edge
	property int    frameBarPadBottom: 5     // bar variant: padding from bottom edge


    // ── Module Lists ──────────────────────────────────────────────────────────
    property var leftModules:   ["Logo", "Stats", "Crypto"]
    property var centerModules: ["Workspace"]
    property var rightModules:  ["Tray", "Notifications", "Volume", "Network", "Battery" ,"Clock"]

    // ── Logo ─────────────────────────────────────────────────────────────
    property int    logoIconSize: 23      // icon font size; container width scales with it
    property string logoIcon:     "󱄅"  // Nerd Font glyph for the logo
    property int    logoSpinDuration: 600  // spin animation duration in ms

    // ── Panel Styling ─────────────────────────────────────────────────────────
    property int panelBorderWidth: 1
    property int moduleSpacing:    5   // space between modules within a panel
    property int panelSpacing:     12  // gap between left / center / right panels
    property int moduleHeight:     23  // default chip height for bar modules

    // ── Popup Styling ─────────────────────────────────────────────────────────
    property int popupRadius:        18
    property int popupBorderWidth:   1
    property int popupAnimDuration:  250
    property string popupAnimType:   "slide"  // "bubbleslide" or "slide"

    // ── Clock Module  ─────────────────────────────────────────────────────────
    property bool clockExtendEnabled: true  // seconds extension on hover for clock

    // ── Timezone (IANA name, e.g. "America/New_York", "Europe/London") ──────────
    // Leave empty to use the system timezone.
    property string timezone: ""

    // Date format used in the clock popup and background date widget.
    // "MDY" → month/day/year   (e.g. May 14, 2026)
    // "DMY" → day/month/year   (e.g. 14 May 2026)
	property string dateFormat: "DMY"
	
    // ── Tray Styling ─────────────────────────────────────────────────────────
    property int trayToggleSize: 23  // size of the expand/collapse arrow button
    property int trayIconSize:   20  // size of each system tray item icon

    // ── Stats Styling ─────────────────────────────────────────────────────────
    property int  statsRingSize:     22
    property int  statsRingFontSize: 12
    property int  statsIconSize: 10
    // Where the percentage label appears when stats are expanded.
    // "right" → label to the right of the ring;  "left" → label to the left.
    property string statsLabelPosition: "right"
    // If true, percentage labels are visible on startup without clicking.
    property bool   statsStartExpanded: false
    property bool   statsShowCpu:      true
    property bool   statsShowMem:      true
    property bool   statsShowDisk:     true
    property bool   statsShowCpuTemp:  true
    property bool   statsShowGpuTemp:  true
	
    // ── Volume Module ─────────────────────────────────────────────────────────
    property bool volumeShakeEnabled: true   // rotation shake for volume chip
    property int volumeIconSize:     20
    property int volumeSliderHeight: 2
    property int volumeHandleSize:   20
    property int volumePopupWidth:   280
    property int volumeOutputMax:    100
    property int volumeInputMax:     200




    // ────────────────────────────────────────────────────────────────────────
    // NOTIFICATIONS
    // ────────────────────────────────────────────────────────────────────────
    property bool notificationShakeEnabled: true  // bell ringing shake for notifications
    property string notificationPosition:  "topright"
    property int    notificationHistorySize: 50
	
    // ── Toast timeouts (milliseconds) ─────────────────────────────────────────
    property int notifTimeoutLow:      3500
    property int notifTimeoutNormal:   5000
    property int notifTimeoutCritical: 0

    property int notifIconSize: 18
    property int notifToastEdgePad: 10    // extra gap between toast cards and the frame border

    // ────────────────────────────────────────────────────────────────────────
    // LAUNCHER
    // ────────────────────────────────────────────────────────────────────────
    property string launcherScript:   Quickshell.env("HOME") + "/.config/quickshell/launcher/launcher.sh"
    property string launcherCacheDir: "/tmp/qs_launcher"
    property bool   launcherCloseOnClickOutside: true
    property bool   launcherSelectFirst:         false
    property bool   launcherMipmapIcons:         false

    // ────────────────────────────────────────────────────────────────────────
    // CRYPTO
    // ────────────────────────────────────────────────────────────────────────

    // ── Coin/currency pairs to cycle ──────────────────────────────────────────
    // Each entry is a { coin, currency } object. The bar chip fetches one pair
    // per timer tick and auto-rotates to the next after each successful fetch.
    //
    // coin     – CoinGecko coin ID, e.g. "bitcoin", "monero", "solana"
    // currency – quote currency: "usd", "eur", "brl", "btc", "eth", …
    //
    //   Single pair  →  [{ coin: "bitcoin",  currency: "usd" }]
    //   Three pairs  →  [{ coin: "bitcoin",  currency: "usd" },
    //                    { coin: "monero",   currency: "usd" },
    //                    { coin: "solana",   currency: "brl" }]
    //
    // This list is the *default*; pairs can be added/removed live in the
    // Settings popup and those changes are persisted across restarts.
    property var cryptoPairs: [{ coin: "bitcoin", currency: "usd" }, { coin: "ethereum", currency: "eur" }, { coin: "monero", currency: "usd" }, { coin: "bitcoin", currency: "eur" }, { coin: "bitcoin", currency: "brl" }, { coin: "ethereum", currency: "usd" }]

    // ── Compact label decimals ────────────────────────────────────────────────
    //   0  →  "80k"
    //   1  →  "80.0k"   (default)
    //   3  →  "80.000k"
    property int    cryptoDecimals:   2

    // ── Poll interval ─────────────────────────────────────────────────────────
    // Seconds between CoinGecko requests. Each tick fetches one pair
    // and advances to the next in the cycle. Free tier allows ~30 req/min.
    property int    cryptoRefreshSec: 120

    // ── Bar rotate interval ────────────────────────────────────────────────────
    // Seconds between auto-rotating the displayed pair. 0 = disabled.
    // Uses cached data (no API call), instant switching.
    property int    cryptoRotateSec:   10

    // ── Bar chip icon ─────────────────────────────────────────────────────────
    // Show the coin icon glyph ("󰿤") on the bar chip.
    property bool   cryptoShowIcon:   true

    // ────────────────────────────────────────────────────────────────────────
    // WEATHER
    // ────────────────────────────────────────────────────────────────────────
    property string weatherLocation:   ""      // city name, e.g. "London" or "New+York"; empty → auto-detect from IP
    property int    weatherRefreshMin: 30      // update interval in minutes
}
