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

import org.electrum 1.0

import "controls"

ElDialog {
    id: dialog

    required property QtObject finalizer
    required property var satoshis  // type: Amount
    property string address
    property string message
    property bool showOptions: true
    property alias amountLabelText: amountLabel.text
    property alias sendButtonText: sendButton.text

    title: qsTr('Transaction Fee')
    iconSource: Qt.resolvedUrl('../../icons/question.png')

    // copy these to finalizer
    onAddressChanged: finalizer.address = address
    onSatoshisChanged: finalizer.amount = satoshis

    width: parent.width
    height: parent.height
    padding: 0

    function updateAmountText() {
        if (finalizer.valid) {
            btcValue.text = Config.formatSats(finalizer.effectiveAmount, false)
            fiatValue.text = Daemon.fx.enabled
                ? Daemon.fx.fiatValue(finalizer.effectiveAmount, false)
                : ''
        } else {
            btcValue.text = Config.formatSats(finalizer.amount, false)
            fiatValue.text = Daemon.fx.enabled
                ? Daemon.fx.fiatValue(finalizer.amount, false)
                : ''
        }
    }

    ColumnLayout {
        anchors.fill: parent
        spacing: 0

        Flickable {
            Layout.fillWidth: true
            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 {
                    id: amountLabel
                    Layout.columnSpan: 2
                    text: qsTr('Amount to send')
                    color: Material.accentColor
                }

                DialogHighlightPane {
                    Layout.columnSpan: 2
                    Layout.fillWidth: true
                    GridLayout {
                        columns: 2
                        Label {
                            id: btcValue
                            Layout.alignment: Qt.AlignRight
                            font.pixelSize: constants.fontSizeXLarge
                            font.family: FixedFont
                            font.bold: true
                        }

                        Label {
                            Layout.fillWidth: true
                            text: Config.baseUnit
                            color: Material.accentColor
                            font.pixelSize: constants.fontSizeXLarge
                        }

                        Label {
                            id: fiatValue
                            Layout.alignment: Qt.AlignRight
                            visible: Daemon.fx.enabled
                            font.pixelSize: constants.fontSizeMedium
                            color: constants.mutedForeground
                        }

                        Label {
                            Layout.fillWidth: true
                            visible: Daemon.fx.enabled
                            text: Daemon.fx.fiatCurrency
                            font.pixelSize: constants.fontSizeMedium
                            color: constants.mutedForeground
                        }
                        Component.onCompleted: updateAmountText()
                        Connections {
                            target: finalizer
                            function onEffectiveAmountChanged() {
                                updateAmountText()
                            }
                        }
                    }
                }

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

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

                    FeePicker {
                        id: feepicker
                        width: parent.width
                        finalizer: dialog.finalizer

                        Label {
                            visible: !finalizer.extraFee.isEmpty
                            text: qsTr('Extra fee')
                            color: Material.accentColor
                        }

                        FormattedAmount {
                            visible: !finalizer.extraFee.isEmpty
                            amount: finalizer.extraFee
                        }
                    }
                }

                ToggleLabel {
                    id: optionstoggle
                    Layout.columnSpan: 2
                    labelText: qsTr('Options')
                    color: Material.accentColor
                    visible: showOptions
                }

                DialogHighlightPane {
                    Layout.columnSpan: 2
                    Layout.fillWidth: true
                    visible: optionstoggle.visible && !optionstoggle.collapsed
                    height: optionslayout.height

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

                        ElCheckBox {
                            Layout.fillWidth: true
                            text: qsTr('Use multiple change addresses')
                            onCheckedChanged: {
                                if (activeFocus) {
                                    Daemon.currentWallet.multipleChange = checked
                                    finalizer.doUpdate()
                                }
                            }
                            Component.onCompleted: {
                                checked = Daemon.currentWallet.multipleChange
                            }
                        }

                        HelpButton {
                            heading: qsTr('Use multiple change addresses')
                            helptext: [qsTr('In some cases, use up to 3 change addresses in order to break up large coin amounts and obfuscate the recipient address.'),
                                       qsTr('This may result in higher transactions fees.')].join(' ')
                        }

                        ElCheckBox {
                            Layout.fillWidth: true
                            text: Config.shortDescFor('WALLET_COIN_CHOOSER_OUTPUT_ROUNDING')
                            onCheckedChanged: {
                                if (activeFocus) {
                                    Config.outputValueRounding = checked
                                    finalizer.doUpdate()
                                }
                            }
                            Component.onCompleted: {
                                checked = Config.outputValueRounding
                            }
                        }

                        HelpButton {
                            heading: Config.shortDescFor('WALLET_COIN_CHOOSER_OUTPUT_ROUNDING')
                            helptext: Config.longDescFor('WALLET_COIN_CHOOSER_OUTPUT_ROUNDING')
                        }

                    }
                }

                InfoTextArea {
                    Layout.columnSpan: 2
                    Layout.fillWidth: true
                    Layout.topMargin: constants.paddingLarge
                    Layout.bottomMargin: constants.paddingLarge
                    visible: finalizer.warning != ''
                    text: finalizer.warning
                    iconStyle: InfoTextArea.IconStyle.Warn
                    backgroundColor: constants.darkerDialogBackground
                }

                ToggleLabel {
                    id: inputs_label
                    Layout.columnSpan: 2
                    Layout.topMargin: constants.paddingMedium
                    visible: finalizer.valid

                    labelText: qsTr('Inputs (%1)').arg(finalizer.inputs.length)
                    color: Material.accentColor
                }

                Repeater {
                    model: inputs_label.collapsed
                        ? undefined
                        : finalizer.inputs
                    delegate: TxInput {
                        Layout.columnSpan: 2
                        Layout.fillWidth: true
                        visible: finalizer.valid
                        backgroundColor: constants.darkerDialogBackground

                        idx: index
                        model: modelData
                    }
                }

                ToggleLabel {
                    id: outputs_label
                    Layout.columnSpan: 2
                    Layout.topMargin: constants.paddingMedium
                    visible: finalizer.valid

                    labelText: qsTr('Outputs (%1)').arg(finalizer.outputs.length)
                    color: Material.accentColor
                }

                Repeater {
                    model: outputs_label.collapsed
                        ? undefined
                        : finalizer.outputs
                    delegate: TxOutput {
                        Layout.columnSpan: 2
                        Layout.fillWidth: true
                        visible: finalizer.valid
                        backgroundColor: constants.darkerDialogBackground

                        allowShare: false
                        allowClickAddress: false

                        idx: index
                        model: modelData
                    }
                }

            }
        }

        DialogButtonContainer {
            Layout.fillWidth: true

            FlatButton {
                id: sendButton
                Layout.fillWidth: true
                text: (Daemon.currentWallet.isWatchOnly || !Daemon.currentWallet.canSignWithoutCosigner)
                        ? qsTr('Finalize...')
                        : qsTr('Pay...')
                icon.source: '../../icons/confirmed.png'
                enabled: finalizer.valid
                onClicked: doAccept()
            }
        }
    }

    onClosed: doReject()
}
