<?php
/**
 * Hyvä Themes - https://hyva.io
 * Copyright © Hyvä Themes. All rights reserved.
 * See COPYING.txt for license details.
 */

use Hyva\Theme\Model\ViewModelRegistry;
use Hyva\Theme\ViewModel\HyvaCsp;
use Hyva\Theme\ViewModel\ReCaptcha;
use Hyva\Theme\ViewModel\StoreConfig;
use Magento\Framework\Escaper;
use Magento\Framework\View\Element\Template;

/** @var Template $block */
/** @var Escaper $escaper */
/** @var HyvaCsp $hyvaCsp */
/** @var ViewModelRegistry $viewModels */

/** @var $storeConfig StoreConfig */
$storeConfig = $viewModels->require(StoreConfig::class);
$recaptcha   = $viewModels->require(ReCaptcha::class);
$siteKey     = $storeConfig->getStoreConfig('recaptcha_frontend/type_invisible/public_key');

if (!$siteKey) {
    // No v2 invisible google API credentials configured
    return;
}

$inputElementId       = $block->getData('input_element_id');
$instanceSuffix       = $recaptcha->calcJsInstanceSuffix($inputElementId ?: $block->getData('form_id') ?: 'x');
$grecaptchaInstanceId = "grecaptchaInstance$instanceSuffix";

?>
<?php /* render_script_tag is never set, it is present to force editors to see the code as JavaScript */ ?>
<?php if ($block->getData('render_script_tag')): ?>
<script>
<?php endif; ?>
    if (!this.hasCaptchaToken) {
        window.googleRecaptchaCallback<?= /** @noEscape */ $instanceSuffix ?> = (token) => {
            this.hasCaptchaToken = token.length > 0;
            this.errors = this.hasCaptchaToken ? 0 : 1;
            if (! this.errors) {
                (this.submitForm || $form.submit).call(this);
            } else {
                const error = '<?= $escaper->escapeJs(__('ReCaptcha validation failed, please try again')) ?>';
                if (this.setErrorMessages) {
                    this.setErrorMessages([error])
                    this.displayErrorMessage = true;
                } else {
                    window.dispatchMessages && window.dispatchMessages([{type: "error", text: error}], 5000);
                }
            }
        }

        this.errors = 1;
        grecaptcha.execute(window.<?= /** @noEscape */ $grecaptchaInstanceId ?>);
    }

<?php if ($block->getData('render_script_tag')): ?>
</script>
    <?php $hyvaCsp->registerInlineScript() ?>
<?php endif; ?>
