import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import QtQuick.Controls.Material

import org.electrum 1.0

import "controls"

ElDialog {
    id: dialog

    width: parent.width
    height: parent.height

    property string channelid

    title: qsTr('Close Channel')
    iconSource: Qt.resolvedUrl('../../icons/lightning_disconnected.png')

    property string _closing_method

    padding: 0

    ColumnLayout {
        anchors.fill: parent
        spacing: 0

        Flickable {
            Layout.preferredWidth: parent.width
            Layout.fillHeight: true

            leftMargin: constants.paddingLarge
            rightMargin: constants.paddingLarge

            contentHeight: rootLayout.height
            clip:true
            interactive: height < contentHeight

            GridLayout {
                id: rootLayout
                width: parent.width
                columns: 2

                Label {
                    Layout.fillWidth: true
                    visible: channeldetails.name
                    text: qsTr('Channel name')
                    color: Material.accentColor
                }

                Label {
                    Layout.fillWidth: true
                    visible: channeldetails.name
                    text: channeldetails.name
                }

                Label {
                    text: qsTr('Short channel ID')
                    color: Material.accentColor
                }

                Label {
                    text: channeldetails.shortCid
                }

                Label {
                    text: qsTr('Remote node ID')
                    Layout.columnSpan: 2
                    color: Material.accentColor
                }

                DialogHighlightPane {
                    Layout.columnSpan: 2
                    Layout.fillWidth: true

                    Label {
                        width: parent.width
                        text: channeldetails.pubkey
                        font.pixelSize: constants.fontSizeLarge
                        font.family: FixedFont
                        Layout.fillWidth: true
                        wrapMode: Text.Wrap
                    }
                }

                Item { Layout.preferredHeight: constants.paddingMedium; Layout.preferredWidth: 1; Layout.columnSpan: 2 }

                InfoTextArea {
                    Layout.columnSpan: 2
                    Layout.fillWidth: true
                    Layout.bottomMargin: constants.paddingLarge
                    text: channeldetails.messageForceClose
                    backgroundColor: constants.darkerDialogBackground
                }

                Label {
                    text: qsTr('Choose closing method')
                    Layout.columnSpan: 2
                    color: Material.accentColor
                }

                ColumnLayout {
                    Layout.columnSpan: 2
                    Layout.alignment: Qt.AlignHCenter

                    ButtonGroup {
                        id: closetypegroup
                    }

                    ElRadioButton {
                        id: closetypeCoop
                        ButtonGroup.group: closetypegroup
                        property string closetype: 'cooperative'
                        enabled: !channeldetails.isClosing && channeldetails.canCoopClose
                        text: qsTr('Cooperative close')
                    }
                    ElRadioButton {
                        id: closetypeRemoteForce
                        ButtonGroup.group: closetypegroup
                        property string closetype: 'remote_force'
                        enabled: !channeldetails.isClosing && channeldetails.canRequestForceClose
                        text: qsTr('Request Force-close')
                    }
                    ElRadioButton {
                        id: closetypeLocalForce
                        ButtonGroup.group: closetypegroup
                        property string closetype: 'local_force'
                        enabled: !channeldetails.isClosing && channeldetails.canLocalForceClose && !channeldetails.isBackup
                        text: qsTr('Local Force-close')
                    }
                }

                ColumnLayout {
                    Layout.columnSpan: 2
                    Layout.maximumWidth: parent.width

                    InfoTextArea {
                        id: errorText
                        Layout.alignment: Qt.AlignHCenter
                        Layout.maximumWidth: parent.width
                        visible: !channeldetails.isClosing && errorText.text
                        iconStyle: InfoTextArea.IconStyle.Error
                        backgroundColor: constants.darkerDialogBackground
                    }
                    Label {
                        Layout.alignment: Qt.AlignHCenter
                        text: qsTr('Closing...')
                        visible: channeldetails.isClosing
                    }
                    BusyIndicator {
                        Layout.alignment: Qt.AlignHCenter
                        visible: channeldetails.isClosing
                    }
                }
            }
        }

        DialogButtonContainer {
            Layout.columnSpan: 2
            Layout.fillWidth: true

            FlatButton {
                Layout.fillWidth: true
                text: qsTr('Close channel')
                icon.source: '../../icons/closebutton.png'
                enabled: !channeldetails.isClosing
                onClicked: {
                    if (closetypegroup.checkedButton.closetype == 'local_force') {
                        showBackupThenClose()
                    } else {
                        doCloseChannel()
                    }
                }
            }
        }
    }

    function showBackupThenClose() {
        var sharedialog = app.genericShareDialog.createObject(app, {
            title: qsTr('Save channel backup and force close'),
            text_qr: channeldetails.channelBackup(),
            text_help: channeldetails.messageForceCloseBackup,
            helpTextIconStyle: InfoTextArea.IconStyle.Warn
        })
        sharedialog.closed.connect(function() {
            doCloseChannel()
        })
        sharedialog.open()
    }

    function doCloseChannel() {
        _closing_method = closetypegroup.checkedButton.closetype
        channeldetails.closeChannel(_closing_method)
    }

    function showCloseMessage(text) {
        var msgdialog = app.messageDialog.createObject(app, {
            text: text
        })
        msgdialog.open()
    }

    ChannelDetails {
        id: channeldetails
        wallet: Daemon.currentWallet
        channelid: dialog.channelid

        onAuthRequired: (method, authMessage) => {
            app.handleAuthRequired(channeldetails, method, authMessage)
        }

        onChannelChanged: {
            if (!channeldetails.canClose || channeldetails.isClosing)
                return

            // init default choice
            if (channeldetails.canCoopClose)
                closetypeCoop.checked = true
            else if (channeldetails.canRequestForceClose)
                closetypeRemoteForce.checked = true
            else
                closetypeLocalForce.checked = true
        }

        onChannelCloseSuccess: {
            if (_closing_method == 'local_force') {
                showCloseMessage(qsTr('Channel closed. You may need to wait at least %1 blocks, because of CSV delays').arg(channeldetails.toSelfDelay))
            } else if (_closing_method == 'remote_force') {
                showCloseMessage(qsTr('Request sent'))
            } else if (_closing_method == 'cooperative') {
                showCloseMessage(qsTr('Channel closed'))
            }
            dialog.close()
        }

        onChannelCloseFailed: (message) => {
            errorText.text = message
        }
    }

}
