/**
 * PS Mobile Panel Gestures — Parcel Selector Mobile Layer
 * map/Mobilki/ps-mobile-panel.js
 *
 * CZEMU TEN PLIK ISTNIEJE:
 * Użytkownicy mobilni oczekują zachowania "bottom sheet" (przesuwanie w dół aby schować).
 * Ten skrypt wykrywa pojawienie się panelu szczegółów i dodaje obsługę gestów.
 *
 * OPTYMALIZACJE (v1.1.0):
 * - requestAnimationFrame: DOM writes batched — brak janku na touchmove
 * - Velocity detection: szybki swipe 40px = dismiss (nie tylko 120px)
 * - cancelAnimationFrame na onEnd — brak "trailing" frame po zwolnieniu
 *
 * @version 1.1.0
 * @package ParcelSelector/Mobilki
 */
;(function() {
    'use strict';

    var ps = window.PS_MOBILE;
    if (!ps || ps.isDesktop) return;

    /**
     * Inicjalizacja gestów dla panelu
     */
    function initGestures(panel) {
        if (!panel || panel.dataset.psGestures) return;
        panel.dataset.psGestures = '1';

        // Niewidoczny uchwyt drag nad treścią panelu
        var handle = document.createElement('div');
        handle.className = 'ps-panel-gesture-handle';
        panel.insertBefore(handle, panel.firstChild);

        var startY     = 0;
        var currentY   = 0;
        var startTime  = 0;
        var isDragging = false;
        var panelHeight = panel.offsetHeight;

        // RAF state — batching DOM writes
        var rafId      = null;
        var pendingDiff = 0;

        // Aplikuje transformację w następnej klatce animacji (nie blokuje touchmove)
        function applyDrag() {
            rafId = null;
            var diff = pendingDiff;
            if (diff > 0) {
                panel.style.transform = 'translateY(' + diff + 'px)';
                panel.style.opacity = String(Math.max(0.5, 1 - (diff / panelHeight)));
            }
        }

        function onStart(e) {
            startY = (e.touches ? e.touches[0].clientY : e.clientY);
            currentY = startY;
            startTime = Date.now();
            isDragging = true;
            panel.style.transition = 'none';
            panelHeight = panel.offsetHeight;
        }

        function onMove(e) {
            if (!isDragging) return;
            currentY = (e.touches ? e.touches[0].clientY : e.clientY);
            pendingDiff = currentY - startY;
            // Batch: jeśli RAF już zaplanowany, tylko zaktualizuj wartość
            if (!rafId) {
                rafId = requestAnimationFrame(applyDrag);
            }
        }

        function onEnd() {
            if (!isDragging) return;
            isDragging = false;

            // Anuluj pending RAF — nie chcemy "trailing" frame po zwolnieniu
            if (rafId) { cancelAnimationFrame(rafId); rafId = null; }

            var diff     = currentY - startY;
            var elapsed  = Math.max(1, Date.now() - startTime);
            var velocity = diff / elapsed; // px/ms — prędkość gestu

            // DISMISS: duże przesunięcie LUB szybki krótki swipe
            if (diff > 120 || (diff > 40 && velocity > 0.4)) {
                panel.style.transition = 'transform 0.5s cubic-bezier(0.16, 1, 0.3, 1), opacity 0.4s ease-out';
                panel.style.transform = 'translateY(' + (panelHeight + 20) + 'px)';
                panel.style.opacity = '0';

                setTimeout(function() {
                    // Anunaki:
                    var ankCancel = panel.querySelector('#ankCancelBtn');
                    if (ankCancel) { ankCancel.click(); return; }
                    // Classic:
                    if (panel.classList.contains('inpost-popup-sidebar')) {
                        panel.style.display = 'none';
                        var lupa = document.querySelector('.ps-mobile-restore-search');
                        if (lupa) lupa.style.display = 'flex';
                        return;
                    }
                    var classicClose = document.querySelector('.inpost-popup-close');
                    if (classicClose && (panel.classList.contains('inpost-customer-form') || panel.classList.contains('inpost-success-panel'))) {
                        classicClose.click();
                        return;
                    }
                    panel.style.display = 'none';
                }, 300);
            } else {
                // POWRÓT — bounce back
                panel.style.transition = 'transform 0.6s cubic-bezier(0.16, 1, 0.3, 1), opacity 0.4s ease';
                panel.style.transform = 'translateY(0)';
                panel.style.opacity = '1';
            }
        }

        // Eventy dotykowe
        handle.addEventListener('touchstart', onStart, { passive: true });
        window.addEventListener('touchmove',  onMove,  { passive: false });
        window.addEventListener('touchend',   onEnd);

        if (window.PS_DEBUG) console.log('[PS Mobilki] Panel gestures (RAF) initialized for:', panel.className);
    }

    // Obserwuj DOM – panele pojawiają się dynamicznie
    var observer = new MutationObserver(function(mutations) {
        mutations.forEach(function(m) {
            m.addedNodes.forEach(function(node) {
                if (node.nodeType !== 1) return;

                if (node.classList.contains('ank-detail-panel') ||
                    node.classList.contains('inpost-popup-sidebar') ||
                    node.classList.contains('inpost-customer-form') ||
                    node.classList.contains('inpost-success-panel')) {
                    initGestures(node);
                }

                var panel = node.querySelector && (
                    node.querySelector('.ank-detail-panel') ||
                    node.querySelector('.inpost-popup-sidebar') ||
                    node.querySelector('.inpost-customer-form') ||
                    node.querySelector('.inpost-success-panel')
                );
                if (panel) initGestures(panel);
            });
        });
    });

    observer.observe(document.body, { childList: true, subtree: true });

})();
