// Copyright (c) 2023 Proton AG
//
// This file is part of Proton Mail Bridge.
//
// Proton Mail Bridge is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Proton Mail Bridge is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Proton Mail Bridge. If not, see <https://www.gnu.org/licenses/>.


import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import QtQuick.Controls.impl

import Proton

Item {
    id:root

    property ColorScheme colorScheme
    property var user
    property string address

    signal dismissed()
    signal finished()

    implicitHeight: children[0].implicitHeight
    implicitWidth: children[0].implicitWidth


    ListModel {
        id: clients
        property string name : "Apple Mail"
        property string iconSource : "/qml/icons/ic-apple-mail.svg"
        property bool haveAutoSetup: true
        property string link: "https://proton.me/support/protonmail-bridge-clients-apple-mail"

        Component.onCompleted : {
            if (Backend.goos == "darwin") {
                append({
                    "name"          : "Apple Mail",
                    "iconSource"    : "/qml/icons/ic-apple-mail.svg",
                    "haveAutoSetup" : true,
                    "link"          : "https://proton.me/support/protonmail-bridge-clients-apple-mail"
                })
                append({
                    "name"          : "Microsoft Outlook",
                    "iconSource"    : "/qml/icons/ic-microsoft-outlook.svg",
                    "haveAutoSetup" : false,
                    "link"          : "https://proton.me/support/protonmail-bridge-clients-macos-outlook-2019"
                })
            }
            if (Backend.goos == "windows") {
                append({
                    "name"          : "Microsoft Outlook",
                    "iconSource"    : "/qml/icons/ic-microsoft-outlook.svg",
                    "haveAutoSetup" : false,
                    "link"          : "https://proton.me/support/protonmail-bridge-clients-windows-outlook-2019"
                })
            }

            append({
                "name"          : "Mozilla Thunderbird",
                "iconSource"    : "/qml/icons/ic-mozilla-thunderbird.svg",
                "haveAutoSetup" : false,
                "link"          : "https://proton.me/support/protonmail-bridge-clients-windows-thunderbird"
            })

            append({
                "name"          : "Other",
                "iconSource"    : "/qml/icons/ic-other-mail-clients.svg",
                "haveAutoSetup" : false,
                "link"          : "https://proton.me/support/protonmail-bridge-configure-client"
            })

        }
    }

    Rectangle {
        anchors.fill: root
        color: root.colorScheme.background_norm
    }

    StackLayout {
        id: guidePages
        anchors.fill: parent
        anchors.leftMargin: 80
        anchors.rightMargin: 80
        anchors.topMargin: 30
        anchors.bottomMargin: 70


        ColumnLayout { // 0: Client selection
            id: clientView
            Layout.fillHeight: true

            property int columnWidth: 268

            spacing: 8

            Label {
                colorScheme: root.colorScheme
                text: qsTr("Setting up email client")
                type: Label.LabelType.Heading
            }

            Label {
                colorScheme: root.colorScheme
                text: address
                color: root.colorScheme.text_weak
                type: Label.LabelType.Lead
            }

            RowLayout {
                Layout.topMargin: 32-clientView.spacing
                spacing: 24

                ColumnLayout {
                    id: clientColumn
                    Layout.alignment: Qt.AlignTop

                    Label {
                        id: labelA
                        colorScheme: root.colorScheme
                        text: qsTr("Choose an email client")
                        type: Label.LabelType.Body_semibold
                    }

                    ListView {
                        id: clientList
                        Layout.fillHeight: true
                        width: clientView.columnWidth

                        model: clients

                        highlight: Rectangle {
                            color: root.colorScheme.interaction_default_active
                            radius: ProtonStyle.context_item_radius
                        }

                        delegate: Item {
                            implicitWidth: clientRow.width
                            implicitHeight: clientRow.height

                            ColumnLayout {
                                id: clientRow
                                width: clientList.width

                                RowLayout {
                                    Layout.topMargin: 12
                                    Layout.bottomMargin: 12
                                    Layout.leftMargin: 16
                                    Layout.rightMargin: 16

                                    ColorImage {
                                        source: model.iconSource
                                        height: 36
                                        sourceSize.height: 36
                                    }

                                    Label {
                                        colorScheme: root.colorScheme
                                        Layout.leftMargin: 12
                                        text: model.name
                                        type: Label.LabelType.Body
                                    }
                                }

                                Rectangle {
                                    Layout.fillWidth: true
                                    Layout.preferredHeight: 1
                                    color: root.colorScheme.border_weak
                                }
                            }

                            MouseArea {
                                anchors.fill: parent
                                cursorShape: Qt.PointingHandCursor
                                onClicked: {
                                    clientList.currentIndex = index
                                    if (!model.haveAutoSetup) {
                                        root.setupAction(1,index)
                                    }
                                }
                            }
                        }
                    }
                }

                ColumnLayout {
                    id: actionColumn
                    visible: clientList.currentIndex >= 0 && clients.get(clientList.currentIndex).haveAutoSetup
                    Layout.alignment: Qt.AlignTop

                    Label {
                        colorScheme: root.colorScheme
                        text: qsTr("Choose configuration mode")
                        type: Label.LabelType.Body_semibold
                    }

                    ListView {
                        id: actionList
                        Layout.fillHeight: true
                        width: clientView.columnWidth

                        model: [
                            qsTr("Configure automatically"),
                            qsTr("Configure manually"),
                        ]

                        highlight: Rectangle {
                            color: root.colorScheme.interaction_default_active
                            radius: ProtonStyle.context_item_radius
                        }

                        delegate: Item {
                            implicitWidth: children[0].width
                            implicitHeight: children[0].height

                            ColumnLayout {
                                width: actionList.width

                                Label {
                                    Layout.topMargin: 20
                                    Layout.bottomMargin: 20
                                    Layout.leftMargin: 16
                                    Layout.rightMargin: 16
                                    colorScheme: root.colorScheme
                                    text: modelData
                                    type: Label.LabelType.Body
                                }

                                Rectangle {
                                    Layout.fillWidth: true
                                    Layout.preferredHeight: 1
                                    color: root.colorScheme.border_weak
                                }
                            }

                            MouseArea {
                                anchors.fill: parent
                                cursorShape: Qt.PointingHandCursor
                                onClicked: {
                                    actionList.currentIndex = index
                                    root.setupAction(index,clientList.currentIndex)
                                }
                            }
                        }
                    }
                }
            }

            Item { Layout.fillHeight: true }

            Button {
                colorScheme: root.colorScheme
                text: qsTr("Set up later")
                flat: true

                onClicked: {
                    root.setupAction(-1,-1)
                    if (user) {
                        user.setupGuideSeen = true
                    }
                    root.dismissed()
                }
            }
        }
    }

    function setupAction(actionID,clientID){
        if (user) {
            user.setupGuideSeen = true
        }

        switch (actionID) {
            case -1: root.dismissed(); break; // dismiss
            case 0: // automatic
            if (user) {
                switch (clientID) {
                    case 0:
                    root.user.configureAppleMail(root.address)
                    break;
                }
            }
            root.finished()
            break;
            case 1: // manual
            var clientObj = clients.get(clientID)
            if (clientObj != undefined && clientObj.link != "" ) {
                Qt.openUrlExternally(clientObj.link)
            } else {
                console.log("unexpected client index", actionID, clientID)
            }
            root.finished();
            break;
            default:
            console.log("unexpected client setup action", actionID, clientID)
        }
    }

    function reset(){
        guidePages.currentIndex = 0
        clientList.currentIndex = -1
        actionList.currentIndex = -1
    }
}
