// source --> https://insperia.ru/wp-content/themes/twentytwentyfour/js/optimization/ajax-proxy.js?ver=1781782620 
(function () {
    'use strict';

    const PROXY_URL = `${ajaxProxy.PROXY_URL}/api/v1/actions`;

    const PROXY_ACTIONS = new Set([
        'get_subject_cards',
        'get_all_subject_cards',
        'get_subject_card_by_link',
        'get_places_in_banner',
        'get_place_by_page_url',
    ]);

    const VOLATILE_KEYS = new Set(['security']);

    const parseBody = (body) => {
        if (!body) return { action: null, params: {} };
        const p = body instanceof URLSearchParams
            ? body
            : new URLSearchParams(typeof body === 'string' ? body : '');
        return { action: p.get('action'), params: Object.fromEntries(p) };
    };

    const needsProxy = (url, action) =>
        typeof url === 'string' &&
        url.includes('admin-ajax.php') &&
        PROXY_ACTIONS.has(action);

    const buildAttributes = (params) =>
        Object.entries(params).map(([key, value]) => ({
            key,
            value,
            volatile: VOLATILE_KEYS.has(key),
        }));

    const proxyRequest = (action, body) => {
        const { params } = parseBody(body);
        const attributes = buildAttributes(params);
        // console.log(`[AJAX Proxy] "${action}" ${PROXY_URL}`, { attributes });
        return window._originalFetch(PROXY_URL, {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({ attributes }),
        });
    };

    if (!window._originalFetch) {
        window._originalFetch = window.fetch;
    }

    window.fetch = function (url, options = {}) {
        const { action } = parseBody(options.body);
        if (needsProxy(url, action)) return proxyRequest(action, options.body);
        return window._originalFetch.apply(this, arguments);
    };

    if (!window.jQuery) return;

    jQuery.ajaxPrefilter(function (options) {
        const rawData = options.data && typeof options.data === 'object'
            ? new URLSearchParams(options.data).toString()
            : options.data;

        const { action, params } = parseBody(rawData);
        if (!needsProxy(options.url, action)) return;

        Object.assign(options, {
            url: PROXY_URL,
            type: 'POST',
            contentType: 'application/json',
            data: JSON.stringify({ attributes: buildAttributes(params) }),
            processData: false,
        });
    });
})();