pragma ComponentBehavior: Bound

import QtQuick
import qs.Common
import qs.Services
import qs.Widgets
import qs.Modules.Settings.Widgets

Column {
    id: root

    property string instanceId: ""
    property var instanceData: null

    readonly property var cfg: instanceData?.config ?? {}

    function updateConfig(key, value) {
        if (!instanceId)
            return;
        var updates = {};
        updates[key] = value;
        SettingsData.updateDesktopWidgetInstanceConfig(instanceId, updates);
    }

    width: parent?.width ?? 400
    spacing: 0

    SettingsToggleRow {
        text: I18n.tr("Show Header")
        checked: cfg.showHeader ?? true
        onToggled: checked => root.updateConfig("showHeader", checked)
    }

    SettingsDivider {}

    Item {
        width: parent.width
        height: graphIntervalColumn.height + Theme.spacingM * 2

        Column {
            id: graphIntervalColumn
            width: parent.width - Theme.spacingM * 2
            x: Theme.spacingM
            anchors.verticalCenter: parent.verticalCenter
            spacing: Theme.spacingS

            StyledText {
                text: I18n.tr("Graph Time Range")
                font.pixelSize: Theme.fontSizeMedium
                color: Theme.surfaceText
            }

            DankButtonGroup {
                model: ["1m", "5m", "10m", "30m"]
                currentIndex: {
                    switch (cfg.graphInterval ?? 60) {
                    case 60:
                        return 0;
                    case 300:
                        return 1;
                    case 600:
                        return 2;
                    case 1800:
                        return 3;
                    default:
                        return 0;
                    }
                }
                buttonHeight: 32
                minButtonWidth: 48
                textSize: Theme.fontSizeSmall
                checkEnabled: false
                onSelectionChanged: (index, selected) => {
                    if (!selected)
                        return;
                    const values = [60, 300, 600, 1800];
                    root.updateConfig("graphInterval", values[index]);
                }
            }
        }
    }

    SettingsDivider {}

    SettingsToggleRow {
        text: I18n.tr("CPU")
        checked: cfg.showCpu ?? true
        onToggled: checked => root.updateConfig("showCpu", checked)
    }

    SettingsDivider {
        visible: cfg.showCpu ?? true
    }

    SettingsToggleRow {
        visible: cfg.showCpu ?? true
        text: I18n.tr("CPU Graph")
        checked: cfg.showCpuGraph ?? true
        onToggled: checked => root.updateConfig("showCpuGraph", checked)
    }

    SettingsDivider {
        visible: cfg.showCpu ?? true
    }

    SettingsToggleRow {
        visible: cfg.showCpu ?? true
        text: I18n.tr("CPU Temperature")
        checked: cfg.showCpuTemp ?? true
        onToggled: checked => root.updateConfig("showCpuTemp", checked)
    }

    SettingsDivider {}

    SettingsToggleRow {
        text: I18n.tr("GPU Temperature")
        checked: cfg.showGpuTemp ?? false
        onToggled: checked => root.updateConfig("showGpuTemp", checked)
    }

    SettingsDivider {
        visible: (cfg.showGpuTemp ?? false) && DgopService.availableGpus.length > 0
    }

    Item {
        width: parent.width
        height: gpuSelectColumn.height + Theme.spacingM * 2
        visible: (cfg.showGpuTemp ?? false) && DgopService.availableGpus.length > 0

        Column {
            id: gpuSelectColumn
            width: parent.width - Theme.spacingM * 2
            x: Theme.spacingM
            anchors.verticalCenter: parent.verticalCenter
            spacing: Theme.spacingS

            StyledText {
                text: I18n.tr("GPU")
                font.pixelSize: Theme.fontSizeMedium
                color: Theme.surfaceText
            }

            Column {
                width: parent.width
                spacing: Theme.spacingXS

                Repeater {
                    model: DgopService.availableGpus

                    Rectangle {
                        required property var modelData

                        readonly property bool isSelected: (cfg.gpuPciId ?? "") === modelData.pciId

                        width: parent.width
                        height: 44
                        radius: Theme.cornerRadius
                        color: isSelected ? Theme.primarySelected : Theme.surfaceHover
                        border.color: isSelected ? Theme.primary : Theme.withAlpha(Theme.primary, 0)
                        border.width: 2

                        Row {
                            anchors.fill: parent
                            anchors.margins: Theme.spacingS
                            spacing: Theme.spacingS

                            DankIcon {
                                name: "videocam"
                                size: Theme.iconSizeSmall
                                color: isSelected ? Theme.primary : Theme.surfaceVariantText
                                anchors.verticalCenter: parent.verticalCenter
                            }

                            Column {
                                width: parent.width - Theme.iconSizeSmall - Theme.spacingS
                                anchors.verticalCenter: parent.verticalCenter
                                spacing: 0

                                StyledText {
                                    text: modelData.displayName || "Unknown GPU"
                                    font.pixelSize: Theme.fontSizeSmall
                                    color: Theme.surfaceText
                                    width: parent.width
                                    elide: Text.ElideRight
                                }

                                StyledText {
                                    text: modelData.driver || ""
                                    font.pixelSize: Theme.fontSizeSmall - 2
                                    color: Theme.surfaceVariantText
                                    visible: text !== ""
                                }
                            }
                        }

                        MouseArea {
                            anchors.fill: parent
                            cursorShape: Qt.PointingHandCursor
                            onClicked: root.updateConfig("gpuPciId", modelData.pciId)
                        }
                    }
                }
            }
        }
    }

    SettingsDivider {}

    SettingsToggleRow {
        text: I18n.tr("Memory")
        checked: cfg.showMemory ?? true
        onToggled: checked => root.updateConfig("showMemory", checked)
    }

    SettingsDivider {
        visible: cfg.showMemory ?? true
    }

    SettingsToggleRow {
        visible: cfg.showMemory ?? true
        text: I18n.tr("Memory Graph")
        checked: cfg.showMemoryGraph ?? true
        onToggled: checked => root.updateConfig("showMemoryGraph", checked)
    }

    SettingsDivider {}

    SettingsToggleRow {
        text: I18n.tr("Network")
        checked: cfg.showNetwork ?? true
        onToggled: checked => root.updateConfig("showNetwork", checked)
    }

    SettingsDivider {
        visible: cfg.showNetwork ?? true
    }

    SettingsToggleRow {
        visible: cfg.showNetwork ?? true
        text: I18n.tr("Network Graph")
        checked: cfg.showNetworkGraph ?? true
        onToggled: checked => root.updateConfig("showNetworkGraph", checked)
    }

    SettingsDivider {}

    SettingsToggleRow {
        text: I18n.tr("Disk")
        checked: cfg.showDisk ?? true
        onToggled: checked => root.updateConfig("showDisk", checked)
    }

    SettingsDivider {}

    SettingsToggleRow {
        text: I18n.tr("Top Processes")
        checked: cfg.showTopProcesses ?? false
        onToggled: checked => root.updateConfig("showTopProcesses", checked)
    }

    SettingsDivider {
        visible: cfg.showTopProcesses ?? false
    }

    Item {
        width: parent.width
        height: topProcessesColumn.height + Theme.spacingM * 2
        visible: cfg.showTopProcesses ?? false

        Column {
            id: topProcessesColumn
            width: parent.width - Theme.spacingM * 2
            x: Theme.spacingM
            anchors.verticalCenter: parent.verticalCenter
            spacing: Theme.spacingM

            Row {
                width: parent.width
                spacing: Theme.spacingM

                StyledText {
                    width: parent.width - processCountButtons.width - Theme.spacingM
                    text: I18n.tr("Process Count")
                    font.pixelSize: Theme.fontSizeMedium
                    color: Theme.surfaceText
                    anchors.verticalCenter: parent.verticalCenter
                }

                DankButtonGroup {
                    id: processCountButtons
                    model: ["3", "5", "10"]
                    currentIndex: {
                        switch (cfg.topProcessCount ?? 3) {
                        case 3:
                            return 0;
                        case 5:
                            return 1;
                        case 10:
                            return 2;
                        default:
                            return 0;
                        }
                    }
                    buttonHeight: 32
                    minButtonWidth: 36
                    textSize: Theme.fontSizeSmall
                    checkEnabled: false
                    onSelectionChanged: (index, selected) => {
                        if (!selected)
                            return;
                        const values = [3, 5, 10];
                        root.updateConfig("topProcessCount", values[index]);
                    }
                }
            }

            Row {
                width: parent.width
                spacing: Theme.spacingM

                StyledText {
                    width: parent.width - sortByButtons.width - Theme.spacingM
                    text: I18n.tr("Sort By")
                    font.pixelSize: Theme.fontSizeMedium
                    color: Theme.surfaceText
                    anchors.verticalCenter: parent.verticalCenter
                }

                DankButtonGroup {
                    id: sortByButtons
                    model: ["CPU", "MEM"]
                    currentIndex: (cfg.topProcessSortBy ?? "cpu") === "cpu" ? 0 : 1
                    buttonHeight: 32
                    minButtonWidth: 48
                    textSize: Theme.fontSizeSmall
                    checkEnabled: false
                    onSelectionChanged: (index, selected) => {
                        if (!selected)
                            return;
                        root.updateConfig("topProcessSortBy", index === 0 ? "cpu" : "memory");
                    }
                }
            }
        }
    }

    SettingsDivider {}

    SettingsDropdownRow {
        text: I18n.tr("Layout")
        options: [I18n.tr("Auto"), I18n.tr("Grid"), I18n.tr("List")]
        currentValue: {
            switch (cfg.layoutMode ?? "auto") {
            case "grid":
                return I18n.tr("Grid");
            case "list":
                return I18n.tr("List");
            default:
                return I18n.tr("Auto");
            }
        }
        onValueChanged: value => {
            switch (value) {
            case I18n.tr("Grid"):
                root.updateConfig("layoutMode", "grid");
                return;
            case I18n.tr("List"):
                root.updateConfig("layoutMode", "list");
                return;
            default:
                root.updateConfig("layoutMode", "auto");
            }
        }
    }

    SettingsDivider {}

    SettingsSliderRow {
        text: I18n.tr("Transparency")
        minimum: 0
        maximum: 100
        value: Math.round((cfg.transparency ?? 0.8) * 100)
        unit: "%"
        onSliderValueChanged: newValue => root.updateConfig("transparency", newValue / 100)
    }

    SettingsDivider {}

    SettingsColorPicker {
        colorMode: cfg.colorMode ?? "primary"
        customColor: cfg.customColor ?? "#ffffff"
        onColorModeSelected: mode => root.updateConfig("colorMode", mode)
        onCustomColorSelected: selectedColor => root.updateConfig("customColor", selectedColor.toString())
    }

    SettingsDivider {}

    SettingsDisplayPicker {
        displayPreferences: cfg.displayPreferences ?? ["all"]
        onPreferencesChanged: prefs => root.updateConfig("displayPreferences", prefs)
    }

    SettingsDivider {}

    Item {
        width: parent.width
        height: resetRow.height + Theme.spacingM * 2

        Row {
            id: resetRow
            x: Theme.spacingM
            anchors.verticalCenter: parent.verticalCenter
            spacing: Theme.spacingM

            DankButton {
                text: I18n.tr("Reset Position")
                backgroundColor: Theme.surfaceHover
                textColor: Theme.surfaceText
                buttonHeight: 36
                onClicked: {
                    if (!root.instanceId)
                        return;
                    SettingsData.updateDesktopWidgetInstance(root.instanceId, {
                        positions: {}
                    });
                }
            }

            DankButton {
                text: I18n.tr("Reset Size")
                backgroundColor: Theme.surfaceHover
                textColor: Theme.surfaceText
                buttonHeight: 36
                onClicked: {
                    if (!root.instanceId)
                        return;
                    SettingsData.updateDesktopWidgetInstance(root.instanceId, {
                        positions: {}
                    });
                }
            }
        }
    }
}
