/* UNITY Eleitoral — Motor PWA & IndexedDB Offline Sync */

const DB_NAME = 'UnityEleitoralOfflineDB';
const DB_VERSION = 1;
const STORE_NAME = 'pendentes_cadastros';

function openOfflineDB() {
    return new Promise((resolve, reject) => {
        const request = indexedDB.open(DB_NAME, DB_VERSION);
        request.onupgradeneeded = (e) => {
            const db = e.target.result;
            if (!db.objectStoreNames.contains(STORE_NAME)) {
                db.createObjectStore(STORE_NAME, { keyPath: 'client_uuid' });
            }
        };
        request.onsuccess = (e) => resolve(e.target.result);
        request.onerror = (e) => reject(e.target.error);
    });
}

// Salva um cadastro no IndexedDB local
async function saveOfflineCadastro(cadastroData) {
    const db = await openOfflineDB();
    return new Promise((resolve, reject) => {
        const tx = db.transaction(STORE_NAME, 'readwrite');
        const store = tx.objectStore(STORE_NAME);
        if (!cadastroData.client_uuid) {
            cadastroData.client_uuid = 'uuid_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);
        }
        cadastroData.criado_em_local = new Date().toISOString();
        store.put(cadastroData);
        tx.oncomplete = () => resolve(cadastroData);
        tx.onerror = (e) => reject(e.target.error);
    });
}

// Recupera todos os cadastros pendentes
async function getPendingCadastros() {
    const db = await openOfflineDB();
    return new Promise((resolve, reject) => {
        const tx = db.transaction(STORE_NAME, 'readonly');
        const store = tx.objectStore(STORE_NAME);
        const request = store.getAll();
        request.onsuccess = () => resolve(request.result);
        request.onerror = (e) => reject(e.target.error);
    });
}

// Limpa cadastros pendentes após envio bem-sucedido
async function clearPendingCadastros(uuids) {
    const db = await openOfflineDB();
    return new Promise((resolve, reject) => {
        const tx = db.transaction(STORE_NAME, 'readwrite');
        const store = tx.objectStore(STORE_NAME);
        uuids.forEach(uuid => store.delete(uuid));
        tx.oncomplete = () => resolve();
        tx.onerror = (e) => reject(e.target.error);
    });
}

// Sincroniza cadastros pendentes com o backend
async function syncOfflineCadastros() {
    if (!navigator.onLine) return;
    
    try {
        const pendentes = await getPendingCadastros();
        if (!pendentes || pendentes.length === 0) return;
        
        console.log(`[PWA Sync] Enviando ${pendentes.length} cadastros pendentes para o servidor...`);
        
        const response = await fetch('/api/sync/push', {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({ cadastros: pendentes })
        });
        
        if (response.ok) {
            const data = await response.json();
            const uuids = pendentes.map(p => p.client_uuid);
            await clearPendingCadastros(uuids);
            console.log('[PWA Sync] Sincronização concluída com sucesso:', data);
            
            const badge = document.getElementById('syncStatusBadge');
            if (badge) {
                badge.className = 'badge badge-success';
                badge.textContent = 'Sincronizado';
            }
        }
    } catch (err) {
        console.error('[PWA Sync] Erro durante a sincronização:', err);
    }
}

// Detectar mudanças no estado da rede
window.addEventListener('online', () => {
    console.log('[PWA Network] Conexão restabelecida. Disparando sincronização...');
    syncOfflineCadastros();
});

document.addEventListener('DOMContentLoaded', () => {
    syncOfflineCadastros();
});
