<?php

defined('ABSPATH') || exit;

class WC_Gateway_iPag_Boleto_Blocks extends WC_Gateway_Abstract_iPag_Blocks
{
    protected $name = 'ipag-gateway_boleto';

    public function get_payment_method_script_handles()
    {
        wp_register_script(
            'ipag-masks',
            WC_iPag_Gateway::plugin_url() . "/js/masks.js?v=" . WC_iPag_Gateway::IPAG_VERSION,
            [],
            WC_iPag_Gateway::IPAG_VERSION,
            false
        );

        wp_enqueue_script('ipag-masks');

        wp_register_script(
            'ipag-cpf-cnpj',
            WC_iPag_Gateway::plugin_url() . "/js/cpf_cnpj.js?v=" . WC_iPag_Gateway::IPAG_VERSION,
            [],
            WC_iPag_Gateway::IPAG_VERSION,
            false
        );

        wp_enqueue_script('ipag-cpf-cnpj');

        if ($this->requirePagSeguro()) {
            $pagseguro_ambiente = $this->gateway->get_option('psenvironment');
            $pagseguro_url = 'https://stc.' . ($pagseguro_ambiente ? '' : 'sandbox.') . 'pagseguro.uol.com.br/pagseguro/api/v2/checkout/pagseguro.directpayment.js';

            wp_register_script(
                'pagseguro-boleto-js',
                $pagseguro_url,
                [],
                null,
                true
            );

            wp_enqueue_script('pagseguro-boleto-js');

            $pagSeguroSession = $this->gateway->pagsegurosession(
                $this->gateway->get_option('pagseguro_email'),
                $this->gateway->get_option('pagseguro_token'),
                $pagseguro_ambiente
            );

            $inline_script = $this->generatePagSeguroScriptInline($pagSeguroSession);
            wp_add_inline_script('pagseguro-boleto-js', $inline_script, 'after');
        }

        $handles = array_merge(
            parent::get_payment_method_script_handles(),
            ['ipag-masks', 'ipag-cpf-cnpj']
        );

        if ($this->requirePagSeguro()) {
            $handles[] = 'pagseguro-boleto-js';
        }

        return $handles;
    }

    public function get_payment_method_data()
    {
        $pagSeguroSession = null;

        $requirePagSeguro = $this->requirePagSeguro();

        $default_message = 'Confirm your order to print the billet.';
        $checkout_message = $this->gateway->get_option('checkout_message');

        if ($checkout_message === $default_message) {
            $checkout_message = __($default_message, 'ipag-gateway');
        }

        if (false !== $this->requirePagSeguro()) {
            $pagSeguroSession = $this->gateway->pagsegurosession(
                $this->gateway->get_option('pagseguro_email'),
                $this->gateway->get_option('pagseguro_token'),
                $this->gateway->get_option('psenvironment')
            );

            if (empty($pagSeguroSession)) {
                $pagSeguroSession = null;
            }
        }

        return array_merge(
            parent::get_payment_method_data(),
            [
                'title' => $this->gateway->get_title(),
                'description' => $checkout_message,
                'pagSeguroSession' => $pagSeguroSession,
                'requirePagSeguro' => $requirePagSeguro,
                'require_document' => $this->gateway->get_option('require_document'),
            ]
        );
    }

    private function requirePagSeguro()
    {
        $bank_emitter = $this->gateway->get_option('bank_emitter');
        $pagseguro_email = $this->gateway->get_option('pagseguro_email');
        $pagseguro_token = $this->gateway->get_option('pagseguro_token');

        return $bank_emitter === 'boletopagseguro' && !empty($pagseguro_email) && !empty($pagseguro_token);
    }

    private function generatePagSeguroScriptInline($pagSeguroSession)
    {
        $session_json = wp_json_encode($pagSeguroSession);

        return <<<JS
                (function() {
                    var sessionId = {$session_json};

                    function initPagSeguroBoleto() {
                        if (typeof PagSeguroDirectPayment === 'undefined') {
                            console.warn('PagSeguro: API ainda não carregada, tentando novamente...');
                            setTimeout(initPagSeguroBoleto, 100);
                            return;
                        }

                        console.log('Inicializando PagSeguro Boleto (Blocks)');
                        PagSeguroDirectPayment.setSessionId(sessionId);

                        PagSeguroDirectPayment.onSenderHashReady(function(response) {
                            if (response.status === 'error') {
                                console.error('Erro ao gerar hash PagSeguro:', response);
                                return;
                            }

                            console.log('Hash PagSeguro gerado com sucesso');
                            window.ipagBoletoHash = response.senderHash;
                        });
                    }
                    initPagSeguroBoleto();
                })();
            JS;
    }
}

add_action(
    'woocommerce_blocks_payment_method_type_registration',
    function ($payment_method_registry) {
        $payment_method_registry->register(
            new \WC_Gateway_iPag_Boleto_Blocks()
        );
    }
);

add_action('woocommerce_store_api_checkout_update_order_from_request', function ($order, $request) {
    if ($order->get_payment_method() !== 'ipag-gateway_boleto') {
        return;
    }

    if (!isset($request['payment_data']) || !is_array($request['payment_data'])) {
        return;
    }

    $ipag_boleto_document_data = null;
    $ipag_pagseguro_hash_data = null;

    foreach ($request['payment_data'] as $item) {
        if (isset($item['key']) && $item['key'] === 'ipag_boleto_document') {
            $ipag_boleto_document_data = $item['value'];
        } elseif (isset($item['key']) && $item['key'] === 'boleto_hashpagseguro') {
            $ipag_pagseguro_hash_data = $item['value'];
        }
    }

    if ($ipag_boleto_document_data && isset($ipag_boleto_document_data)) {
        $document = sanitize_text_field($ipag_boleto_document_data);
        $document = preg_replace('/\D/', '', $document);

        if (!empty($document)) {
            $_POST['ipag_boleto_document'] = $document;
        }
    }

    if ($ipag_pagseguro_hash_data && isset($ipag_pagseguro_hash_data)) {
        $hash = sanitize_text_field($ipag_pagseguro_hash_data);

        if (!empty($hash)) {
            $_POST['boleto_hashpagseguro'] = $hash;
        }
    }
}, 10, 2);

add_filter('rest_pre_dispatch', function ($result, $server, $request) {
    if (!method_exists($request, 'get_route') || !method_exists($request, 'get_method')) {
        return $result;
    }

    if ($request->get_route() !== '/wc/store/v1/checkout' || $request->get_method() !== 'POST') {
        return $result;
    }

    $params = $request->get_json_params();
    $payment_method = is_array($params) ? ($params['payment_method'] ?? '') : '';

    if ($payment_method !== 'ipag-gateway_boleto') {
        return $result;
    }

    if (function_exists('wc_clear_notices')) {
        wc_clear_notices();
    }

    return $result;
}, 10, 3);