/**
 * store.js — YouTube Player
 * שכבת נתונים מעודכנת: טעינת הקובץ המלא מהשרת וניהולו בזיכרון.
 */

const STORAGE_KEY = 'yt_player_data';
let fullAppData = []; // נתונים מלאים כולל פרקים

// ─── Load ─────────────────────────────────────────────────────

/** טוען נתונים מהשרת/קובץ ושומר בזיכרון */
async function loadDataFromServer() {
    try {
        const res = await fetch('/api/data');
        if (!res.ok) throw new Error(`HTTP ${res.status}`);
        const data = await res.json();
        
        // אם הקובץ ריק או לא מערך, נתחיל עם מערך ריק
        fullAppData = Array.isArray(data) ? data : [];
        
        // עדכון ה-Cache המקוצר עבור הספרייה (ללא הפרקים)
        appDataCache = _stripEpisodes(fullAppData);
        
        return fullAppData;
    } catch(e) {
        console.warn('[store] loadDataFromServer failed:', e.message);
        // Fallback ל-localStorage אם השרת לא זמין
        const raw = localStorage.getItem(STORAGE_KEY);
        fullAppData = raw ? JSON.parse(raw) : [];
        appDataCache = _stripEpisodes(fullAppData);
        return fullAppData;
    }
}

// ─── Save ─────────────────────────────────────────────────────

async function saveDataToServer(data) {
    try {
        // עדכון הזיכרון המקומי מיד
        fullAppData = data;
        appDataCache = _stripEpisodes(data);

        // שמירה לשרת (לקובץ yt_player_data.json)
        const res = await fetch('/api/data', {
            method:  'POST',
            headers: { 'Content-Type': 'application/json' },
            body:    JSON.stringify(data)
        });
        
        // גיבוי ל-localStorage ליתר ביטחון
        localStorage.setItem(STORAGE_KEY, JSON.stringify(data));
        
        return res.ok;
    } catch(e) {
        console.error('[store] saveDataToServer failed:', e);
        return false;
    }
}

// ─── Accessors ────────────────────────────────────────────────

function getLocalData() { return appDataCache; }

async function getFullData() { 
    if (!fullAppData || fullAppData.length === 0) {
        await loadDataFromServer();
    }
    return fullAppData; 
}

/** גרסה סינכרונית לשימוש מהיר - מסתמכת על הזיכרון */
function getFullDataSync() {
    return fullAppData || [];
}

// ─── Channel helpers ──────────────────────────────────────────

function findChannelWithCategory(id) {
    const categories = getFullDataSync();
    for (const cat of categories) {
        const ch = (cat.channels || []).find(c => c.id === id);
        if (ch) return { ch, categoryName: cat.name };
    }
    return null;
}

function findChannel(id) {
    const res = findChannelWithCategory(id);
    return res ? res.ch : null;
}

async function updateChannelInStorage(updatedCh) {
    const data = await getFullData();
    let found = false;
    for (let i = 0; i < data.length; i++) {
        const idx = (data[i].channels || []).findIndex(c => c.id === updatedCh.id);
        if (idx !== -1) {
            data[i].channels[idx] = updatedCh;
            found = true;
            break;
        }
    }
    if (found) {
        fullAppData = data; // עדכון מיידי בזיכרון לפני שמירה לשרת
        await saveDataToServer(data);
    }
    return found;
}

function getChannelEpisodes(channelId, offset = 0, limit = 60) {
    const fullData = getFullDataSync();
    for (const cat of fullData) {
        const ch = (cat.channels || []).find(c => c.id === channelId);
        if (ch) {
            const eps = ch.episodes || [];
            return {
                episodes: eps.slice(offset, offset + limit),
                total:    eps.length,
                hasMore:  offset + limit < eps.length
            };
        }
    }
    return { episodes: [], total: 0, hasMore: false };
}

// ─── Private helpers ──────────────────────────────────────────

function _stripEpisodes(data) {
    if (!Array.isArray(data)) return [];
    return data.map(cat => ({
        ...cat,
        channels: (cat.channels || []).map(({ episodes, ...ch }) => ({
            ...ch,
            episodeCount: (episodes || []).length
        }))
    }));
}