import { useSelect, dispatch } from '@wordpress/data';
import { useEffect } from '@wordpress/element';
import { PAYMENT_STORE_KEY } from '@woocommerce/block-data';
import { extensionCartUpdate } from '@woocommerce/blocks-checkout';
import { registerPlugin } from '@wordpress/plugins';


const checkoutObserver = () => {

    const activePaymentMethod = useSelect((select) => select(PAYMENT_STORE_KEY).getActivePaymentMethod());

    useEffect(() => {
        extensionCartUpdate({
            namespace: 'wc-vindi-gateway-update-total',
            data: {
                payment_method: activePaymentMethod
            },
        });
    }, [activePaymentMethod]);

    function maskByPattern(value, pattern) {
        if (!value) return '';
        const chars = value.replace(/[^a-zA-Z0-9]/g, '').split('');
        let result = '';
        let charIndex = 0;
        for (let i = 0; i < pattern.length && charIndex < chars.length; i++) {
            const p = pattern[i];
            const c = chars[charIndex];
            if (p === '0') {
                if (/\d/.test(c)) {
                    result += c;
                    charIndex++;
                } else {
                    charIndex++;
                    i--;
                }
            } else if (p === 'a') {
                if (/[A-Za-z]/.test(c)) {
                    result += c;
                    charIndex++;
                } else {
                    charIndex++;
                    i--;
                }
            } else if (p === '*') {
                if (/[A-Za-z0-9]/.test(c)) {
                    result += c;
                    charIndex++;
                } else {
                    charIndex++;
                    i--;
                }
            } else {
                result += p;
            }
        }
        return result;
    }

    function applyMasking(address) {
        return {
            "vindi-pagamentos/billing_cpf": maskByPattern(address['vindi-pagamentos/billing_cpf'], "000.000.000-00"),
            "vindi-pagamentos/billing_cnpj": maskByPattern(address['vindi-pagamentos/billing_cnpj'], "**.***.***/****-00"),
        };
    }

    wp.hooks.addAction(
        'experimental__woocommerce_blocks-checkout-set-billing-address',
        'vindi-pagamentos/checkoutmasker',
        (data) => {
            const cartStore = dispatch('wc/store/cart');
            cartStore.setBillingAddress(applyMasking(data.storeCart.billingAddress));
        }
    );

    wp.hooks.addAction(
        'experimental__woocommerce_blocks-checkout-set-shipping-address',
        'vindi-pagamentos/checkoutmasker',
        (data) => {
            const cartStore = dispatch('wc/store/cart');
            cartStore.setShippingAddress(applyMasking(data.storeCart.shippingAddress));
        }
    );
}

registerPlugin('checkout-observer', {
    render: checkoutObserver,
    scope: 'woocommerce-checkout',
});
