/*
 * Copyright (C) 2020 by Savoir-faire Linux
 * Author: Yang Wang <yang.wang@savoirfairelinux.com>
 *
 * This program 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.
 *
 * This program 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 this program.  If not, see <https://www.gnu.org/licenses/>.
 */

import QtQuick 2.14
import QtQuick.Window 2.14
import QtQuick.Controls 1.4 as CT
import QtQuick.Controls 2.14
import QtQuick.Controls.Universal 2.12
import QtQuick.Layouts 1.3
import QtGraphicalEffects 1.14
import net.jami.Models 1.0

import "../commoncomponents"
import "../constant"
import "components"

Window {
    id: wizardViewWindow

    enum Mode {
        CREATE,
        IMPORT,
        MIGRATE,
        CREATESIP,
        CONNECTMANAGER
    }

    enum NameRegistrationState {
        BLANK,
        INVALID,
        TAKEN,
        FREE,
        SEARCHING
    }

    property int layoutWidth: 768
    property int layoutHeight: 768
    property int textFontSize: 9
    property int wizardMode: WizardView.CREATE
    property int addedAccountIndex: -1
    property bool registrationStateOk: false
    property string fileToImport: ""
    property string registedName: ""

    property var inputParaObject: ({})

    /*
     * signal to redirect the page to main view
     */
    signal needToShowMainViewWindow(int accountIndex)
    signal wizardViewIsClosed

    title: "Jami"
    visible: true
    width: layoutWidth
    height: layoutHeight

    onClosing: {
        close.accepted = false
        changePageQML(controlPanelStackView.welcomePageStackId)
        wizardViewWindow.hide()
        wizardViewWindow.wizardViewIsClosed()
    }

    Component.onCompleted: {
        changePageQML(
                    controlPanelStackView.welcomePageStackId)
    }

    Connections{
        target: ClientWrapper.accountAdaptor

        function onAccountAdded(showBackUp, index) {
            addedAccountIndex = index
            if (showBackUp) {
                changePageQML(controlPanelStackView.backupKeysPageId)
            } else {
                wizardViewWindow.hide()
                changePageQML(controlPanelStackView.welcomePageStackId)
                needToShowMainViewWindow(addedAccountIndex)
                ClientWrapper.lrcInstance.accountListChanged()
            }
        }

        // reportFailure
        function onReportFailure() {
            reportFailureQML()
        }
    }

    Connections {
        id: registeredNameFoundConnection
        target: ClientWrapper.nameDirectory
        enabled: false

        function onRegisteredNameFound(status, address, name) {
            slotRegisteredNameFound(status, address, name)
        }
    }

    // failure redirect timer and qml object holder
    Timer {
        id: failureRedirectPageTimer

        repeat: false
        triggeredOnStart: false
        interval: 1000

        onTriggered: {
            spinnerPage.successState = true
        }
    }

    function reportFailureQML() {
        spinnerPage.successState = false
        failureRedirectPageTimer.restart()
    }

    function createAccountQML() {
        switch (wizardMode) {
        case WizardView.CONNECTMANAGER:
            ClientWrapper.accountAdaptor.createJAMSAccount(inputParaObject)
            break
        case WizardView.CREATE:
        case WizardView.IMPORT:
            ClientWrapper.accountAdaptor.createJamiAccount(registedName,
                                                           inputParaObject,
                                                           createAccountPage.boothImgBase64,
                                                           (wizardMode === WizardView.CREATE))
            break
        default:
            ClientWrapper.accountAdaptor.createSIPAccount(inputParaObject,createSIPAccountPage.boothImgBase64)
        }

        changePageQML(controlPanelStackView.spinnerPageId)
        update()
    }

    function slotRegisteredNameFound(status, address, name) {
        if (name.length < 3) {
            registrationStateOk = false
            createAccountPage.nameRegistrationUIState = WizardView.INVALID
        } else if (registedName === name) {
            switch (status) {
            case NameDirectory.LookupStatus.NOT_FOUND:
            case NameDirectory.LookupStatus.ERROR:
                registrationStateOk = true
                createAccountPage.nameRegistrationUIState = WizardView.FREE
                break
            case NameDirectory.LookupStatus.INVALID_NAME:
            case NameDirectory.LookupStatus.INVALID:
                registrationStateOk = false
                createAccountPage.nameRegistrationUIState = WizardView.INVALID
                break
            case NameDirectory.LookupStatus.SUCCESS:
                registrationStateOk = false
                createAccountPage.nameRegistrationUIState = WizardView.TAKEN
                break
            }
        }
        validateWizardProgressionQML()
    }

    // function to set up nav bar visibility and the three buttons' visibiliy
    function setNavBarVisibility(navVisible, back) {
        navBarView.visible = (navVisible == true) || (back == true)
        btnNext.visible = (navVisible == true)
        btnPevious.visible = (navVisible == true)
        btnBack.visible = (back == true)
                && (ClientWrapper.utilsAdaptor.getAccountListSize() != 0)
    }

    function processWizardInformationsQML() {
        inputParaObject = {}
        switch (wizardMode) {
        case WizardView.CREATE:
            spinnerPage.progressLabelEditText = qsTr(
                        "Generating your Jami account...")
            inputParaObject["alias"] = createAccountPage.text_fullNameEditAlias

            inputParaObject["password"] = createAccountPage.text_confirmPasswordEditAlias

            createAccountPage.clearAllTextFields()
            break
        case WizardView.IMPORT:
            registedName = ""
            spinnerPage.progressLabelEditText = qsTr(
                        "Importing account archive...")
            // should only work in import from backup page or import from device page
            if (controlPanelStackView.currentIndex
                    == controlPanelStackView.importFromBackupPageId) {
                inputParaObject["password"]
                        = importFromBackupPage.text_passwordFromDeviceAlias
                importFromBackupPage.clearAllTextFields()
            } else if (controlPanelStackView.currentIndex
                       == controlPanelStackView.importFromDevicePageId) {
                inputParaObject["archivePin"] = importFromBackupPage.text_pinFromDeviceAlias
                inputParaObject["password"]
                        = importFromDevicePage.text_passwordFromDeviceAlias
                importFromDevicePage.clearAllTextFields()
            }
            break
        case WizardView.MIGRATE:
            spinnerPage.progressLabelEditText = qsTr(
                        "Migrating your Jami account...")
            break
        case WizardView.CREATESIP:
            spinnerPage.progressLabelEditText = qsTr(
                        "Generating your SIP account...")
            if (createSIPAccountPage.text_sipFullNameEditAlias.length == 0) {
                inputParaObject["alias"] = "SIP"
            } else {
                inputParaObject["alias"] = createSIPAccountPage.text_sipFullNameEditAlias
            }

            inputParaObject["hostname"] = createSIPAccountPage.text_sipServernameEditAlias
            inputParaObject["username"] = createSIPAccountPage.text_sipUsernameEditAlias
            inputParaObject["password"] = createSIPAccountPage.text_sipPasswordEditAlias
            inputParaObject["proxy"] = createSIPAccountPage.text_sipProxyEditAlias

            break
        case WizardView.CONNECTMANAGER:
            spinnerPage.progressLabelEditText = qsTr(
                        "Connecting to account manager...")
            inputParaObject["username"]
                    = connectToAccountManagerPage.text_usernameManagerEditAlias
            inputParaObject["password"]
                    = connectToAccountManagerPage.text_passwordManagerEditAlias
            inputParaObject["manager"]
                    = connectToAccountManagerPage.text_accountManagerEditAlias
            connectToAccountManagerPage.clearAllTextFields()
            break
        }

        inputParaObject["archivePath"] = fileToImport

        if (!("archivePin" in inputParaObject)) {
            inputParaObject["archivePath"] = ""
        }

        // change page to spinner page
        changePageQML(controlPanelStackView.spinnerPageId)
        //create account
        createAccountQML()
        ClientWrapper.utilsAdaptor.createStartupLink()
    }

    function changePageQML(pageIndex) {
        if (pageIndex == controlPanelStackView.spinnerPageId) {
            setNavBarVisibility(false)
        }
        controlPanelStackView.currentIndex = pageIndex
        if (pageIndex == controlPanelStackView.welcomePageStackId) {
            fileToImport = ""
            setNavBarVisibility(false, true)
            createAccountPage.nameRegistrationUIState = WizardView.BLANK
        } else if (pageIndex == controlPanelStackView.createAccountPageId) {
            createAccountPage.initializeOnShowUp()
            setNavBarVisibility(true)
            // connection between register name found and its slot
            registeredNameFoundConnection.enabled = true
            // validate wizard progression
            validateWizardProgressionQML()
            // start photobooth
            createAccountPage.startBooth()
        } else if (pageIndex == controlPanelStackView.createSIPAccountPageId) {
            createSIPAccountPage.initializeOnShowUp()
            setNavBarVisibility(true)
            btnNext.enabled = true
            // start photo booth
            createSIPAccountPage.startBooth()
        } else if (pageIndex == controlPanelStackView.importFromDevicePageId) {
            importFromDevicePage.initializeOnShowUp()
            setNavBarVisibility(true)
        } else if (pageIndex == controlPanelStackView.spinnerPageId) {
            createAccountPage.nameRegistrationUIState = WizardView.BLANK
            createAccountPage.isToSetPassword_checkState_choosePasswordCheckBox = false
        } else if (pageIndex == controlPanelStackView.connectToAccountManagerPageId) {
            setNavBarVisibility(true)
            connectToAccountManagerPage.initializeOnShowUp()
            btnNext.enabled = false
        } else if (pageIndex == controlPanelStackView.importFromBackupPageId) {
            setNavBarVisibility(true)
            importFromBackupPage.clearAllTextFields()
            fileToImport = ""
            btnNext.enabled = false
        } else if (pageIndex == controlPanelStackView.backupKeysPageId) {
            setNavBarVisibility(false)
        }
    }

    function validateWizardProgressionQML() {
        if (controlPanelStackView.currentIndex
                == controlPanelStackView.importFromDevicePageId) {
            var validPin = !(importFromDevicePage.text_pinFromDeviceAlias.length == 0)
            btnNext.enabled = validPin
            return
        } else if (controlPanelStackView.currentIndex
                   == controlPanelStackView.connectToAccountManagerPageId) {
            var validUsername = !(connectToAccountManagerPage.text_usernameManagerEditAlias.length == 0)
            var validPassword = !(connectToAccountManagerPage.text_passwordManagerEditAlias.length == 0)
            var validManager = !(connectToAccountManagerPage.text_accountManagerEditAlias.length == 0)
            btnNext.enabled = validUsername && validPassword
                    && validManager
            return
        } else if (controlPanelStackView.currentIndex
                   == controlPanelStackView.importFromBackupPageId) {
            var validImport = !(fileToImport.length == 0)
            btnNext.enabled = validImport
            return
        }

        var usernameOk = !createAccountPage.checkState_signUpCheckboxAlias
                || (createAccountPage.checkState_signUpCheckboxAlias
                    && !(registedName.length == 0)
                    && (registedName == createAccountPage.text_usernameEditAlias)
                    && (registrationStateOk == true))
        var passwordOk = (createAccountPage.text_passwordEditAlias
                          == createAccountPage.text_confirmPasswordEditAlias)

        // set password status label
        if (passwordOk
                && !(createAccountPage.text_passwordEditAlias.length == 0)) {
            createAccountPage.displayState_passwordStatusLabelAlias = "Success"
        } else if (!passwordOk) {
            createAccountPage.displayState_passwordStatusLabelAlias = "Fail"
        } else {
            createAccountPage.displayState_passwordStatusLabelAlias = "Hide"
        }
        //set enable state of next button
        btnNext.enabled = (usernameOk && passwordOk)
    }

    PasswordDialog {
        id: passwordDialog

        anchors.centerIn: parent.Center
        x: (parent.width - width) / 2
        y: (parent.height - height) / 2

        visible: false
        purpose: PasswordDialog.ExportAccount

        onDoneSignal: {
            if (currentPurpose === passwordDialog.ExportAccount) {
                var success = (code === successCode)

                var title = success ? qsTr("Success") : qsTr("Error")
                var info = success ? qsTr("Export Successful") : qsTr(
                                         "Export Failed")

                ClientWrapper.accountAdaptor.passwordSetStatusMessageBox(success,
                                                         title, info)
                if (success) {
                    console.log("Account Export Succeed")
                    wizardViewWindow.hide()
                    needToShowMainViewWindow(addedAccountIndex)
                    ClientWrapper.lrcInstance.accountListChanged()
                }
            }
        }
    }

    MouseArea {
            anchors.fill: parent
            onClicked: forceActiveFocus()
        }

    // main frame rectangle
    ScrollView  {
        id: wizardViewRect
        anchors.fill: parent

        clip: true

        ColumnLayout {
                id: content
                width: wizardViewWindow.width      // ensure correct width
                height: wizardViewWindow.height     // ensure correct height

                Layout.alignment: Qt.AlignHCenter
                RowLayout {
                    Layout.alignment: Qt.AlignHCenter
                    Layout.fillWidth: true
                    Layout.fillHeight: true

                    StackLayout {
                        id: controlPanelStackView
                        currentIndex: welcomePageStackId
                        Layout.fillWidth: true
                        Layout.fillHeight: true

                        property int welcomePageStackId: 0
                        property int createAccountPageId: 1
                        property int createSIPAccountPageId: 2
                        property int importFromBackupPageId: 3
                        property int backupKeysPageId: 4
                        property int importFromDevicePageId: 5
                        property int connectToAccountManagerPageId: 6
                        property int spinnerPageId: 7

                        WelcomePageLayout {
                            // welcome page, index 0
                            id: welcomePage

                            onWelcomePageRedirectPage: {
                                changePageQML(toPageIndex)
                            }

                            onVisibleChanged: {
                                if (visible)
                                    setNavBarVisibility(false,
                                                                          true)
                            }

                            Component.onCompleted: {
                                setNavBarVisibility(false, true)
                            }
                        }

                        CreateAccountPage {
                            // create account page, index 1
                            id: createAccountPage

                            onText_usernameEditAliasChanged: {
                            registrationStateOk = false
                            if (createAccountPage.checkState_signUpCheckboxAlias
                                    && (createAccountPage.text_usernameEditAlias.length != 0)) {
                                registedName = ClientWrapper.utilsAdaptor.stringSimplifier(
                                            createAccountPage.text_usernameEditAlias)
                                lookupTimer.restart()
                                } else {
                                createAccountPage.nameRegistrationUIState = WizardView.BLANK
                                lookupTimer.stop()
                                if (createAccountPage.text_usernameEditAlias.length == 0) {
                                    lookupTimer.restart()
                                    }
                                }
                                validateWizardProgressionQML()
                            }

                            onValidateWizardProgressionCreateAccountPage: {
                                validateWizardProgressionQML()
                            }

                            onText_passwordEditAliasChanged: {
                                validateWizardProgressionQML()
                            }

                            onText_confirmPasswordEditAliasChanged: {
                                validateWizardProgressionQML()
                            }

                        Timer {
                            id: lookupTimer

                            repeat: false
                            triggeredOnStart: false
                            interval: 200

                            onTriggered: {
                                if (createAccountPage.checkState_signUpCheckboxAlias
                                        && (createAccountPage.text_usernameEditAlias.length != 0)) {
                                    createAccountPage.nameRegistrationUIState = WizardView.SEARCHING
                                    ClientWrapper.nameDirectory.lookupName("", registedName)
                                }
                            }
                        }
                    }

                        CreateSIPAccountPage {
                            // create SIP account page, index 2
                            id: createSIPAccountPage
                        }

                        ImportFromBackupPage {
                            // import from backup page, index 3
                            id: importFromBackupPage

                            onText_passwordFromBackupEditAliasChanged: {
                                validateWizardProgressionQML()
                            }

                        onImportFromFile_Dialog_Accepted: {
                            fileToImport = ClientWrapper.utilsAdaptor.toNativeSeparators(fileDir)
                            inputParaObject[""]

                            if (fileToImport.length != 0) {
                                importFromBackupPage.fileImportBtnText = ClientWrapper.utilsAdaptor.toFileInfoName(
                                            fileToImport)
                            } else {
                                importFromBackupPage.fileImportBtnText = qsTr(
                                            "Archive(none)")
                            }
                            validateWizardProgressionQML()
                            }
                        }

                        BackupKeyPage {
                            // backup keys page, index 4
                            id: backupKeysPage

                            onNeverShowAgainBoxClicked: {
                                ClientWrapper.accountAdaptor.settingsNeverShowAgain(isChecked)
                            }

                            onExport_Btn_FileDialogAccepted: {
                                if (accepted) {
                                    // is there password? If so, go to password dialog, else, go to following directly
                                    if (ClientWrapper.accountAdaptor.hasPassword()) {
                                        passwordDialog.path = ClientWrapper.utilsAdaptor.getAbsPath(folderDir)
                                        passwordDialog.open()
                                        return
                                    } else {
                                        if (folderDir.length > 0) {
                                            ClientWrapper.accountAdaptor.exportToFile(
                                                        ClientWrapper.utilsAdaptor.getCurrAccId(),
                                                        ClientWrapper.utilsAdaptor.getAbsPath(folderDir))
                                        }
                                    }
                                }

                                wizardViewWindow.hide()
                                changePageQML(controlPanelStackView.welcomePageStackId)
                                needToShowMainViewWindow(addedAccountIndex)
                                ClientWrapper.lrcInstance.accountListChanged()
                            }


                            onSkip_Btn_Clicked: {
                                wizardViewWindow.hide()
                                changePageQML(controlPanelStackView.welcomePageStackId)
                                needToShowMainViewWindow(addedAccountIndex)
                                ClientWrapper.lrcInstance.accountListChanged()
                            }
                    }

                        ImportFromDevicePage {
                            // import from device page, index 5
                            id: importFromDevicePage

                            onText_pinFromDeviceAliasChanged: {
                                validateWizardProgressionQML()
                            }

                            onText_passwordFromDeviceAliasChanged: {
                                validateWizardProgressionQML()
                            }
                        }

                        ConnectToAccountManagerPage {
                            // connect to account manager Page, index 6
                            id: connectToAccountManagerPage

                            onText_usernameManagerEditAliasChanged: {
                                validateWizardProgressionQML()
                            }

                            onText_passwordManagerEditAliasChanged: {
                                validateWizardProgressionQML()
                            }

                            onText_accountManagerEditAliasChanged: {
                                validateWizardProgressionQML()
                            }
                        }

                        SpinnerPage {
                            // spinner Page, index 7
                            id: spinnerPage
                        }
                    }
                }

                RowLayout {
                    id: navBarView

                    Layout.alignment: Qt.AlignHCenter | Qt.AlignBottom
                    Layout.fillWidth: true

                    Layout.maximumHeight: 52
                    Layout.preferredHeight: 52

                    HoverableGradientButton {
                        id: btnPevious
                        Layout.alignment: Qt.AlignLeft
                        width: 85
                        height: 30
                        radius: height / 2

                        Layout.leftMargin: 11

                        Layout.preferredWidth: 85
                        Layout.preferredHeight: 30
                        text: qsTr("Previous")
                        font.pointSize: 10
                        font.kerning: true

                        toolTipText: qsTr("Previous page button")

                        onClicked: {
                            // stop photobooth previewing
                            if(controlPanelStackView.currentIndex == controlPanelStackView.createAccountPageId) {
                                createAccountPage.stopBooth()
                            }
                            if(controlPanelStackView.currentIndex == controlPanelStackView.createSIPAccountPageId) {
                                createSIPAccountPage.stopBooth()
                            }

                            // Disconnect registered name found Connection
                            registeredNameFoundConnection.enabled = false
                            // deal with look up status label and collapsible password widget
                            createAccountPage.nameRegistrationUIState = WizardView.BLANK
                            createAccountPage.isToSetPassword_checkState_choosePasswordCheckBox = false
                            // switch to welcome page
                            if (controlPanelStackView.currentIndex
                                    == controlPanelStackView.createAccountPageId
                                    || controlPanelStackView.currentIndex
                                    == controlPanelStackView.createSIPAccountPageId
                                    || controlPanelStackView.currentIndex
                                    == controlPanelStackView.importFromBackupPageId
                                    || controlPanelStackView.currentIndex
                                    == controlPanelStackView.importFromDevicePageId
                                    || controlPanelStackView.currentIndex
                                    == controlPanelStackView.connectToAccountManagerPageId) {
                                changePageQML(
                                            controlPanelStackView.welcomePageStackId)
                            }
                        }
                    }

                    Item {
                        Layout.alignment: Qt.AlignHCenter
                        Layout.fillHeight: true
                        Layout.minimumWidth: 40
                        Layout.fillWidth: true
                    }

                    HoverableGradientButton {
                        id: btnBack
                        Layout.alignment: Qt.AlignLeft
                        width: 85
                        height: 30
                        radius: height / 2

                        Layout.preferredWidth: 85
                        Layout.preferredHeight: 30
                        text: qsTr("Back")
                        font.pointSize: 10
                        font.kerning: true

                        toolTipText: qsTr("Cancel account create/link")

                        onClicked: {
                            wizardViewWindow.hide()
                            needToShowMainViewWindow(addedAccountIndex)
                        }
                    }

                    Item {
                        Layout.alignment: Qt.AlignHCenter
                        Layout.fillHeight: true
                        Layout.minimumWidth: 40
                        Layout.fillWidth: true
                    }

                    HoverableGradientButton {
                        id: btnNext
                        Layout.alignment: Qt.AlignRight
                        width: 85
                        height: 30
                        radius: height / 2

                        Layout.rightMargin: 11

                        Layout.minimumWidth: 85
                        Layout.preferredWidth: 85
                        Layout.maximumWidth: 85

                        Layout.minimumHeight: 30
                        Layout.preferredHeight: 30
                        Layout.maximumHeight: 30

                        text: qsTr("Next")
                        font.pointSize: 10
                        font.kerning: true

                        toolTipText: qsTr("Next page button")

                        onClicked: {
                            // stop photobooth previewing
                            if(controlPanelStackView.currentIndex == controlPanelStackView.createAccountPageId) {
                                createAccountPage.stopBooth()
                            }
                            if(controlPanelStackView.currentIndex == controlPanelStackView.createSIPAccountPageId) {
                                createSIPAccountPage.stopBooth()
                            }

                            registeredNameFoundConnection.enabled = false

                            if (controlPanelStackView.currentIndex
                                    == controlPanelStackView.createAccountPageId) {
                                wizardMode = WizardView.CREATE
                                processWizardInformationsQML()
                            } else if (controlPanelStackView.currentIndex
                                       == controlPanelStackView.importFromDevicePageId) {
                                wizardMode = WizardView.IMPORT
                                processWizardInformationsQML()
                            } else if (controlPanelStackView.currentIndex
                                       == controlPanelStackView.createSIPAccountPageId) {
                                wizardMode = WizardView.CREATESIP
                                processWizardInformationsQML()
                            } else if (controlPanelStackView.currentIndex
                                       == controlPanelStackView.connectToAccountManagerPageId) {
                                wizardMode = WizardView.CONNECTMANAGER
                                processWizardInformationsQML()
                            } else if (controlPanelStackView.currentIndex
                                       == controlPanelStackView.importFromBackupPageId) {
                                wizardMode = WizardView.IMPORT
                                processWizardInformationsQML()
                            }
                        }
                    }
                }
            }
    }
}
