// La Paguita - Minijuego: Huye de la Policía (QTE)

(function () {
    const DIRECTIONS = ['up', 'down', 'left', 'right'];
    const ARROWS = { up: '⬆️', down: '⬇️', left: '⬅️', right: '➡️' };
    const TOTAL_PROMPTS = 5;
    const BASE_TIME_MS = 1400;
    const TIME_DECREASE_MS = 100; // Each prompt gets slightly faster

    // Personajes que no corren: el "huye" no pega con su perfil. Se auto-resuelve
    // con un nivel y un mensajito temático, sin QTE.
    const AUTO_RESOLVE = {
        maricarmen: { nivel: 'escape',  mensaje: '🛡️ "Soy víctima VioGen" — nadie se atreve' },
        enchufada:  { nivel: 'escape',  mensaje: '📞 Llamas al tío concejal — problema resuelto' },
        heredia:    { nivel: 'escape',  mensaje: '👪 El clan te saca de la esquina en 10 segundos' },
        jubilado:   { nivel: 'partial', mensaje: '👴 Te haces el sordo y el despistado — te libras a medias' },
        paco:       { nivel: 'partial', mensaje: '🛋️ "Yo no he sido" — cuela a medias' }
    };

    function init(area, contexto, onComplete) {
        const personaje = (typeof getPersonajeActual === 'function') ? getPersonajeActual() : null;
        const auto = personaje && AUTO_RESOLVE[personaje.id];
        if (auto) {
            area.innerHTML = `<div style="padding:2.5rem;text-align:center;font-size:1.3rem">${auto.mensaje}</div>`;
            updateMinigameScore(auto.nivel === 'escape' ? '¡A salvo!' : 'A medias...');
            setTimeout(() => {
                onComplete({
                    tipo: 'huye_policia',
                    nivel: auto.nivel,
                    hits: auto.nivel === 'escape' ? TOTAL_PROMPTS : Math.ceil(TOTAL_PROMPTS * 0.7),
                    total: TOTAL_PROMPTS,
                    perfecto: false,
                    contexto: contexto,
                    autoResuelto: true
                });
            }, 1400);
            return;
        }

        const sequence = [];
        for (let i = 0; i < TOTAL_PROMPTS; i++) {
            sequence.push(DIRECTIONS[Math.floor(Math.random() * DIRECTIONS.length)]);
        }

        let currentIndex = 0;
        let hits = 0;
        let promptTimer = null;
        let barAnimFrame = null;
        let promptStart = 0;
        let inputLocked = false;

        // Build DOM
        area.innerHTML = `
            <div class="huye-progress" id="huye-progress"></div>
            <div class="huye-prompt" id="huye-prompt"></div>
            <div class="huye-timer-bar"><div class="huye-timer-fill" id="huye-fill"></div></div>
            <div class="huye-buttons">
                <button class="huye-btn" data-dir="up">${ARROWS.up}</button>
                <button class="huye-btn" data-dir="left">${ARROWS.left}</button>
                <button class="huye-btn" data-dir="right">${ARROWS.right}</button>
                <button class="huye-btn" data-dir="down">${ARROWS.down}</button>
            </div>
        `;

        const promptEl = document.getElementById('huye-prompt');
        const fillEl = document.getElementById('huye-fill');
        const progressEl = document.getElementById('huye-progress');

        // Render progress dots
        function renderProgress() {
            let html = '';
            for (let i = 0; i < TOTAL_PROMPTS; i++) {
                let cls = '';
                if (i < currentIndex) cls = sequence[i] === '__hit__' ? 'ok' : (hits > 0 ? 'ok' : 'fail');
                if (i === currentIndex) cls = 'current';
                // Track actual results
                html += `<span class="huye-dot ${cls}" data-idx="${i}"></span>`;
            }
            progressEl.innerHTML = html;
        }

        // Result tracking per-prompt
        const results = [];

        function updateDots() {
            const dots = progressEl.querySelectorAll('.huye-dot');
            results.forEach((r, i) => {
                if (dots[i]) {
                    dots[i].className = 'huye-dot ' + (r ? 'ok' : 'fail');
                }
            });
            if (currentIndex < TOTAL_PROMPTS && dots[currentIndex]) {
                dots[currentIndex].classList.add('current');
            }
        }

        function showPrompt() {
            if (currentIndex >= TOTAL_PROMPTS) {
                finish();
                return;
            }

            inputLocked = false;
            const dir = sequence[currentIndex];
            promptEl.textContent = ARROWS[dir];
            promptEl.className = 'huye-prompt';
            updateDots();

            const timeForThis = BASE_TIME_MS - (currentIndex * TIME_DECREASE_MS);
            promptStart = performance.now();

            // Animate timer bar
            fillEl.style.width = '100%';
            fillEl.className = 'huye-timer-fill';

            if (barAnimFrame) cancelAnimationFrame(barAnimFrame);
            function animateBar() {
                const elapsed = performance.now() - promptStart;
                const pct = Math.max(0, 1 - elapsed / timeForThis) * 100;
                fillEl.style.width = pct + '%';
                if (pct < 30) fillEl.classList.add('urgent');
                if (elapsed < timeForThis) {
                    barAnimFrame = requestAnimationFrame(animateBar);
                }
            }
            barAnimFrame = requestAnimationFrame(animateBar);

            // Timeout = miss
            promptTimer = setTimeout(() => {
                if (inputLocked) return;
                handleInput(null);
            }, timeForThis);

            updateMinigameTimer((TOTAL_PROMPTS - currentIndex) * (timeForThis / 1000));
        }

        function handleInput(dir) {
            if (inputLocked || currentIndex >= TOTAL_PROMPTS) return;
            inputLocked = true;
            clearTimeout(promptTimer);
            if (barAnimFrame) cancelAnimationFrame(barAnimFrame);

            const expected = sequence[currentIndex];
            const correct = dir === expected;

            if (correct) {
                hits++;
                promptEl.classList.add('flash-ok');
            } else {
                promptEl.classList.add('flash-fail');
            }
            results.push(correct);
            currentIndex++;
            updateDots();

            setTimeout(showPrompt, 350);
        }

        // Button clicks
        area.querySelectorAll('.huye-btn').forEach(btn => {
            btn.addEventListener('click', (e) => {
                e.preventDefault();
                handleInput(btn.dataset.dir);
            });
        });

        // Keyboard
        function onKeyDown(e) {
            const keyMap = {
                'ArrowUp': 'up', 'ArrowDown': 'down',
                'ArrowLeft': 'left', 'ArrowRight': 'right',
                'w': 'up', 's': 'down', 'a': 'left', 'd': 'right'
            };
            const dir = keyMap[e.key];
            if (dir) {
                e.preventDefault();
                handleInput(dir);
            }
        }
        document.addEventListener('keydown', onKeyDown);

        function finish() {
            document.removeEventListener('keydown', onKeyDown);
            clearTimeout(promptTimer);
            if (barAnimFrame) cancelAnimationFrame(barAnimFrame);

            // Character-specific escape bonus: some importados/okupa son más escurridizos
            const personaje = getPersonajeActual();
            let bonusHits = 0;
            if (personaje) {
                switch (personaje.id) {
                    case 'bogdan': bonusHits = 1; break; // Europeo, sin miedo a deportación
                    case 'okupa':  bonusHits = 1; break; // Joven escapista profesional
                    case 'mena':   bonusHits = 1; break; // Protegido por ley, los agentes dudan
                }
            }
            const effectiveHits = Math.max(0, Math.min(TOTAL_PROMPTS, hits + bonusHits));
            const ratio = effectiveHits / TOTAL_PROMPTS;
            const perfecto = hits === TOTAL_PROMPTS;

            let nivel; // 'escape', 'partial', 'caught'
            if (ratio >= 1) nivel = 'escape';
            else if (ratio > 0.5) nivel = 'partial';
            else nivel = 'caught';

            // Show result briefly
            const labels = {
                escape: '🏃 ¡HAS ESCAPADO!',
                partial: '😰 Casi te pillan...',
                caught: '🚔 ¡PILLADO!'
            };
            promptEl.textContent = labels[nivel];
            promptEl.style.fontSize = '1.2rem';
            fillEl.style.width = '0%';
            updateMinigameScore(`${hits}/${TOTAL_PROMPTS} aciertos`);

            setTimeout(() => {
                onComplete({
                    tipo: 'huye_policia',
                    nivel: nivel,
                    hits: hits,
                    total: TOTAL_PROMPTS,
                    perfecto: perfecto,
                    contexto: contexto
                });
            }, 1200);
        }

        // Start first prompt
        renderProgress();
        setTimeout(showPrompt, 600);
    }

    registrarMinijuego('huye_policia', init);
})();
