// SPDX-FileCopyrightText: Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later

import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.2
import QtQuick.Window 2.15
import im.nheko 1.0
import "../components/"
import "../ui/"
import "../"

Item {
    id: loginPage
    property int maxExpansion: 400

    property string error: login.error

    Login {
        id: login
    }

    ScrollView {
        id: scroll

        clip: false
        ScrollBar.horizontal.visible: false
        anchors.left: parent.left
        anchors.right: parent.right
        anchors.verticalCenter: parent.verticalCenter
        height: Math.min(loginPage.height, col.implicitHeight)
        anchors.margins: Nheko.paddingLarge

        contentWidth: availableWidth

        ColumnLayout {
            id: col

            spacing: Nheko.paddingMedium

            anchors.horizontalCenter: parent.horizontalCenter
            width: Math.min(loginPage.maxExpansion, scroll.width- Nheko.paddingLarge*2)

            Image {
                Layout.alignment: Qt.AlignHCenter
                source: "qrc:/logos/login.png"
                Layout.preferredHeight: 128
                Layout.preferredWidth: 128
            }

            RowLayout {
                spacing: Nheko.paddingLarge

                Layout.fillWidth: true
                MatrixTextField {
                    id: matrixIdLabel
                    label: qsTr("Matrix ID")
                    placeholderText: qsTr("e.g @user:yourserver.example.com")
                    onEditingFinished: login.mxid = text

                    ToolTip.text: qsTr("Your login name. A mxid should start with @ followed by the user ID. After the user ID you need to include your server name after a :.\nYou can also put your homeserver address there if your server doesn't support .well-known lookup.\nExample: @user:yourserver.example.com\nIf Nheko fails to discover your homeserver, it will show you a field to enter the server manually.")
                    Keys.forwardTo: [pwBtn, ssoRepeater]
                }


                Spinner {
                    Layout.preferredHeight: matrixIdLabel.height/2
                    Layout.alignment: Qt.AlignBottom

                    visible: running
                    running: login.lookingUpHs
                    foreground: palette.mid
                }
            }

            MatrixText {
                Layout.fillWidth: true
                textFormat: Text.PlainText
                color: Nheko.theme.error
                text: login.mxidError
                visible: text
                wrapMode: TextEdit.Wrap
            }
            RowLayout {

                MatrixTextField {
                    id: passwordLabel
                    Layout.fillWidth: true
                    label: qsTr("Password")
                    echoMode: TextInput.Password
                    ToolTip.text: qsTr("Your password.")
                    visible: login.passwordSupported
                    Keys.forwardTo: [pwBtn, ssoRepeater]
                }

                ImageButton {
                    id: showPwButton
                    Layout.preferredWidth: 30
                    Layout.preferredHeight: 30
                    visible: login.passwordSupported
                    Layout.alignment: Qt.AlignBottom
                    image: passwordLabel.echoMode === TextInput.Password ? ":/icons/icons/ui/eye-show.svg" : ":/icons/icons/ui/eye-hide.svg"
                    ToolTip.visible: hovered
                    ToolTip.text: qsTr("Show/Hide Password")
                    onClicked: {
                        if (passwordLabel.echoMode === TextInput.Normal) {
                            passwordLabel.echoMode = TextInput.Password
                        }
                        else {
                            passwordLabel.echoMode = TextInput.Normal
                        }
                    }
                }
            }

            MatrixTextField {
                id: deviceNameLabel
                Layout.fillWidth: true
                label: qsTr("Device name")
                placeholderText: login.initialDeviceName()
                ToolTip.text: qsTr("A name for this device which will be shown to others when verifying your devices. If nothing is provided, a default is used.")
                Keys.forwardTo: [pwBtn, ssoRepeater]
            }

            MatrixTextField {
                id: hsLabel
                enabled: visible
                visible: login.homeserverNeeded

                Layout.fillWidth: true
                label: qsTr("Homeserver address")
                placeholderText: qsTr("yourserver.example.com:8787")
                text: login.homeserver
                onEditingFinished: login.homeserver = text
                ToolTip.text: qsTr("The address that can be used to contact your homeserver's client API.\nExample: https://yourserver.example.com:8787")
                Keys.forwardTo: [pwBtn, ssoRepeater]
            }

            Item {
                Layout.preferredHeight: Nheko.avatarSize
                Layout.fillWidth: true

                Spinner {
                    height: parent.height
                    anchors.centerIn: parent

                    visible: running
                    running: login.loggingIn
                    foreground: palette.mid
                }
            }

            MatrixText {
                Layout.fillWidth: true
                textFormat: Text.PlainText
                color: Nheko.theme.error
                text: loginPage.error
                visible: text
                wrapMode: TextEdit.Wrap
            }

            FlatButton {
                id: pwBtn
                visible: login.passwordSupported
                enabled: login.homeserverValid && matrixIdLabel.text == login.mxid && login.homeserver == hsLabel.text
                Layout.alignment: Qt.AlignHCenter
                text: qsTr("LOGIN")
                function pwLogin() {
                    login.onLoginButtonClicked(Login.Password, matrixIdLabel.text, passwordLabel.text, deviceNameLabel.text)
                }
                onClicked: pwBtn.pwLogin()
                Keys.onEnterPressed: pwBtn.pwLogin()
                Keys.onReturnPressed: pwBtn.pwLogin()
                Keys.enabled: pwBtn.enabled && login.passwordSupported
            }

            Repeater {
                id: ssoRepeater

                model: login.identityProviders

                delegate: FlatButton {
                    id: ssoBtn
                    visible: login.ssoSupported
                    enabled: login.homeserverValid && matrixIdLabel.text == login.mxid && login.homeserver == hsLabel.text
                    Layout.alignment: Qt.AlignHCenter
                    text: modelData.name
                    iconImage: modelData.avatarUrl.replace("mxc://", "image://MxcImage/")
                    function ssoLogin() {
                        login.onLoginButtonClicked(Login.SSO, matrixIdLabel.text, modelData.id, deviceNameLabel.text)
                    }
                    onClicked: ssoBtn.ssoLogin()
                    Keys.onEnterPressed: ssoBtn.ssoLogin()
                    Keys.onReturnPressed: ssoBtn.ssoLogin()
                    Keys.enabled: ssoBtn.enabled && !login.passwordSupported
                }
            }
        }
    }

    ImageButton {
        anchors.top: parent.top
        anchors.left: parent.left
        anchors.margins: Nheko.paddingMedium
        width: Nheko.avatarSize
        height: Nheko.avatarSize
        image: ":/icons/icons/ui/angle-arrow-left.svg"
        ToolTip.visible: hovered
        ToolTip.text: qsTr("Back")
        onClicked: mainWindow.pop()
    }
}
