/* ============================================================ B2BICLOUD — Portal data layer (protótipo localStorage) ------------------------------------------------------------ ATENÇÃO: este módulo guarda os dados NO NAVEGADOR (localStorage). É um protótipo funcional para demonstração. Os clientes e relatórios cadastrados existem apenas no navegador onde foram criados. Para um portal real multiusuário (acesso de qualquer lugar, senhas seguras, upload de arquivos), é necessário um backend — recomendado Supabase ou Netlify Identity + banco. Use Exportar/Importar (JSON) no painel admin para transportar a base entre navegadores enquanto não há backend. ============================================================ */ (function (global) { const CLIENTS_KEY = "b2b_clients_v1"; const SESSION_KEY = "b2b_session_v1"; // Senha de administrador padrão — TROQUE antes de usar de verdade. const ADMIN_PASS = "b2badmin2026"; function load() { try { return JSON.parse(localStorage.getItem(CLIENTS_KEY)) || []; } catch (e) { return []; } } function save(list) { localStorage.setItem(CLIENTS_KEY, JSON.stringify(list)); } function uid() { return Date.now().toString(36) + Math.random().toString(36).slice(2, 7); } const B2B = { checkAdmin(pass) { return pass === ADMIN_PASS; }, getClients() { return load(); }, findClient(user, pass) { return load().find(c => c.user.toLowerCase() === user && c.pass === pass) || null; }, getClient(id) { return load().find(c => c.id === id) || null; }, addClient({ name, company, user, pass }) { const list = load(); if (list.some(c => c.user.toLowerCase() === user.toLowerCase())) { return { ok: false, error: "Já existe um cliente com esse usuário." }; } list.push({ id: uid(), name, company, user, pass, createdAt: new Date().toISOString(), reports: [] }); save(list); return { ok: true }; }, updateClient(id, patch) { const list = load(); const c = list.find(x => x.id === id); if (!c) return { ok: false }; Object.assign(c, patch); save(list); return { ok: true }; }, deleteClient(id) { save(load().filter(c => c.id !== id)); }, addReport(clientId, { title, date, type, content, url }) { const list = load(); const c = list.find(x => x.id === clientId); if (!c) return { ok: false }; c.reports = c.reports || []; c.reports.unshift({ id: uid(), title, date, type, content, url, createdAt: new Date().toISOString() }); save(list); return { ok: true }; }, deleteReport(clientId, reportId) { const list = load(); const c = list.find(x => x.id === clientId); if (!c) return; c.reports = (c.reports || []).filter(r => r.id !== reportId); save(list); }, exportJSON() { return JSON.stringify(load(), null, 2); }, importJSON(text) { try { const data = JSON.parse(text); if (!Array.isArray(data)) return { ok: false, error: "Formato inválido." }; save(data); return { ok: true, count: data.length }; } catch (e) { return { ok: false, error: "JSON inválido." }; } }, setSession(s) { localStorage.setItem(SESSION_KEY, JSON.stringify(s)); }, getSession() { try { return JSON.parse(localStorage.getItem(SESSION_KEY)); } catch (e) { return null; } }, clearSession() { localStorage.removeItem(SESSION_KEY); } }; global.B2B = B2B; })(window);