import QtQuick
import QtQuick.Controls
import QtQuick.Layouts

import SortFilterProxyModel 0.2

import PageEnum 1.0
import ContainerProps 1.0
import Style 1.0

import "./"
import "../Controls2"
import "../Controls2/TextTypes"
import "../Config"
import "../Components"

PageType {
    id: root

    Connections {
        target: InstallController

        function onUpdateContainerFinished() {
            PageController.showNotificationMessage(qsTr("Settings updated successfully"))
        }
    }

    ColumnLayout {
        id: backButtonLayout

        anchors.top: parent.top
        anchors.left: parent.left
        anchors.right: parent.right

        anchors.topMargin: 20

        BackButtonType {
            id: backButton
        }
    }

    FlickableType {
        id: fl
        anchors.top: backButtonLayout.bottom
        anchors.bottom: parent.bottom
        contentHeight: listview.implicitHeight

        ListView {
            id: listview

            width: parent.width
            height: listview.contentItem.height

            clip: true
            interactive: false

            model: Socks5ProxyConfigModel

            onFocusChanged: {
                if (focus) {
                    listview.currentItem.focusItemId.forceActiveFocus()
                }
            }

            delegate: Item {
                implicitWidth: listview.width
                implicitHeight: content.implicitHeight

                property alias focusItemId: hostLabel.rightButton

                ColumnLayout {
                    id: content

                    anchors.top: parent.top
                    anchors.left: parent.left
                    anchors.right: parent.right

                    spacing: 0

                    HeaderType {
                        Layout.fillWidth: true
                        Layout.leftMargin: 16
                        Layout.rightMargin: 16

                        headerText: qsTr("SOCKS5 settings")
                    }

                    LabelWithButtonType {
                        id: hostLabel
                        Layout.fillWidth: true
                        Layout.topMargin: 32

                        parentFlickable: fl

                        text: qsTr("Host")
                        descriptionText: ServersModel.getProcessedServerData("hostName")

                        descriptionOnTop: true

                        rightImageSource: "qrc:/images/controls/copy.svg"
                        rightImageColor: AmneziaStyle.color.paleGray

                        clickedFunction: function() {
                            GC.copyToClipBoard(descriptionText)
                            PageController.showNotificationMessage(qsTr("Copied"))
                            if (!GC.isMobile()) {
                                this.rightButton.forceActiveFocus()
                            }
                        }
                    }

                    LabelWithButtonType {
                        id: portLabel
                        Layout.fillWidth: true

                        text: qsTr("Port")
                        descriptionText: port

                        descriptionOnTop: true

                        parentFlickable: fl

                        rightImageSource: "qrc:/images/controls/copy.svg"
                        rightImageColor: AmneziaStyle.color.paleGray

                        clickedFunction: function() {
                            GC.copyToClipBoard(descriptionText)
                            PageController.showNotificationMessage(qsTr("Copied"))
                            if (!GC.isMobile()) {
                                this.rightButton.forceActiveFocus()
                            }
                        }
                    }

                    LabelWithButtonType {
                        id: usernameLabel
                        Layout.fillWidth: true

                        text: qsTr("User name")
                        descriptionText: username

                        descriptionOnTop: true

                        parentFlickable: fl

                        rightImageSource: "qrc:/images/controls/copy.svg"
                        rightImageColor: AmneziaStyle.color.paleGray

                        clickedFunction: function() {
                            GC.copyToClipBoard(descriptionText)
                            PageController.showNotificationMessage(qsTr("Copied"))
                            if (!GC.isMobile()) {
                                this.rightButton.forceActiveFocus()
                            }
                        }
                    }

                    LabelWithButtonType {
                        id: passwordLabel
                        Layout.fillWidth: true

                        text: qsTr("Password")
                        descriptionText: password

                        descriptionOnTop: true

                        parentFlickable: fl

                        rightImageSource: "qrc:/images/controls/copy.svg"
                        rightImageColor: AmneziaStyle.color.paleGray

                        buttonImageSource: hideDescription ? "qrc:/images/controls/eye.svg" : "qrc:/images/controls/eye-off.svg"

                        clickedFunction: function() {
                            GC.copyToClipBoard(descriptionText)
                            PageController.showNotificationMessage(qsTr("Copied"))
                            if (!GC.isMobile()) {
                                this.rightButton.forceActiveFocus()
                            }
                        }
                    }

                    DrawerType2 {
                        id: changeSettingsDrawer
                        parent: root

                        anchors.fill: parent
                        expandedHeight: root.height * 0.9

                        expandedStateContent: ColumnLayout {
                            property string tempPort: port
                            property string tempUsername: username
                            property string tempPassword: password

                            anchors.top: parent.top
                            anchors.left: parent.left
                            anchors.right: parent.right
                            anchors.topMargin: 32
                            anchors.leftMargin: 16
                            anchors.rightMargin: 16
                            spacing: 0

                            Connections {
                                target: changeSettingsDrawer
                                function onOpened() {
                                    tempPort = port
                                    tempUsername = username
                                    tempPassword = password
                                }
                                function onClosed() {
                                    port = tempPort
                                    username = tempUsername
                                    password = tempPassword
                                    portTextField.textField.text = port
                                    usernameTextField.textField.text = username
                                    passwordTextField.textField.text = password
                                }
                            }

                            HeaderType {
                                Layout.fillWidth: true

                                headerText: qsTr("SOCKS5 settings")
                            }

                            TextFieldWithHeaderType {
                                id: portTextField

                                Layout.fillWidth: true
                                Layout.topMargin: 40
                                parentFlickable: fl

                                headerText: qsTr("Port")
                                textField.text: port
                                textField.maximumLength: 5
                                textField.validator: IntValidator { bottom: 1; top: 65535 }

                                textField.onEditingFinished: {
                                    textField.text = textField.text.replace(/^\s+|\s+$/g, '')
                                    if (textField.text !== port) {
                                        port = textField.text
                                    }
                                }
                            }

                            TextFieldWithHeaderType {
                                id: usernameTextField

                                Layout.fillWidth: true
                                Layout.topMargin: 16
                                parentFlickable: fl

                                headerText: qsTr("Username")
                                textField.placeholderText: "username"
                                textField.text: username
                                textField.maximumLength: 32

                                textField.onEditingFinished: {
                                    textField.text = textField.text.replace(/^\s+|\s+$/g, '')
                                    if (textField.text !== username) {
                                        username = textField.text
                                    }
                                }
                            }

                            TextFieldWithHeaderType {
                                id: passwordTextField

                                property bool hidePassword: true

                                Layout.fillWidth: true
                                Layout.topMargin: 16
                                parentFlickable: fl

                                headerText: qsTr("Password")
                                textField.placeholderText: "password"
                                textField.text: password
                                textField.maximumLength: 32

                                textField.echoMode: hidePassword ? TextInput.Password : TextInput.Normal
                                buttonImageSource: textField.text !== "" ? (hidePassword ? "qrc:/images/controls/eye.svg" : "qrc:/images/controls/eye-off.svg")
                                                                        : ""

                                clickedFunc: function() {
                                    hidePassword = !hidePassword
                                }

                                textField.onFocusChanged: {
                                    textField.text = textField.text.replace(/^\s+|\s+$/g, '')
                                    if (textField.text !== password) {
                                        password = textField.text
                                    }
                                }
                            }

                            BasicButtonType {
                                id: saveButton

                                Layout.fillWidth: true
                                Layout.topMargin: 24
                                Layout.bottomMargin: 24

                                text: qsTr("Change connection settings")

                                clickedFunc: function() {
                                    forceActiveFocus()

                                    if (!portTextField.textField.acceptableInput) {
                                        portTextField.errorText = qsTr("The port must be in the range of 1 to 65535")
                                        return
                                    }
                                    if (usernameTextField.textField.text && passwordTextField.textField.text === "") {
                                        passwordTextField.errorText = qsTr("Password cannot be empty")
                                        return
                                    } else if (usernameTextField.textField.text === "" && passwordTextField.textField.text) {
                                        usernameTextField.errorText = qsTr("Username cannot be empty")
                                        return
                                    }

                                    PageController.goToPage(PageEnum.PageSetupWizardInstalling)
                                    InstallController.updateContainer(Socks5ProxyConfigModel.getConfig())
                                    tempPort = portTextField.textField.text
                                    tempUsername = usernameTextField.textField.text
                                    tempPassword = passwordTextField.textField.text
                                    changeSettingsDrawer.closeTriggered()
                                }
                            }
                        }
                    }

                    BasicButtonType {
                        id: changeSettingsButton

                        Layout.fillWidth: true
                        Layout.topMargin: 24
                        Layout.bottomMargin: 24
                        Layout.leftMargin: 16
                        Layout.rightMargin: 16

                        text: qsTr("Change connection settings")

                        clickedFunc: function() {
                            forceActiveFocus()
                            changeSettingsDrawer.openTriggered()
                        }
                    }
                }
            }
        }
    }
}
