// Power & Lock.
//
// hypridle has no IPC for reconfiguration, so these values reach it by
// regenerating its config and restarting the daemon (services/IdleLock.qml).
// That only happens when Panama manages the daemon, and the card below says
// plainly which state you are in rather than presenting sliders that silently
// do nothing.

import QtQuick
import Quickshell
import qs.config
import qs.services

SettingsPage {
    id: root

    // Probing the power daemon is a D-Bus round trip, so it happens when the
    // page opens rather than at shell startup.
    Component.onCompleted: if (!PowerProfiles.scanned) PowerProfiles.refresh()

    title: "Power & Lock"
    lede: "When the screen turns off, when the session locks, and whether it ever sleeps."

    // The same profiles GNOME's Power panel offers. Not a stored preference --
    // the daemon owns it, it survives Panama restarts, and anything else on the
    // system can change it, so a copy here would drift.
    SettingsCard {
        visible: PowerProfiles.available || PowerProfiles.lastError !== ""
        title: "Power profile"
        subtitle: PowerProfiles.degraded !== ""
            ? "Performance is limited right now: " + PowerProfiles.degraded
            : (PowerProfiles.available
                ? "Applies to the whole system and persists across sessions."
                : PowerProfiles.lastError)

        Repeater {
            model: PowerProfiles.profiles

            SettingRow {
                id: profileRow
                required property var modelData
                required property int index

                label: PowerProfiles.label(profileRow.modelData)
                detail: PowerProfiles.detail(profileRow.modelData)
                value: profileRow.modelData === PowerProfiles.active ? "Active" : ""
                divider: profileRow.index < PowerProfiles.profiles.length - 1
                activatable: profileRow.modelData !== PowerProfiles.active && !PowerProfiles.busy
                onActivated: PowerProfiles.set(profileRow.modelData)
            }
        }
    }

    SettingsCard {
        title: "Idle behavior"
        subtitle: IdleLock.managed
            ? "Idle timings are managed here. Changes take effect immediately."
            : "hypridle is running its shipped configuration. Turn on management below to make these adjustable."

        SliderRow { setting: "screenBlankMinutes"; zeroLabel: "Never" }
        SliderRow { setting: "lockMinutes"; zeroLabel: "Never" }
        SliderRow { setting: "suspendMinutes"; zeroLabel: "Never" }
        ToggleRow { setting: "lockOnSleep"; divider: false }
    }

    // Only shown when the numbers are actually contradictory, rather than as a
    // permanent warning nobody reads.
    SettingsCard {
        visible: IdleLock.lockBeforeBlank
        title: "Lock happens before the screen turns off"
        subtitle: "The session will lock at " + IdleLock.lockMinutes
            + " minutes and the display will not blank until " + IdleLock.blankMinutes
            + ". That works, but the screen stays lit on the lock screen for the difference."
    }

    SettingsCard {
        title: "Management"
        subtitle: "hypridle's configuration is generated into your state directory and the service is pointed at it with a systemd drop-in. ~/.config/hypr is a symlink into the configuration repository, so the shipped file cannot be rewritten in place."

        SettingRow {
            label: "Manage idle timings here"
            detail: IdleLock.serviceState === "active"
                ? "hypridle is running"
                : "hypridle is " + IdleLock.serviceState
            controlWidth: 48

            SettingsToggle {
                anchors.right: parent.right
                anchors.verticalCenter: parent.verticalCenter
                checked: IdleLock.managed
                enabled: !IdleLock.busy
                onToggled: value => IdleLock.setManaged(value)
            }
        }

        ActionRow {
            label: "Lock the screen now"
            detail: "Same as the Super+L shortcut"
            action: "Lock"
            divider: false
            onTriggered: Quickshell.execDetached(["loginctl", "lock-session"])
        }
    }

    SettingsCard {
        visible: IdleLock.lastError !== ""
        title: "Idle configuration problem"
        subtitle: IdleLock.lastError

        ActionRow {
            label: "Read the idle configuration again"
            action: "Retry"
            divider: false
            onTriggered: IdleLock.refresh()
        }
    }
}
