/**
 * config.js — YouTube Player
 * קונפיגורציה גלובלית + אתחול האפליקציה
 */

// כל הקריאות ל-API עוברות דרך השרת המקומי (server.py)
const ENDPOINTS = {
    YOUTUBE: '/api/youtube/fetch-all',
    // נתיבים חדשים עבור מנגנון ההורדות
    DOWNLOAD_START: '/api/download/start',
    DOWNLOAD_STATUS: '/api/download/status',
    DOWNLOAD_CANCEL: '/api/download/cancel',
    DOWNLOAD_CLEAR: '/api/download/clear',
    FFMPEG_STATUS: '/api/ffmpeg/status'
};

// State גלובלי
let currentChannelId  = null;
let appDataCache      = [];
let searchMode        = 'channels';
let isLocalDeepSearch = false;

// ─── YouTube Max Episodes ─────────────────────────────────────
function saveYtMaxEpisodes() {
    const input = document.getElementById('ytMaxEpisodesInput');
    if (!input) return;
    const val = parseInt(input.value);
    const safe = isNaN(val) || val < 0 ? 1500 : val;
    localStorage.setItem('yt_max_episodes', safe);
    showToast(safe === 0 ? 'ייטענו כל הסרטונים ✓' : `מגבלה נשמרה: ${safe} ✓`, 'success');
}

function loadYtMaxEpisodes() {
    const input = document.getElementById('ytMaxEpisodesInput');
    if (!input) return;
    const saved = localStorage.getItem('yt_max_episodes');
    input.value = saved !== null ? saved : '1500';
}

// ─── Toast ───────────────────────────────────────────────────
function showToast(msg, type = 'info') {
    const container = document.getElementById('toastContainer');
    if (!container) return;
    const toast = document.createElement('div');
    const colors = { success: 'bg-emerald-600', error: 'bg-red-600', info: 'bg-zinc-700' };
    toast.className = `${colors[type] || colors.info} text-white text-sm font-medium px-4 py-2.5 rounded-xl shadow-lg animate-slide-up pointer-events-auto`;
    toast.textContent = msg;
    container.appendChild(toast);
    setTimeout(() => { toast.style.opacity = '0'; toast.style.transition = 'opacity 0.3s'; setTimeout(() => toast.remove(), 300); }, 2800);
}

// ─── Helpers ─────────────────────────────────────────────────
function cleanHTML(str) {
    if (!str) return '';
    const temp = document.createElement('div');
    temp.innerHTML = str;
    return temp.textContent || temp.innerText || '';
}

// ─── Settings Panel ──────────────────────────────────────────
function toggleSettings() {
    const panel = document.getElementById('settingsPanel');
    const isHidden = panel.classList.contains('hidden');
    panel.classList.toggle('hidden');
    
    // הרצת בדיקות אוטומטית כשהחלון נפתח
    if (isHidden) {
        if (typeof checkYtdlpVersion === 'function') checkYtdlpVersion();
        if (typeof checkFfmpegStatus === 'function') checkFfmpegStatus();
    }
}

function toggleBackupSubmenu(btn) {
    const menu  = document.getElementById('backupSubmenu');
    const arrow = document.getElementById('backupMenuArrow');
    const isHidden = menu.classList.contains('hidden');
    menu.classList.toggle('hidden');
    menu.style.display = isHidden ? 'flex' : 'none';
    arrow.style.transform = isHidden ? 'rotate(180deg)' : 'rotate(0deg)';
}

// ─── yt-dlp Manager ──────────────────────────────────────────

function _ytdlpEl() {
    return {
        icon:        document.getElementById('ytdlpStatusIcon'),
        text:        document.getElementById('ytdlpVersionText'),
        progressWrap:document.getElementById('ytdlpProgressWrap'),
        progressBar: document.getElementById('ytdlpProgressBar'),
        progressMsg: document.getElementById('ytdlpProgressMsg'),
    };
}

function _ytdlpSetIcon(state) {
    // state: 'loading' | 'ok' | 'update' | 'missing' | 'error' | 'downloading'
    const { icon } = _ytdlpEl();
    if (!icon) return;
    icon.onclick = null;
    icon.title   = '';

    const styles = {
        loading:     { bg:'rgba(124,58,237,0.12)', color:'#a78bfa', html:'<i class="fas fa-spinner fa-spin"></i>' },
        ok:          { bg:'rgba(34,197,94,0.12)',  color:'#4ade80', html:'<i class="fas fa-check-circle"></i>' },
        update:      { bg:'rgba(251,146,60,0.15)', color:'#fb923c', html:'<i class="fas fa-arrow-circle-up"></i>', action: ()=>_ytdlpStartDownload(true) },
        missing:     { bg:'rgba(245,158,11,0.15)', color:'#fbbf24', html:'<i class="fas fa-download"></i>',       action: ()=>_ytdlpStartDownload(false) },
        error:       { bg:'rgba(239,68,68,0.12)',  color:'#f87171', html:'<i class="fas fa-exclamation-circle"></i>' },
        downloading: { bg:'rgba(124,58,237,0.12)', color:'#a78bfa', html:'<i class="fas fa-spinner fa-spin"></i>' },
    };
    const s = styles[state] || styles.error;
    icon.style.cssText = `width:28px; height:28px; border-radius:50%; display:flex; flex-shrink:0;
        align-items:center; justify-content:center; margin-right:6px; font-size:12px;
        background:${s.bg}; color:${s.color}; transition:all 0.2s;
        cursor:${s.action ? 'pointer' : 'default'};`;
    icon.innerHTML = s.html;

    if (s.action) {
        icon.onclick = s.action;
        icon.title   = state === 'update' ? 'לחץ לעדכון' : 'לחץ להורדה';
        icon.onmouseover = () => { icon.style.transform = 'scale(1.15)'; };
        icon.onmouseout  = () => { icon.style.transform = 'scale(1)'; };
    }
}

async function checkYtdlpVersion() {
    const { icon, text, progressWrap, progressBar, progressMsg } = _ytdlpEl();

    // איפוס
    if (text)        { text.style.display = 'block'; text.innerHTML = ''; }
    if (progressWrap){ progressWrap.style.display = 'none'; }
    if (progressBar) { progressBar.style.width = '0%'; progressBar.style.background = 'linear-gradient(90deg,var(--accent),#a855f7)'; }
    _ytdlpSetIcon('loading');

    try {
        const status = await fetch('/api/ytdlp/status').then(r => r.json());

        if (!status.exists) {
            _ytdlpSetIcon('missing');
            text.innerHTML = '<span style="color:#fbbf24; font-weight:600;">yt-dlp.exe לא נמצא</span><br><span style="color:var(--text-muted); font-size:10px;">לחץ על האייקון להורדה</span>';
            return;
        }

        const data = await fetch('/api/ytdlp/version').then(r => r.json());
        if (data.error) {
            _ytdlpSetIcon('error');
            text.innerHTML = `<span style="color:#f87171;">שגיאה: ${data.error}</span>`;
            return;
        }

        const hasUpdate = data.latest && data.current !== data.latest;
        if (hasUpdate) {
            _ytdlpSetIcon('update');
            text.innerHTML = `גרסה: <strong>${data.current}</strong> &nbsp;→&nbsp; <span style="color:#fb923c; font-weight:700;">${data.latest}</span> זמינה — לחץ על האייקון`;
        } else {
            _ytdlpSetIcon('ok');
            text.innerHTML = `גרסה: <strong>${data.current}</strong> &nbsp;<span style="color:#4ade80; font-size:10px;">✓ עדכני</span>`;
        }
    } catch(e) {
        _ytdlpSetIcon('error');
        if (text) text.innerHTML = `<span style="color:#f87171;">שגיאה: ${e.message}</span>`;
    }
}

function _ytdlpStartDownload(isUpdate) {
    const { progressWrap, progressBar, progressMsg } = _ytdlpEl();
    const text = document.getElementById('ytdlpVersionText');

    _ytdlpSetIcon('downloading');
    if (progressWrap) { progressWrap.style.display = 'flex'; }
    if (progressBar)  { progressBar.style.width = '0%'; progressBar.style.background = 'linear-gradient(90deg,var(--accent),#a855f7)'; }
    if (progressMsg)  { progressMsg.textContent = isUpdate ? 'מתחיל עדכון...' : 'מתחיל הורדה...'; }
    if (text)         { text.innerHTML = isUpdate ? 'מוריד עדכון...' : 'מוריד yt-dlp...'; }

    const es = new EventSource('/api/ytdlp/download');
    es.onmessage = (e) => {
        const { pct, msg } = JSON.parse(e.data);
        if (progressBar) progressBar.style.width = Math.max(0, pct) + '%';
        if (progressMsg) progressMsg.textContent = msg;

        if (pct === 100) {
            progressBar.style.background = 'linear-gradient(90deg,#4ade80,#22c55e)';
            es.close();
            setTimeout(() => checkYtdlpVersion(), 1200);
        } else if (pct === -1) {
            _ytdlpSetIcon('error');
            if (text) text.innerHTML = `<span style="color:#f87171;">${msg}</span>`;
            // כפתור ניסיון חוזר
            const icon = document.getElementById('ytdlpStatusIcon');
            if (icon) { icon.style.cursor = 'pointer'; icon.onclick = () => _ytdlpStartDownload(isUpdate); }
            es.close();
        }
    };
    es.onerror = () => {
        _ytdlpSetIcon('error');
        if (progressMsg) progressMsg.innerHTML = '<span style="color:#f87171;">חיבור נותק — לחץ לניסיון חוזר</span>';
        const icon = document.getElementById('ytdlpStatusIcon');
        if (icon) icon.onclick = () => _ytdlpStartDownload(isUpdate);
        es.close();
    };
}

// שמירה לתאימות אחורה עם ה-HTML הישן
function downloadYtdlp() { _ytdlpStartDownload(false); }
function updateYtdlp()   { _ytdlpStartDownload(true);  }

// ─── FFmpeg Manager ──────────────────────────────────────────

function _ffmpegEl() {
    return {
        icon: document.getElementById('ffmpegStatusIcon'),
        text: document.getElementById('ffmpegStatusText')
    };
}

function _ffmpegSetIcon(state) {
    const { icon } = _ffmpegEl();
    if (!icon) return;
    icon.onclick = null;
    icon.title   = '';

    const styles = {
        loading: { bg:'rgba(124,58,237,0.12)', color:'#a78bfa', html:'<i class="fas fa-spinner fa-spin"></i>' },
        ok:      { bg:'rgba(34,197,94,0.12)',  color:'#4ade80', html:'<i class="fas fa-check-circle"></i>' },
        missing: { bg:'rgba(239,68,68,0.12)',  color:'#f87171', html:'<i class="fas fa-times-circle"></i>' },
        error:   { bg:'rgba(239,68,68,0.12)',  color:'#f87171', html:'<i class="fas fa-exclamation-circle"></i>' },
    };
    const s = styles[state] || styles.error;
    icon.style.cssText = `width:28px; height:28px; border-radius:50%; display:flex; flex-shrink:0;
        align-items:center; justify-content:center; margin-right:6px; font-size:12px;
        background:${s.bg}; color:${s.color}; transition:all 0.2s; cursor:default;`;
    icon.innerHTML = s.html;
}

async function checkFfmpegStatus() {
    const { icon, text } = _ffmpegEl();
    if (text) { text.style.display = 'block'; text.innerHTML = ''; }
    _ffmpegSetIcon('loading');

    try {
        const status = await fetch(ENDPOINTS.FFMPEG_STATUS).then(r => r.json());

        if (status.exists) {
            _ffmpegSetIcon('ok');
            if (text) text.innerHTML = `<strong>ffmpeg.exe</strong> &nbsp;<span style="color:#4ade80; font-size:10px;">✓ קיים ומוכן למיזוג</span>`;
        } else {
            _ffmpegSetIcon('missing');
            if (text) text.innerHTML = `<span style="color:#f87171; font-weight:600;">ffmpeg.exe חסר!</span><br><span style="color:var(--text-muted); font-size:10px;">הורדות איכותיות ירדו ללא קול (מומלץ למקם בתיקייה)</span>`;
        }
    } catch(e) {
        _ffmpegSetIcon('error');
        if (text) text.innerHTML = `<span style="color:#f87171;">שגיאה: ${e.message}</span>`;
    }
}

// ─── Notifications dropdown ───────────────────────────────────
function toggleNotifications() {
    document.getElementById('notificationDropdown').classList.toggle('hidden');
    document.getElementById('settingsPanel').classList.add('hidden');
}

// ─── App init ────────────────────────────────────────────────
document.addEventListener('DOMContentLoaded', async () => {
    await loadDataFromServer();
    loadYtMaxEpisodes();
    renderLibrary();
    updateFavBadge();

    // בדיקת עדכונים — כל 15 דקות
    try {
        const lastCheck      = localStorage.getItem('last_update_check');
        const fifteenMinutes = 15 * 60 * 1000;
        if (!lastCheck || Date.now() - parseInt(lastCheck) > fifteenMinutes) {
            checkForUpdates(false);
        } else {
            updateNotificationUI();
        }
    } catch(e) {}

    // ─── סגירת השרת רק בסגירת החלון (לא בריענון) ────────────
    // pagehide יותר אמין מ-beforeunload לשליחת בקשות ברקע בדפדפנים מודרניים
    window.addEventListener('pagehide', () => {
        // אנחנו שולחים לשרת תמיד פקודת סגירה כשהעמוד מוסתר/נסגר
        navigator.sendBeacon('/api/shutdown');
    });

    // ─── Heartbeat — מונע סגירה בזמן ריענון ──────────────
    async function sendHeartbeat() {
        // הוספנו keepalive כדי להבטיח שהבקשה תצא גם כשהעמוד נסגר/מתרענן
        try { await fetch('/api/heartbeat', { method: 'POST', keepalive: true }); } catch(e) {}
    }
    
    sendHeartbeat(); // שלח פעימה ראשונה מיד בטעינת העמוד (יבטל את פקודת ה-shutdown מהעמוד הקודם אם מדובר בריענון)
    setInterval(sendHeartbeat, 5000); // הפחתנו ל-5 שניות כדי שהשרת תמיד ידע שהדפדפן חי

    // סגירת dropdowns בלחיצה מחוץ
    document.addEventListener('click', (e) => {
        if (!e.target.closest('#notificationDropdown') && !e.target.closest('#notificationBtn')) {
            document.getElementById('notificationDropdown')?.classList.add('hidden');
        }
        const panel = document.getElementById('settingsPanel');
        const btn   = document.getElementById('settingsBtn');
        if (panel && !panel.classList.contains('hidden') && !panel.contains(e.target) && !btn?.contains(e.target)) {
            panel.classList.add('hidden');
        }
    });
});