// source --> https://insperia.ru/wp-content/themes/twentytwentyfour/js/optimization/ajax-proxy.js?ver=1784198652 
(function () {
    'use strict';

    // Фоллбэк на случай, если страница отдана из кэша nginx старым PHP,
    // который ещё не слал AJAX_URL. Тот же origin, поэтому путь достаточно.
    const AJAX_URL = (typeof ajaxProxy !== 'undefined' && ajaxProxy.AJAX_URL)
        || '/wp-admin/admin-ajax.php';

    // Кэшируются на nginx. Список обязан совпадать с map $arg_action $wp_ajax_nocache
    // в конфиге nginx — иначе запрос уйдёт мимо кэша.
    const CACHED_ACTIONS = new Set([
        'get_subject_cards',
        'get_all_subject_cards',
        'get_subject_card_by_link',
        'get_places_in_banner',
        'get_place_by_page_url',
    ]);

    // nginx строит ключ кэша из action/link/page_url. WP-nonce у каждого посетителя
    // свой, в ключ не входит, а хендлеры его не проверяют — не шлём вовсе.
    const DROPPED_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 needsCache = (url, action) =>
        typeof url === 'string' &&
        url.includes('admin-ajax.php') &&
        CACHED_ACTIONS.has(action);

    const buildUrl = (params) => {
        const qs = new URLSearchParams();
        Object.entries(params).forEach(([key, value]) => {
            if (!DROPPED_KEYS.has(key)) qs.append(key, value);
        });
        return `${AJAX_URL}?${qs.toString()}`;
    };

    if (!window._originalFetch) {
        window._originalFetch = window.fetch;
    }

    window.fetch = function (url, options = {}) {
        const { action, params } = parseBody(options.body);
        if (!needsCache(url, action)) return window._originalFetch.apply(this, arguments);
        return window._originalFetch(buildUrl(params), { method: 'GET' });
    };

    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 (!needsCache(options.url, action)) return;

        Object.assign(options, {
            url: buildUrl(params),
            type: 'GET',
            data: undefined,
            processData: false,
            // иначе jQuery добавит _=<timestamp> и каждый запрос станет уникальным
            cache: true,
        });
    });
})();