// AGÊNCIA LOGUE — store persistente (localStorage) + reativo. Exporta window.LogueStore. (function () { const LS = "logue_os_v4"; const clone = (x) => JSON.parse(JSON.stringify(x)); const hoje = () => new Date().toLocaleDateString("pt-BR"); const uid = (p) => p + Math.random().toString(36).slice(2, 8); const METAS_PADRAO = [ "Prospectar 5 marcas novas no Instagram e salvar contatos", "Enviar 3 mensagens de abertura pra leads potenciais", "Fazer follow-up com 2 leads em negociação", "Postar 1 conteúdo de autoridade que gere prova social", "Pedir 1 indicação a um cliente atual", ]; function seedMetas() { return { data: hoje(), itens: METAS_PADRAO.map((t) => ({ id: uid("m"), t, done: false })) }; } function seed() { return { clientes: clone(window.DEMO_CLIENTS || []), leads: clone(window.DEMO_CRM || []), metas: seedMetas() }; } function rollMetas(m) { // mantém os textos das metas, zera os checks a cada novo dia if (!m || !m.itens || !m.itens.length) return seedMetas(); if (m.data === hoje()) return m; return { data: hoje(), itens: m.itens.map((x) => ({ id: x.id || uid("m"), t: x.t, done: false })) }; } function load() { try { const r = localStorage.getItem(LS); if (r) { const s = JSON.parse(r); if (s && s.clientes && s.leads) { s.metas = rollMetas(s.metas); return s; } } } catch (e) {} return seed(); } let state = load(); const subs = new Set(); const CLOUD_ID = "lorenna-logue"; function save() { try { localStorage.setItem(LS, JSON.stringify(state)); } catch (e) {} if (window.ESTUDIO_CLOUD) window.ESTUDIO_CLOUD.push(CLOUD_ID, state); } function set(mut) { const next = clone(state); mut(next); state = next; save(); subs.forEach((f) => f()); } const cli = (s, id) => s.clientes.find((x) => x.id === id); // Ao abrir: puxa o estado da nuvem (se houver) e sobrepõe o local. if (window.ESTUDIO_CLOUD && window.ESTUDIO_CLOUD.enabled()) { window.ESTUDIO_CLOUD.pull(CLOUD_ID).then((remote) => { if (remote && remote.clientes && remote.leads) { remote.metas = rollMetas(remote.metas); state = remote; save(); subs.forEach((f) => f()); } }); } const Store = { get: () => state, subscribe: (f) => { subs.add(f); return () => subs.delete(f); }, reset: () => { state = seed(); save(); subs.forEach((f) => f()); }, // ── METAS DIÁRIAS (comercial) — zeram os checks a cada dia ── toggleMeta: (id) => set((s) => { const m = (s.metas.itens || []).find((x) => x.id === id); if (m) m.done = !m.done; }), updateMeta: (id, t) => set((s) => { const m = (s.metas.itens || []).find((x) => x.id === id); if (m) m.t = t; }), addMeta: () => set((s) => { s.metas.itens.push({ id: uid("m"), t: "Nova ação diária", done: false }); }), deleteMeta: (id) => set((s) => { s.metas.itens = s.metas.itens.filter((x) => x.id !== id); }), resetMetas: () => set((s) => { s.metas = { data: hoje(), itens: (s.metas.itens || []).map((x) => ({ id: x.id, t: x.t, done: false })) }; }), // ── LEADS (comercial) ── moveLead: (id, status) => set((s) => { const l = s.leads.find((x) => x.id === id); if (l) l.status = status; }), reorderLead: (id, beforeId) => set((s) => { const i = s.leads.findIndex((x) => x.id === id); if (i < 0) return; const [it] = s.leads.splice(i, 1); const j = beforeId ? s.leads.findIndex((x) => x.id === beforeId) : s.leads.length; s.leads.splice(j < 0 ? s.leads.length : j, 0, it); }), updateLead: (id, patch) => set((s) => { const l = s.leads.find((x) => x.id === id); if (l) Object.assign(l, patch); }), addLead: (status) => { const id = uid("lead"); set((s) => { s.leads.push({ id, nome: "Novo lead", tipo: "marca", status, plataforma: "instagram", proposta: "", valor: 1200, proxima: "", followup: "", notas: "" }); }); return id; }, deleteLead: (id) => set((s) => { s.leads = s.leads.filter((x) => x.id !== id); }), // ── CLIENTES ── updateClient: (id, patch) => set((s) => { const c = cli(s, id); if (c) Object.assign(c, patch); }), updatePayment: (id, patch) => set((s) => { const c = cli(s, id); if (c) Object.assign(c.pagamento, patch); }), updateContrato: (id, patch) => set((s) => { const c = cli(s, id); if (c) Object.assign(c.contrato, patch); }), addClient: () => { const id = uid("cl"); set((s) => { s.clientes.push({ id, nome: "Novo cliente", setor: "", cor: "var(--e-social)", receita: 0, inicio: "2026", contato: "", whatsapp: "", pacote: "6 vídeos/mês · captação e edição", contrato: { valor: 0, prazo: "Mensal recorrente", ajustes: "1 rodada por peça", assinado: "2026" }, pagamento: { dia: 10, forma: "PIX", status_mes: "pendente", historico: [] }, tarefas: [], insights: [] }); }); return id; }, deleteClient: (id) => set((s) => { s.clientes = s.clientes.filter((x) => x.id !== id); }), // ── TAREFAS ── addTask: (cid, titulo) => set((s) => { const c = cli(s, cid); if (c) { (c.tarefas = c.tarefas || []).push({ id: uid("t"), titulo: titulo || "Nova tarefa", status: "pendente", deadline: "", prioridade: "media" }); } }), updateTask: (cid, tid, patch) => set((s) => { const c = cli(s, cid); if (c) { const t = (c.tarefas || []).find((x) => x.id === tid); if (t) Object.assign(t, patch); } }), toggleTask: (cid, tid) => set((s) => { const c = cli(s, cid); if (c) { const t = (c.tarefas || []).find((x) => x.id === tid); if (t) t.status = t.status === "concluida" ? "pendente" : "concluida"; } }), deleteTask: (cid, tid) => set((s) => { const c = cli(s, cid); if (c) c.tarefas = (c.tarefas || []).filter((x) => x.id !== tid); }), reorderTask: (cid, id, beforeId) => set((s) => { const c = cli(s, cid); if (!c || !c.tarefas) return; const i = c.tarefas.findIndex((x) => x.id === id); if (i < 0) return; const [it] = c.tarefas.splice(i, 1); const j = beforeId ? c.tarefas.findIndex((x) => x.id === beforeId) : c.tarefas.length; c.tarefas.splice(j < 0 ? c.tarefas.length : j, 0, it); }), // ── IDEIAS (insights) ── addIdea: (cid) => set((s) => { const c = cli(s, cid); if (c) { (c.insights = c.insights || []).push({ titulo: "Nova ideia", custo: "Custo zero", ideia: "" }); } }), updateIdea: (cid, idx, patch) => set((s) => { const c = cli(s, cid); if (c && c.insights[idx]) Object.assign(c.insights[idx], patch); }), deleteIdea: (cid, idx) => set((s) => { const c = cli(s, cid); if (c) c.insights = (c.insights || []).filter((_, i) => i !== idx); }), }; window.LogueStore = Store; })();