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

BasePill {
    id: root

    property bool isActive: false
    readonly property bool hasUpdates: SystemUpdateService.updateCount > 0
    readonly property bool isChecking: SystemUpdateService.isChecking
    readonly property bool shouldHide: SettingsData.updaterHideWidget && !hasUpdates && !isChecking && !SystemUpdateService.hasError

    opacity: shouldHide ? 0 : 1

    states: [
        State {
            name: "hidden_horizontal"
            when: root.shouldHide && !isVerticalOrientation
            PropertyChanges {
                target: root
                width: 0
            }
        },
        State {
            name: "hidden_vertical"
            when: root.shouldHide && isVerticalOrientation
            PropertyChanges {
                target: root
                height: 0
            }
        }
    ]

    transitions: [
        Transition {
            NumberAnimation {
                properties: "width,height"
                duration: Theme.shortDuration
                easing.type: Theme.standardEasing
            }
        }
    ]

    Behavior on opacity {
        NumberAnimation {
            duration: Theme.shortDuration
            easing.type: Theme.standardEasing
        }
    }

    Ref {
        service: SystemUpdateService
    }

    content: Component {
        Item {
            implicitWidth: root.isVerticalOrientation ? root.widgetThickness : updaterIcon.implicitWidth
            implicitHeight: root.widgetThickness

            DankIcon {
                id: statusIcon
                anchors.centerIn: parent
                visible: root.isVerticalOrientation
                name: {
                    if (root.isChecking)
                        return "refresh";
                    if (SystemUpdateService.hasError)
                        return "error";
                    if (root.hasUpdates)
                        return "system_update_alt";
                    return "check_circle";
                }
                size: Theme.barIconSize(root.barThickness, -4, root.barConfig?.maximizeWidgetIcons, root.barConfig?.iconScale)
                color: {
                    if (SystemUpdateService.hasError)
                        return Theme.error;
                    if (root.hasUpdates)
                        return Theme.primary;
                    return root.isActive ? Theme.primary : Theme.surfaceText;
                }

                RotationAnimation {
                    id: rotationAnimation
                    target: statusIcon
                    property: "rotation"
                    from: 0
                    to: 360
                    duration: 1000
                    running: root.isChecking
                    loops: Animation.Infinite

                    onRunningChanged: {
                        if (!running) {
                            statusIcon.rotation = 0;
                        }
                    }
                }
            }

            Rectangle {
                width: 8
                height: 8
                radius: 4
                color: Theme.error
                anchors.right: parent.right
                anchors.top: parent.top
                anchors.rightMargin: (barConfig?.removeWidgetPadding ?? false) ? 0 : 6
                anchors.topMargin: (barConfig?.removeWidgetPadding ?? false) ? 0 : 6
                visible: root.isVerticalOrientation && root.hasUpdates && !root.isChecking
            }

            Row {
                id: updaterIcon
                anchors.centerIn: parent
                spacing: Theme.spacingXS
                visible: !root.isVerticalOrientation

                DankIcon {
                    id: statusIconHorizontal
                    anchors.verticalCenter: parent.verticalCenter
                    name: {
                        if (root.isChecking)
                            return "refresh";
                        if (SystemUpdateService.hasError)
                            return "error";
                        if (root.hasUpdates)
                            return "system_update_alt";
                        return "check_circle";
                    }
                    size: Theme.barIconSize(root.barThickness, -4, root.barConfig?.maximizeWidgetIcons, root.barConfig?.iconScale)
                    color: {
                        if (SystemUpdateService.hasError)
                            return Theme.error;
                        if (root.hasUpdates)
                            return Theme.primary;
                        return root.isActive ? Theme.primary : Theme.surfaceText;
                    }

                    RotationAnimation {
                        id: rotationAnimationHorizontal
                        target: statusIconHorizontal
                        property: "rotation"
                        from: 0
                        to: 360
                        duration: 1000
                        running: root.isChecking
                        loops: Animation.Infinite

                        onRunningChanged: {
                            if (!running) {
                                statusIconHorizontal.rotation = 0;
                            }
                        }
                    }
                }

                StyledText {
                    id: countText
                    anchors.verticalCenter: parent.verticalCenter
                    text: SystemUpdateService.updateCount.toString()
                    font.pixelSize: Theme.barTextSize(root.barThickness, root.barConfig?.fontScale, root.barConfig?.maximizeWidgetText)
                    color: Theme.widgetTextColor
                    visible: root.hasUpdates && !root.isChecking
                }
            }
        }
    }

    MouseArea {
        z: 1
        anchors.fill: parent
        cursorShape: Qt.PointingHandCursor
        onPressed: mouse => {
            root.triggerRipple(this, mouse.x, mouse.y);
            if (popoutTarget && popoutTarget.setTriggerPosition) {
                const globalPos = root.visualContent.mapToItem(null, 0, 0);
                const currentScreen = parentScreen || Screen;
                const barPosition = root.axis?.edge === "left" ? 2 : (root.axis?.edge === "right" ? 3 : (root.axis?.edge === "top" ? 0 : 1));
                const pos = SettingsData.getPopupTriggerPosition(globalPos, currentScreen, barThickness, root.visualWidth, root.barSpacing, barPosition, root.barConfig);
                popoutTarget.setTriggerPosition(pos.x, pos.y, pos.width, section, currentScreen, barPosition, barThickness, root.barSpacing, root.barConfig);
            }
            root.clicked();
        }
    }
}
