/**
 * PS Mobile Detect — Parcel Selector Mobile Layer
 * map/Mobilki/ps-mobile-detect.js
 *
 * CZEMU TEN PLIK ISTNIEJE:
 * API zwraca 82 000+ punktów dla Polski. Desktop GPU to obsługuje.
 * Android WebView / Safari Mobile milcząco crashuje przy renderowaniu
 * takiej ilości markerów Leaflet — punkty nigdy nie pojawiają się na mapie.
 *
 * ROZWIĄZANIE:
 * Wykrywamy urządzenie i ustawiamy limit punktów ZANIM silniki map
 * zainicjalizują się. Silniki czytają te wartości z window.PS_MOBILE
 * i window.inpostPopupConfig (Classic) / window.ANUNAKI_MOBILE_LIMIT (Anunaki).
 *
 * LIMITY:
 *   Desktop  → bez limitu (cały dataset)
 *   Tablet   → 8 000 punktów
 *   Mobile   → 3 000 punktów
 *
 * CLUSTER RADIUS:
 *   Wspólna formuła górska (identyczna z desktop maxClusterRadius):
 *   zoom ≤6 → 130px, zoom 9 → 300px (peak), zoom 12 → 60px
 *   Zapewnia identyczne zachowanie klastrów niezależnie od urządzenia.
 *
 * ŁADOWANIE:
 * Musi być załadowany PRZED intro-popup.js i anunaki-popup.js.
 * page-parcelselector-demo.php: wp_enqueue_script z parametrem `in_footer: false`
 *
 * @version 1.1.0
 * @package ParcelSelector/Mobilki
 */
;(function() {
    'use strict';

    // ─── Detekcja urządzenia ──────────────────────────────────────────────────

    var ua         = navigator.userAgent || '';
    var uaMobile   = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(ua);
    var uaTablet   = /(tablet|ipad|playbook|silk)|(android(?!.*mobi))/i.test(ua);
    var isTouch    = ('ontouchstart' in window) || (navigator.maxTouchPoints > 0);
    var screenW    = window.screen.width  || window.innerWidth  || 1280;
    var screenH    = window.screen.height || window.innerHeight || 800;
    var pixelRatio = window.devicePixelRatio || 1;
    var shortSide  = Math.min(screenW, screenH);

    var urlParams  = new URLSearchParams(window.location.search);
    var forceMobile = urlParams.get('mobile') === '1' || urlParams.get('mobile') === 'true';

    // Tablet: touch/UA + szerokość 600–1024px
    // Mobile: touch/UA + szerokość < 600px
    var isTablet = (isTouch || uaTablet) && shortSide >= 600 && shortSide < 1024;
    var isMobile = forceMobile || ((isTouch || uaMobile) && shortSide < 600);
    var isDesktop = !isMobile && !isTablet;

    // ─── Limity punktów ──────────────────────────────────────────────────────

    var LIMITS = {
        desktop : 0,     // 0 = bez limitu
        tablet  : 8000,  // zwiększone z 3000 — modern tablets handle this fine
        mobile  : 3000   // zwiększone z 1000 — więcej punktów = lepsza mapa
    };

    var pointLimit = isDesktop ? LIMITS.desktop
                   : isTablet  ? LIMITS.tablet
                   : LIMITS.mobile;

    // ─── Cluster radius — wspólna formuła górska (identyczna z anunaki-popup.js) ──
    // Szczyt przy zoom 9 (agresywne klastrowanie podczas nawigacji).
    // Małe wartości przy zoom 6 (widok kraju) i zoom 12 (dzielnice "EKSTRA").
    // FIX #5: zamiast hardcoded 80/70/60px — dynamiczna formuła per-zoom.
    function getClusterRadius(zoom) {
        // Mountain formula — matches desktop maxClusterRadius exactly.
        // zoom 6 (country view): 130px — clean Poland overview
        // zoom 9: 300px peak — aggressive mid-nav merging
        // zoom 12+: 60px — fine neighborhood detail
        if (zoom <= 6) { return 130; }
        if (zoom <= 9) { return Math.min(300, 130 + (zoom - 6) * 57); }
        return Math.max(60, 300 - (zoom - 9) * 77);
    }

    // Wartość statyczna dla backward compat (Classic engine, zoom neutralny)
    var clusterRadius = getClusterRadius(6); // 130px — wartość dla zoom 6 (widok kraju)

    // ─── Globalny obiekt PS_MOBILE ────────────────────────────────────────────

    window.PS_MOBILE = {
        isMobile     : isMobile,
        isTablet     : isTablet,
        isDesktop    : isDesktop,
        isTouch      : isTouch,
        screenWidth  : screenW,
        screenHeight : screenH,
        pixelRatio   : pixelRatio,
        pointLimit   : pointLimit,    // 0 = bez limitu
        clusterRadius: clusterRadius, // backward compat — static zoom-6 value

        /** Dynamiczny cluster radius per zoom — ta sama formuła co desktop. */
        getClusterRadius: getClusterRadius,

        /** Zwraca true jeśli limit punktów powinien być zastosowany */
        hasLimit: function() {
            return pointLimit > 0;
        },

        /** Slice array do limitu (jeśli obowiązuje) */
        applyLimit: function(arr) {
            if (!pointLimit || !arr) return arr;
            return arr.length > pointLimit ? arr.slice(0, pointLimit) : arr;
        },

        /** Czytelny opis urządzenia (do WooCommerce meta) */
        deviceType: function() {
            return isMobile ? 'Mobilki' : isTablet ? 'Tablet' : 'Desktop PC';
        }
    };

    // ─── Patch: inpostPopupConfig (Classic engine) ───────────────────────────
    // intro-popup.js czyta window.inpostPopupConfig.initialPointsLimit
    // Ustawiamy go PRZED załadowaniem intro-popup.js

    if (isMobile || isTablet) {
        window.inpostPopupConfig = window.inpostPopupConfig || {};
        // Ustaw tylko jeśli nie było wcześniej ustawione (nie nadpisuj wartości admina)
        if (!window.inpostPopupConfig.initialPointsLimit) {
            window.inpostPopupConfig.initialPointsLimit = pointLimit;
        }
        // Wyłącz lazyLoadOnZoom na mobile — może powodować nieprzewidywalne doładowania
        if (window.inpostPopupConfig.lazyLoadOnZoom === undefined) {
            window.inpostPopupConfig.lazyLoadOnZoom = false;
        }
    }

    // ─── Console info ────────────────────────────────────────────────────────

    var _style = 'background:#f97316;color:white;font-weight:bold;padding:2px 6px;border-radius:3px';
    if (window.PS_DEBUG) console.log(
        '%c[PS Mobilki]%c device=%s | pointLimit=%s | clusterRadius(z6)=%s | touch=%s',
        _style, 'color:inherit',
        window.PS_MOBILE.deviceType(),
        pointLimit || '∞',
        clusterRadius,
        isTouch
    );

})();
