/*
 *   SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez <aleixpol@blue-systems.com>
 *   SPDX-FileCopyrightText: 2020 Linus Jahn <lnj@kaidan.im>
 *   SPDX-FileCopyrightText: 2020 Marco Martin <mart@kde.org
 *   SPDX-FileCopyrightText: 2022 Seshan Ravikumar <seshan10@me.com>
 *
 *   SPDX-License-Identifier: GPL-2.0-or-later
 */

import QtQuick 2.12
import QtQuick.Layouts 1.12
import QtQuick.Controls 2.8 as Controls

import org.kde.kirigami as Kirigami
import org.kde.coreaddons 1.0 as KCoreAddons

import org.kde.plasma.private.sessions 2.0
import org.kde.plasma.private.mobileshell as MobileShell
import org.kde.plasma.private.mobileshell.shellsettingsplugin as ShellSettings

Item {
    id: root
    readonly property int longAnimationDuration: MobileShell.Motion.duration(MobileShell.Motion.EffectsDefault)
    readonly property real backgroundDimOpacity: 0.6

    Kirigami.Theme.colorSet: Kirigami.Theme.Complementary
    Kirigami.Theme.inherit: false
    signal logoutRequested()
    signal haltRequested()
    signal suspendRequested(int spdMethod)
    signal rebootRequested()
    signal rebootRequested2(int opt)
    signal cancelRequested()
    signal lockScreenRequested()

    Controls.Action {
        onTriggered: root.cancelRequested()
        shortcut: "Escape"
    }

    Rectangle {
        id: blackOverlay
        anchors.fill: parent
        color: "black"
        opacity: 0
        z: opacity > 0 ? 1 : 0
    }

    Rectangle {
        id: background
        anchors.fill: parent
        color: Kirigami.Theme.backgroundColor
        opacity: 0
    }

    MouseArea {
        anchors.fill: parent
        onClicked: {
            closeAnim.execute(root.cancelRequested);
        }
    }

    Component.onCompleted: openAnim.restart()
    onVisibleChanged: {
        if (visible) {
            openAnim.restart()
        }
    }

    ParallelAnimation {
        id: openAnim
        running: true
        OpacityAnimator {
            target: buttons
            from: 0
            to: 1
            duration: root.longAnimationDuration
            easing.type: MobileShell.Motion.easing(MobileShell.Motion.EffectsDefault)
        }
        OpacityAnimator {
            target: background
            from: 0
            to: root.backgroundDimOpacity
            duration: root.longAnimationDuration
            easing.type: MobileShell.Motion.easing(MobileShell.Motion.EffectsDefault)
        }
    }

    SequentialAnimation {
        id: closeAnim
        running: false

        property bool closeToBlack: false
        property var callback
        function execute(call) {
            callback = call;
            closeAnim.restart();
        }
        ParallelAnimation {
            OpacityAnimator {
                target: buttons
                from: 1
                to: 0
                duration: root.longAnimationDuration
                easing.type: MobileShell.Motion.easing(MobileShell.Motion.EffectsDefault)
            }
            OpacityAnimator {
                target: background
                from: root.backgroundDimOpacity
                to: 0
                duration: root.longAnimationDuration
                easing.type: MobileShell.Motion.easing(MobileShell.Motion.EffectsDefault)
            }
            OpacityAnimator {
                target: blackOverlay
                from: 0
                to: closeAnim.closeToBlack ? 1 : 0
                duration: root.longAnimationDuration
                easing.type: MobileShell.Motion.easing(MobileShell.Motion.EffectsDefault)
            }
        }
        ScriptAction {
            script: {
                if (closeAnim.callback) {
                    closeAnim.callback();
                }
                buttons.opacity = 1;
                background.opacity = root.backgroundDimOpacity;
            }
        }
    }

    Item {
        id: buttons
        anchors.fill: parent
        opacity: 0

        ColumnLayout {
            anchors.centerIn: parent
            spacing: Kirigami.Units.gridUnit

            ActionButton {
                iconSource: "system-reboot"
                text: i18nd("plasma_lookandfeel_org.shift.mobile", "Restart")
                onClicked: {
                    closeAnim.closeToBlack = true;
                    closeAnim.execute(root.rebootRequested);
                }
            }

            ActionButton {
                iconSource: "system-shutdown"
                text: i18nd("plasma_lookandfeel_org.shift.mobile", "Shut Down")
                onClicked: {
                    closeAnim.closeToBlack = true;
                    closeAnim.execute(root.haltRequested);
                }
            }

            ActionButton {
                iconSource: "system-log-out"
                text: i18nd("plasma_lookandfeel_org.shift.mobile", "Log Out")
                visible: ShellSettings.Settings.allowLogout
                onClicked: {
                    closeAnim.closeToBlack = true;
                    closeAnim.execute(root.logoutRequested);
                }
            }
        }

        ActionButton {
            anchors {
                bottom: parent.bottom
                bottomMargin: Kirigami.Units.gridUnit
                horizontalCenter: parent.horizontalCenter
            }
            iconSource: "dialog-cancel"
            text: i18nd("plasma_lookandfeel_org.shift.mobile", "Cancel")
            onClicked: {
                closeAnim.closeToBlack = false;
                closeAnim.execute(root.cancelRequested);
            }
        }
    }
}
