// SPDX-License-Identifier: LGPL-3.0-or-later

import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12
import "../.."
import "../../Base"
import "../../Base/Buttons"
import "../../ShortcutBundles"

HListView {
    id: root

    property string userId

    property bool enableFlickShortcuts:
        SwipeView ? SwipeView.isCurrentItem : true

    // {model.id: {notify, highlight, bubble, sound, urgency_hint}}
    property var pendingEdits: ({})
    property string saveFutureId: ""

    function takeFocus() {
        // deviceList.headerItem.exportButton.forceActiveFocus() TODO
    }

    function save() {
        const args = []

        for (const [modelId, kwargs] of Object.entries(pendingEdits)) {
            if (! model.find(modelId)) continue  // pushrule was deleted

            const [kind, rule_id] = JSON.parse(modelId)
            args.push(Object.assign({}, {kind, rule_id}, kwargs))
        }

        saveFutureId = py.callClientCoro(
            userId,
            "mass_tweak_pushrules_actions",
            args,
            () => {
                if (! root) return
                saveFutureId = ""
                pendingEdits = {}
            }
        )
    }


    clip: true
    model: ModelStore.get(userId, "pushrules")
    implicitHeight: Math.min(window.height, contentHeight + bottomMargin)

    header: HColumnLayout {
        width: root.width

        HLoader {
            source: "../../Base/HBusyIndicator.qml"
            active: root.model.count === 0
            opacity: active ? 1 : 0
            visible: opacity > 0

            Behavior on opacity { HNumberAnimation {} }

            Layout.alignment: Qt.AlignCenter
            Layout.topMargin: theme.spacing
            Layout.bottomMargin: Layout.topMargin
        }
    }

    section.property: "kind"
    section.delegate: HRowLayout {
        width: root.width

        HLabel {
            padding: theme.spacing
            font.pixelSize: theme.fontSize.big
            text:
                section === "override" ? qsTr("High priority general rules") :
                section === "content" ? qsTr("Message content rules") :
                section === "room" ? qsTr("Room rules") :
                section === "sender" ? qsTr("Sender rules") :
                qsTr("Low priority general rules")

            Layout.fillWidth: true
        }

        PositiveButton {
            readonly property var newRule: ({
                id: '[section, ""]',
                kind: section,
                rule_id: "",
                order: 0,
                default: false,
                enabled: true,
                conditions: "[]",
                pattern: "",
                actions: "[]",
                notify: false,
                highlight: false,
                bubble: false,
                sound: false,
                urgency_hint: false,
            })

            backgroundColor: "transparent"
            icon.name: "pushrule-add"
            iconItem.small: true
            Layout.fillHeight: true
            Layout.fillWidth: false
            onClicked: window.makePopup(
                "Popups/PushRuleSettingsPopup/PushRuleSettingsPopup.qml",
                {userId: root.userId, rule: newRule, ruleExists: false},
            )
        }
    }

    delegate: PushRuleDelegate {
        page: root
        width: root.width
    }

    onPendingEditsChanged:
        utils.isEmptyObject(pendingEdits) ?
        autoSaveTimer.stop() :
        autoSaveTimer.restart()

    Component.onDestruction: ! utils.isEmptyObject(pendingEdits) && save()

    Timer {
        id: autoSaveTimer
        interval: 3000
        onTriggered: root.save()
    }

    FlickShortcuts {
        flickable: root
        active: ! mainUI.debugConsole.visible && root.enableFlickShortcuts
    }
}
