import QtQuick
import qs.Common
import qs.Services
import qs.Modules.ControlCenter.Details
import qs.Modules.ControlCenter.Models

Item {
    id: root

    property string expandedSection: ""
    property var expandedWidgetData: null
    property var bluetoothCodecSelector: null
    property string screenName: ""

    property var pluginDetailInstance: null
    property var widgetModel: null
    property var collapseCallback: null

    Loader {
        id: pluginDetailLoader
        width: parent.width
        height: 250
        y: Theme.spacingS
        active: false
        sourceComponent: null
    }

    Loader {
        id: coreDetailLoader
        width: parent.width
        height: 250
        y: Theme.spacingS
        active: false
        sourceComponent: null
    }

    Connections {
        target: coreDetailLoader.item
        enabled: root.expandedSection.startsWith("brightnessSlider_")
        ignoreUnknownSignals: true

        function onDeviceNameChanged(newDeviceName) {
            if (root.expandedWidgetData && root.expandedWidgetData.id === "brightnessSlider") {
                const widgets = SettingsData.controlCenterWidgets || []
                const newWidgets = widgets.map(w => {
                    if (w.id === "brightnessSlider" && w.instanceId === root.expandedWidgetData.instanceId) {
                        const updatedWidget = Object.assign({}, w)
                        updatedWidget.deviceName = newDeviceName
                        return updatedWidget
                    }
                    return w
                })
                SettingsData.setControlCenterWidgets(newWidgets)
                if (root.collapseCallback) {
                    root.collapseCallback()
                }
            }
        }
    }

    Connections {
        target: coreDetailLoader.item
        enabled: root.expandedSection.startsWith("diskUsage_")
        ignoreUnknownSignals: true

        function onMountPathChanged(newMountPath) {
            if (root.expandedWidgetData && root.expandedWidgetData.id === "diskUsage") {
                const widgets = SettingsData.controlCenterWidgets || []
                const newWidgets = widgets.map(w => {
                    if (w.id === "diskUsage" && w.instanceId === root.expandedWidgetData.instanceId) {
                        const updatedWidget = Object.assign({}, w)
                        updatedWidget.mountPath = newMountPath
                        return updatedWidget
                    }
                    return w
                })
                SettingsData.setControlCenterWidgets(newWidgets)
                if (root.collapseCallback) {
                    root.collapseCallback()
                }
            }
        }
    }

    onExpandedSectionChanged: {
        if (pluginDetailInstance) {
            pluginDetailInstance.destroy()
            pluginDetailInstance = null
        }
        pluginDetailLoader.active = false
        coreDetailLoader.active = false

        if (!root.expandedSection) {
            return
        }

        if (root.expandedSection.startsWith("builtin_")) {
            const builtinId = root.expandedSection
            let builtinInstance = null

            if (builtinId === "builtin_vpn") {
                if (widgetModel?.vpnLoader) {
                    widgetModel.vpnLoader.active = true
                }
                builtinInstance = widgetModel.vpnBuiltinInstance
            }

            if (!builtinInstance || !builtinInstance.ccDetailContent) {
                return
            }

            pluginDetailLoader.sourceComponent = builtinInstance.ccDetailContent
            pluginDetailLoader.active = parent.height > 0
            return
        }

        if (root.expandedSection.startsWith("plugin_")) {
            const pluginId = root.expandedSection.replace("plugin_", "")
            const pluginComponent = PluginService.pluginWidgetComponents[pluginId]
            if (!pluginComponent) {
                return
            }

            pluginDetailInstance = pluginComponent.createObject(null)
            if (!pluginDetailInstance || !pluginDetailInstance.ccDetailContent) {
                if (pluginDetailInstance) {
                    pluginDetailInstance.destroy()
                    pluginDetailInstance = null
                }
                return
            }

            pluginDetailLoader.sourceComponent = pluginDetailInstance.ccDetailContent
            pluginDetailLoader.active = parent.height > 0
            return
        }

        if (root.expandedSection.startsWith("diskUsage_")) {
            coreDetailLoader.sourceComponent = diskUsageDetailComponent
            coreDetailLoader.active = parent.height > 0
            return
        }

        if (root.expandedSection.startsWith("brightnessSlider_")) {
            coreDetailLoader.sourceComponent = brightnessDetailComponent
            coreDetailLoader.active = parent.height > 0
            return
        }

        switch (root.expandedSection) {
        case "network":
        case "wifi": coreDetailLoader.sourceComponent = networkDetailComponent; break
        case "bluetooth": coreDetailLoader.sourceComponent = bluetoothDetailComponent; break
        case "audioOutput": coreDetailLoader.sourceComponent = audioOutputDetailComponent; break
        case "audioInput": coreDetailLoader.sourceComponent = audioInputDetailComponent; break
        case "battery": coreDetailLoader.sourceComponent = batteryDetailComponent; break
        default: return
        }

        coreDetailLoader.active = parent.height > 0
    }

    Component {
        id: networkDetailComponent
        NetworkDetail {}
    }

    Component {
        id: bluetoothDetailComponent
        BluetoothDetail {
            id: bluetoothDetail
            onShowCodecSelector: function(device) {
                if (root.bluetoothCodecSelector) {
                    root.bluetoothCodecSelector.show(device)
                    root.bluetoothCodecSelector.codecSelected.connect(function(deviceAddress, codecName) {
                        bluetoothDetail.updateDeviceCodecDisplay(deviceAddress, codecName)
                    })
                }
            }
        }
    }

    Component {
        id: audioOutputDetailComponent
        AudioOutputDetail {}
    }

    Component {
        id: audioInputDetailComponent
        AudioInputDetail {}
    }

    Component {
        id: batteryDetailComponent
        BatteryDetail {}
    }

    Component {
        id: diskUsageDetailComponent
        DiskUsageDetail {
            currentMountPath: root.expandedWidgetData?.mountPath || "/"
            instanceId: root.expandedWidgetData?.instanceId || ""
        }
    }

    Component {
        id: brightnessDetailComponent
        BrightnessDetail {
            initialDeviceName: root.expandedWidgetData?.deviceName || ""
            instanceId: root.expandedWidgetData?.instanceId || ""
            screenName: root.screenName
        }
    }
}