<?php
/*
 * Copyright Magmodules.eu. All rights reserved.
 * See COPYING.txt for license details.
 */

declare(strict_types=1);

/** @var Escaper $escaper */

/** @var Template $block */

use Magento\Framework\Escaper;
use Magento\Framework\View\Element\Template;

?>

<div id="loading-mask"></div>

<div id="mollie-order-status"><?= $escaper->escapeHtml(__('Current Status: Loading...')); ?></div>
<div id="mollie-order-error"></div>

<script>
    require([
        'jquery',
        'mage/storage',
        'mage/translate',
        'Magento_Customer/js/customer-data',
        'loader',
    ], function ($, storage, __, customerData) {
        var serviceUrl = '<?= $escaper->escapeJs($block->getData('status_url')); ?>';
        var statusElement = document.getElementById('mollie-order-status');
        var errorElement = document.getElementById('mollie-order-error');
        var waitTime = 100;

        $('#loading-mask').loader({
            'icon': '<?= $escaper->escapeUrl($block->getViewFileUrl('images/loader-1.gif')); ?>'
        }).loader('show');

        var sections = ['cart'];
        customerData.initStorage();
        customerData.invalidate(sections);
        customerData.reload(sections, true);

        function checkOrderStatus() {
            if (waitTime < 1000) {
                waitTime += 100;
            }

            storage.post(serviceUrl).done(function (response) {
                statusElement.style.display = 'block';
                errorElement.style.display = 'none';

                var status = response[0].status;
                if (status === 'processing') {
                    window.location.href = '<?= $escaper->escapeJs($block->getData('redirect_url')); ?>';
                    return;
                }

                statusElement.innerHTML = __('Current Status: %1').replace('%1', status);

                if (status === 'canceled') {
                    $('#loading-mask').loader('hide');
                    $('#mollie-retry-order').show();
                    return;
                }

                setTimeout(checkOrderStatus, waitTime);
            }).fail(function (error) {
                if (error.status === 404 || error.status === 400) {
                    setTimeout(checkOrderStatus, waitTime);
                    return;
                }

                console.error('Received error: ', error);

                statusElement.style.display = 'none';
                errorElement.style.display = 'block';
                errorElement.innerHTML = __('Something went wrong while fetching order. Retrying...');
            })
        }

        checkOrderStatus();

        // If we haven't found an order after 60 seconds redirect the user to the cart.
        setTimeout(
            () => window.location = '<?= $escaper->escapeJs($block->getData('redirect_to_cart_url')); ?>',
            60 * 1000
        );
    })
</script>
