// SPDX-FileCopyrightText: 2022 James Graham <james.h.graham@protonmail.com>
// SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL

import QtQuick 2.15
import QtQuick.Controls 2.15 as QQC2
import QtQuick.Layouts 1.15

import org.kde.kirigami 2.15 as Kirigami
import org.kde.kirigamiaddons.formcard 1.0 as FormCard
import org.kde.kitemmodels 1.0

import org.kde.neochat 1.0

FormCard.FormCardPage {
    id: root

    title: i18nc("@title:window", "Notifications")

    FormCard.FormCard {
        Layout.topMargin: Kirigami.Units.largeSpacing
        FormCard.FormCheckDelegate {
            text: i18n("Enable notifications for this account")
            description: i18n("Whether push notifications are generated by your Matrix server")
            checked: Controller.pushRuleModel.globalNotificationsEnabled
            enabled: Controller.pushRuleModel.globalNotificationsSet
            onToggled: {
                Controller.pushRuleModel.globalNotificationsEnabled = checked
            }
        }
    }

    FormCard.FormHeader {
        title: i18n("Room Notifications")
    }
    FormCard.FormCard {
        Repeater {
            model: KSortFilterProxyModel {
                sourceModel: Controller.pushRuleModel
                filterRowCallback: function(source_row, source_parent) {
                    let sectionRole = sourceModel.data(sourceModel.index(source_row, 0, source_parent), PushRuleModel.SectionRole)
                    return sectionRole == PushNotificationSection.Room;
                }
            }

            delegate: ruleDelegate
        }
    }

    FormCard.FormHeader {
        title: i18n("@Mentions")
    }
    FormCard.FormCard {
        Repeater {
            model: KSortFilterProxyModel {
                sourceModel: Controller.pushRuleModel
                filterRowCallback: function(source_row, source_parent) {
                    let sectionRole = sourceModel.data(sourceModel.index(source_row, 0, source_parent), PushRuleModel.SectionRole)
                    return sectionRole == PushNotificationSection.Mentions;
                }
            }

            delegate: ruleDelegate
        }
    }

    FormCard.FormHeader {
        title: i18n("Keywords")
    }
    FormCard.FormCard {
        Repeater {
            model: KSortFilterProxyModel {
                sourceModel: Controller.pushRuleModel

                filterRowCallback: function(source_row, source_parent) {
                    let sectionRole = sourceModel.data(sourceModel.index(source_row, 0, source_parent), PushRuleModel.SectionRole)
                    return sectionRole == PushNotificationSection.Keywords;
                }
            }

            delegate: ruleDelegate
        }
        FormCard.AbstractFormDelegate {
            Layout.fillWidth: true

            contentItem : RowLayout {
                Kirigami.ActionTextField {
                    id: keywordAddField

                    Layout.fillWidth: true

                    placeholderText: i18n("Keyword…")
                    enabled: NotificationsManager.keywordNotificationAction !== PushNotificationAction.Unknown

                    rightActions: Kirigami.Action {
                        icon.name: "edit-clear"
                        visible: keywordAddField.text.length > 0
                        onTriggered: {
                            keywordAddField.text = ""
                        }
                    }

                    onAccepted: {
                        Controller.pushRuleModel.addKeyword(keywordAddField.text)
                        keywordAddField.text = ""
                    }
                }
                QQC2.Button {
                    id: addButton

                    text: i18n("Add keyword")
                    Accessible.name: text
                    icon.name: "list-add"
                    display: QQC2.AbstractButton.IconOnly
                    enabled: NotificationsManager.keywordNotificationAction !== PushNotificationAction.Unknown

                    onClicked: {
                        Controller.pushRuleModel.addKeyword(keywordAddField.text)
                        keywordAddField.text = ""
                    }

                    QQC2.ToolTip {
                        text: addButton.text
                        delay: Kirigami.Units.toolTipDelay
                    }
                }
            }
        }
    }

    FormCard.FormHeader {
        title: i18n("Invites")
    }
    FormCard.FormCard {
        Repeater {
            model: KSortFilterProxyModel {
                sourceModel: Controller.pushRuleModel
                filterRowCallback: function(source_row, source_parent) {
                    let sectionRole = sourceModel.data(sourceModel.index(source_row, 0, source_parent), PushRuleModel.SectionRole)
                    return sectionRole == PushNotificationSection.Invites;
                }
            }

            delegate: ruleDelegate
        }
    }

    FormCard.FormHeader {
        title: i18n("Unknown")
        visible: unknownModel.rowCount() > 0
    }
    FormCard.FormCard {
        visible: unknownModel.rowCount() > 0

        Repeater {
            model: KSortFilterProxyModel {
                id: unknownModel
                sourceModel: Controller.pushRuleModel
                filterRowCallback: function(source_row, source_parent) {
                    let sectionRole = sourceModel.data(sourceModel.index(source_row, 0, source_parent), PushRuleModel.SectionRole)
                    return sectionRole == PushNotificationSection.Unknown;
                }
            }

            delegate: ruleDelegate
        }
    }

    property Component ruleDelegate: Component {
        id: ruleDelegate
        NotificationRuleItem {
            onDeleteRule: {
                Controller.pushRuleModel.removeKeyword(id)
            }
            onActionChanged: (action) => Controller.pushRuleModel.setPushRuleAction(id, action)
        }
    }
}
