import QtQuick 2.14
import QtQuick.Window 2.14
import QtQuick.Controls 2.14
import QtQuick.Layouts 1.14
import QtQuick.Controls.Universal 2.12
import QtGraphicalEffects 1.14
import net.jami.Models 1.0

import "mainview"
import "wizardview"
import "commoncomponents"

ApplicationWindow {
    id: mainApplicationWindow

    AccountMigrationDialog{
        id: accountMigrationDialog

        visible: false

        onAccountMigrationFinished:{
            startClientByMainview()
        }
    }

    function slotNewAccountAdded() {
        if(mainViewLoader.newAddedAccountIndex !== -1)
            mainViewLoader.item.newAccountAdded(mainViewLoader.newAddedAccountIndex)
    }

    function startAccountMigration(){
        return accountMigrationDialog.startAccountMigrationOfTopStack()
    }

    function startClientByMainview(){
        setX(Screen.width / 2 - width / 2)
        setY(Screen.height / 2 - height / 2)

        if (!ClientWrapper.utilsAdaptor.getAccountListSize()) {
            wizardView.show()
        } else {
            mainViewLoader.setSource("qrc:/src/mainview/MainView.qml")
        }
    }

    Universal.theme: Universal.Light

    visible: false

    Loader {
        id: mainViewLoader

        property int newAddedAccountIndex: -1

        asynchronous: true
        visible: status == Loader.Ready
        source: ""

        Connections {
            target: mainViewLoader.item

            function onCloseApp() {
                Qt.quit()
            }

            function onNoAccountIsAvailable() {
                mainViewLoader.setSource("")
                wizardViewForApplicationStart.changePageQML(0)
                wizardView.show()
            }
        }
    }

    Window {
        id: wizardView

        title: "Jami"

        minimumWidth: 400
        minimumHeight: 600

        WizardView {
            id: wizardViewForApplicationStart

            anchors.fill: parent
            onNeedToShowMainViewWindow: {
                mainViewLoader.newAddedAccountIndex = accountIndex
                if (mainViewLoader.source.toString() !== "qrc:/src/mainview/MainView.qml") {
                    mainViewLoader.loaded.disconnect(slotNewAccountAdded)
                    mainViewLoader.loaded.connect(slotNewAccountAdded)
                    mainViewLoader.setSource("qrc:/src/mainview/MainView.qml")
                } else {
                    slotNewAccountAdded()
                }
                wizardView.close()
            }

            onWizardViewIsClosed: {
                if (mainViewLoader.source.toString() !== "qrc:/src/mainview/MainView.qml") {
                    Qt.quit()
                }
            }
        }
    }


    Component.onCompleted: {
        if(!startAccountMigration()){
            startClientByMainview()
        }
    }

    overlay.modal: ColorOverlay {
        source: mainApplicationWindow.contentItem
        color: "transparent"


        /*
         * Color animation for overlay when pop up is shown.
         */
        ColorAnimation on color {
            to: Qt.rgba(0, 0, 0, 0.33)
            duration: 500
        }
    }
}
