/**
 * Invoice Ninja (https://invoiceninja.com).
 *
 * @link https://github.com/invoiceninja/invoiceninja source repository
 *
 * @copyright Copyright (c) 2021. Invoice Ninja LLC (https://invoiceninja.com)
 *
 * @license https://www.elastic.co/licensing/elastic-license
 */

class _Mollie {
    constructor() {
        this.mollie = Mollie(
            document.querySelector('meta[name=mollie-profileId]')?.content,
            {
                testmode: document.querySelector('meta[name=mollie-testmode]')
                    ?.content,
                locale: 'en_US',
            }
        );
    }

    createCardHolderInput() {
        let cardHolder = this.mollie.createComponent('cardHolder');
        cardHolder.mount('#card-holder');

        let cardHolderError = document.getElementById('card-holder-error');

        cardHolder.addEventListener('change', function(event) {
            if (event.error && event.touched) {
                cardHolderError.textContent = event.error;
            } else {
                cardHolderError.textContent = '';
            }
        });

        return this;
    }

    createCardNumberInput() {
        let cardNumber = this.mollie.createComponent('cardNumber');
        cardNumber.mount('#card-number');

        let cardNumberError = document.getElementById('card-number-error');

        cardNumber.addEventListener('change', function(event) {
            if (event.error && event.touched) {
                cardNumberError.textContent = event.error;
            } else {
                cardNumberError.textContent = '';
            }
        });

        return this;
    }

    createExpiryDateInput() {
        let expiryDate = this.mollie.createComponent('expiryDate');
        expiryDate.mount('#expiry-date');

        let expiryDateError = document.getElementById('expiry-date-error');

        expiryDate.addEventListener('change', function(event) {
            if (event.error && event.touched) {
                expiryDateError.textContent = event.error;
            } else {
                expiryDateError.textContent = '';
            }
        });

        return this;
    }

    createCvvInput() {
        let verificationCode = this.mollie.createComponent('verificationCode');
        verificationCode.mount('#cvv');

        let verificationCodeError = document.getElementById('cvv-error');

        verificationCode.addEventListener('change', function(event) {
            if (event.error && event.touched) {
                verificationCodeError.textContent = event.error;
            } else {
                verificationCodeError.textContent = '';
            }
        });

        return this;
    }

    handlePayNowButton() {
        document.getElementById('pay-now').disabled = true;

        if (document.querySelector('input[name=token]').value !== '') {
            document.querySelector('input[name=gateway_response]').value = '';

            return document.getElementById('server-response').submit();
        }

        this.mollie.createToken().then(function(result) {
            let token = result.token;
            let error = result.error;

            if (error) {
                document.getElementById('pay-now').disabled = false;

                let errorsContainer = document.getElementById('errors');
                errorsContainer.innerText = error.message;
                errorsContainer.hidden = false;

                return;
            }

            let tokenBillingCheckbox = document.querySelector(
                'input[name="token-billing-checkbox"]:checked'
            );

            if (tokenBillingCheckbox) {
                document.querySelector('input[name="store_card"]').value =
                    tokenBillingCheckbox.value;
            }

            document.querySelector(
                'input[name=gateway_response]'
            ).value = token;
            document.querySelector('input[name=token]').value = '';

            document.getElementById('server-response').submit();
        });
    }

    handle() {
        this.createCardHolderInput()
            .createCardNumberInput()
            .createExpiryDateInput()
            .createCvvInput();

        Array.from(
            document.getElementsByClassName('toggle-payment-with-token')
        ).forEach((element) =>
            element.addEventListener('click', (element) => {
                document
                    .getElementById('mollie--payment-container')
                    .classList.add('hidden');
                document.getElementById('save-card--container').style.display =
                    'none';
                document.querySelector('input[name=token]').value =
                    element.target.dataset.token;
            })
        );

        document
            .getElementById('toggle-payment-with-credit-card')
            .addEventListener('click', (element) => {
                document
                    .getElementById('mollie--payment-container')
                    .classList.remove('hidden');
                document.getElementById('save-card--container').style.display =
                    'grid';
                document.querySelector('input[name=token]').value = '';
            });

        document
            .getElementById('pay-now')
            .addEventListener('click', () => this.handlePayNowButton());
    }
}

new _Mollie().handle();
