// Copyright (C) 2021 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0

import QtQuick 2.15
import QtQuick.Templates 2.15 as T
import StudioTheme 1.0 as StudioTheme

Row {
    id: root

    signal originSelectorClicked(string value)
    property alias origin: myButton.origin
    property variant backendValue

    onOriginSelectorClicked: function(value) {
        if (root.enabled)
            root.backendValue.setEnumeration("Item", value)
    }

    Connections {
        target: modelNodeBackend
        function onSelectionChanged() { originPopup.close() }
    }

    ExtendedFunctionLogic {
        id: extFuncLogic
        backendValue: root.backendValue
    }

    ColorLogic {
        id: colorLogic
        backendValue: root.backendValue
        onValueFromBackendChanged: {
            if (!root.backendValue)
                return

            var enumString = root.backendValue.enumeration
            if (enumString === "")
                enumString = root.backendValue.value

            root.origin = enumString === undefined ? "Center" : enumString
        }
    }

    ActionIndicator {
        id: actionIndicator
        __parentControl: myButton
        x: 0
        y: 0
        width: actionIndicator.visible ? myButton.__actionIndicatorWidth : 0
        height: actionIndicator.visible ? myButton.__actionIndicatorHeight : 0

        icon.color: extFuncLogic.color
        icon.text: extFuncLogic.glyph
        onClicked: extFuncLogic.show()
        forceVisible: extFuncLogic.menuVisible
    }

    T.AbstractButton {
        id: myButton

        function originSelectorClicked(value) { root.originSelectorClicked(value) }

        property string origin: "Center"

        // This property is used to indicate the global hover state
        property bool hover: myButton.hovered && root.enabled

        property alias backgroundVisible: buttonBackground.visible
        property alias backgroundRadius: buttonBackground.radius

        property alias actionIndicator: actionIndicator

        property alias actionIndicatorVisible: actionIndicator.visible
        property real __actionIndicatorWidth: StudioTheme.Values.actionIndicatorWidth
        property real __actionIndicatorHeight: StudioTheme.Values.actionIndicatorHeight

        implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
                                implicitContentWidth + leftPadding + rightPadding)
        implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
                                 implicitContentHeight + topPadding + bottomPadding)
        height: StudioTheme.Values.height
        width: StudioTheme.Values.height
        z: myButton.checked ? 10 : 3
        activeFocusOnTab: false

        onClicked: originPopup.opened ? originPopup.close() : originPopup.open()

        background: Rectangle {
            id: buttonBackground
            color: myButton.checked ? StudioTheme.Values.themeControlBackgroundInteraction
                                    : StudioTheme.Values.themeControlBackground
            border.color: myButton.checked ? StudioTheme.Values.themeInteraction
                                           : StudioTheme.Values.themeControlOutline
            border.width: StudioTheme.Values.border
        }

        indicator: OriginIndicator {
            myControl: myButton
            x: 0
            y: 0
            implicitWidth: myButton.width
            implicitHeight: myButton.height
        }

        T.Popup {
            id: originPopup

            x: 50
            y: 0

            width: (4 * grid.spacing) + (3 * StudioTheme.Values.height)
            height: (4 * grid.spacing) + (3 * StudioTheme.Values.height)

            padding: StudioTheme.Values.border
            margins: 0 // If not defined margin will be -1

            closePolicy: T.Popup.CloseOnPressOutside | T.Popup.CloseOnPressOutsideParent
                         | T.Popup.CloseOnEscape | T.Popup.CloseOnReleaseOutside
                         | T.Popup.CloseOnReleaseOutsideParent

            contentItem: Item {
                Grid {
                    id: grid

                    x: 5
                    y: 5

                    rows: 3
                    columns: 3
                    spacing: 5 // TODO spacingvalue in Values.qml

                    OriginSelector { myControl: myButton; value: "TopLeft" }
                    OriginSelector { myControl: myButton; value: "Top" }
                    OriginSelector { myControl: myButton; value: "TopRight" }
                    OriginSelector { myControl: myButton; value: "Left" }
                    OriginSelector { myControl: myButton; value: "Center" }
                    OriginSelector { myControl: myButton; value: "Right" }
                    OriginSelector { myControl: myButton; value: "BottomLeft" }
                    OriginSelector { myControl: myButton; value: "Bottom" }
                    OriginSelector { myControl: myButton; value: "BottomRight" }
                }
            }

            background: Rectangle {
                color: StudioTheme.Values.themeControlBackground
                border.color: StudioTheme.Values.themeInteraction
                border.width: StudioTheme.Values.border
            }

            enter: Transition {}
            exit: Transition {}
        }

        states: [
            State {
                name: "default"
                when: myButton.enabled && !myButton.hover && !actionIndicator.hover
                      && !myButton.pressed && !originPopup.opened
                PropertyChanges {
                    target: buttonBackground
                    color: StudioTheme.Values.themeControlBackground
                }
                PropertyChanges {
                    target: myButton
                    z: 3
                }
            },
            State {
                name: "globalHover"
                when: actionIndicator.hover && !myButton.pressed && !originPopup.opened
                      && root.enabled
                PropertyChanges {
                    target: buttonBackground
                    color: StudioTheme.Values.themeControlBackgroundGlobalHover
                    border.color: StudioTheme.Values.themeControlOutline
                }
            },
            State {
                name: "hover"
                when: myButton.hover && !actionIndicator.hover && !myButton.pressed
                      && !originPopup.opened && root.enabled
                PropertyChanges {
                    target: buttonBackground
                    color: StudioTheme.Values.themeControlBackgroundHover
                    border.color: StudioTheme.Values.themeControlOutline
                }
            },
            State {
                name: "press"
                when: myButton.hover && myButton.pressed && !originPopup.opened
                PropertyChanges {
                    target: buttonBackground
                    color: StudioTheme.Values.themeControlBackgroundInteraction
                    border.color: StudioTheme.Values.themeInteraction
                }
                PropertyChanges {
                    target: myButton
                    z: 10
                }
            },
            State {
                name: "disable"
                when: !myButton.enabled
                PropertyChanges {
                    target: buttonBackground
                    color: StudioTheme.Values.themeControlBackgroundDisabled
                    border.color: StudioTheme.Values.themeControlOutlineDisabled
                }
            }
        ]
    }
}
