import QtQuick 2.15
import QtQuick.Controls 2.15

import QtTest 1.15

import StatusQ 0.1

import shared.popups.send.views 1.0

Item {
    id: root

    Component {
        id: componentUnderTest

        AmountToSend {}
    }

    property AmountToSend amountToSend

    SignalSpy {
        id: amountChangedSpy
        target: amountToSend
        signalName: "amountChanged"
    }

    TestCase {
        name: "AmountToSend"
        when: windowShown

        function type(key, times = 1) {
            for (let i = 0; i < times; i++) {
                keyClick(key)
            }
        }

        function init() {
            amountToSend = createTemporaryObject(componentUnderTest, root)
        }

        function cleanup() {
            amountChangedSpy.clear()
        }

        function test_empty() {
            compare(amountToSend.valid, false)
            compare(amountToSend.empty, true)
            compare(amountToSend.amount, "0")
            compare(amountToSend.fiatMode, false)
        }

        function test_settingValueInCryptoMode() {
            const textField = findChild(amountToSend, "amountToSend_textField")

            amountToSend.multiplierIndex = 3
            amountToSend.setValue("2.5")

            compare(textField.text, "2.5")
            compare(amountToSend.amount, "2500")
            compare(amountToSend.valid, true)

            amountToSend.setValue("2.12345678")

            compare(textField.text, "2.123")
            compare(amountToSend.amount, "2123")
            compare(amountToSend.valid, true)

            amountToSend.setValue("2.1239")

            compare(textField.text, "2.124")
            compare(amountToSend.amount, "2124")
            compare(amountToSend.valid, true)

            amountToSend.setValue(".1239")

            compare(textField.text, "0.124")
            compare(amountToSend.amount, "124")
            compare(amountToSend.valid, true)

            amountToSend.setValue("1.0000")

            compare(textField.text, "1")
            compare(amountToSend.amount, "1000")
            compare(amountToSend.valid, true)

            amountToSend.setValue("0.0000")

            compare(textField.text, "0")
            compare(amountToSend.amount, "0")
            compare(amountToSend.valid, true)

            amountToSend.setValue("x")

            compare(textField.text, "NaN")
            compare(amountToSend.amount, "0")
            compare(amountToSend.valid, false)

            // exceeding maxium allowed integral part
            amountToSend.setValue("1234567890000")
            compare(textField.text, "1234567890000")
            compare(amountToSend.amount, "0")
            compare(amountToSend.valid, false)
        }

        function test_settingValueInFiatMode() {
            const textField = findChild(amountToSend, "amountToSend_textField")
            const mouseArea = findChild(amountToSend, "amountToSend_mouseArea")

            amountToSend.price = 0.5
            amountToSend.multiplierIndex = 3

            mouseClick(mouseArea)
            compare(amountToSend.fiatMode, true)

            amountToSend.setValue("2.5")

            compare(textField.text, "2.50")
            compare(amountToSend.amount, "5000")
            compare(amountToSend.valid, true)

            amountToSend.setValue("2.12345678")

            compare(textField.text, "2.12")
            compare(amountToSend.amount, "4240")
            compare(amountToSend.valid, true)

            amountToSend.setValue("2.129")

            compare(textField.text, "2.13")
            compare(amountToSend.amount, "4260")
            compare(amountToSend.valid, true)

            // exceeding maxium allowed integral part
            amountToSend.setValue("1234567890000")
            compare(textField.text, "1234567890000.00")
            compare(amountToSend.amount, "0")
            compare(amountToSend.valid, false)
        }

        function test_switchingMode() {
            const textField = findChild(amountToSend, "amountToSend_textField")
            const mouseArea = findChild(amountToSend, "amountToSend_mouseArea")

            amountToSend.price = 0.5
            amountToSend.multiplierIndex = 3

            amountToSend.setValue("10.5")
            compare(amountToSend.amount, "10500")

            mouseClick(mouseArea)
            compare(amountToSend.fiatMode, true)
            compare(textField.text, "5.25")
            compare(amountToSend.amount, "10500")

            mouseClick(mouseArea)
            compare(amountToSend.fiatMode, false)
            compare(textField.text, "10.5")
            compare(amountToSend.amount, "10500")

            mouseClick(mouseArea)
            compare(amountToSend.fiatMode, true)
            amountToSend.price = 0.124
            amountToSend.setValue("1")
            compare(textField.text, "1.00")

            mouseClick(mouseArea)
            compare(amountToSend.fiatMode, false)
            compare(textField.text, "8.065")
            compare(amountToSend.amount, "8065")
        }

        function test_clear() {
            const textField = findChild(amountToSend, "amountToSend_textField")

            amountToSend.setValue("10.5")
            amountToSend.clear()

            compare(amountToSend.amount, "0")
            compare(textField.text, "")
        }

        function test_localeAndDecimalPoint() {
            verify(!!amountToSend)

            // set a different locale, thus a different decimal separator
            amountToSend.locale = Qt.locale("cs_CZ")
            tryCompare(amountToSend.locale, "name", "cs_CZ")
            tryCompare(amountToSend, "decimalPoint", ",") // "," is the default decimal separator for cs_CZ locale

            const textField = findChild(amountToSend, "amountToSend_textField")
            verify(!!textField)

            amountToSend.setValue("2.5")
            tryCompare(textField, "text", "2,5")
            verify(amountToSend.valid)
        }

        function test_pasteChangesAmount() {
            compare(amountToSend.valid, false)
            compare(amountToSend.empty, true)
            compare(amountToSend.amount, "0")

            ClipboardUtils.setText("1.0005")
            const textField = findChild(amountToSend, "amountToSend_textField")
            verify(!!textField)

            verify(textField.canPaste)
            mouseClick(textField)
            keySequence(StandardKey.Paste)
            compare(textField.text, "1.0005")

            compare(amountToSend.valid, true)
            compare(amountToSend.empty, false)
            compare(amountToSend.amount, "1000500000000000000")

            compare(amountChangedSpy.count, 1)
        }
    }
}