/* ============================================================
   Devonew — Corrente de Intercessão (Relógio de Oração)
   Store compartilhado, carregado pelo App do Membro E pelo Painel.
   Fonte única da verdade: localStorage (devonew_intercession).
   O admin cria/publica a campanha → o módulo aparece para o membro.
   Mesma ponte de courses→catalog e testemunhos.
   ============================================================ */
(function () {
  const KEY = 'devonew_intercession';
  // só a igreja-demo recebe a campanha de exemplo; igreja nova começa sem campanha
  const _tenant = (window.DEVO_TENANT || '').toLowerCase();
  const IS_DEMO = !_tenant || _tenant === 'comunidadevida';
  const SHIFT_OPTIONS = [15, 30, 60];
  const WD = ['dom', 'seg', 'ter', 'qua', 'qui', 'sex', 'sab'];
  const WD_LABEL = ['Domingo', 'Segunda', 'Terça', 'Quarta', 'Quinta', 'Sexta', 'Sábado'];

  /* ---------- date helpers ---------- */
  const pad = (n) => String(n).padStart(2, '0');
  const isoDay = (d) => `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;
  const parseDay = (s) => { const [y, m, dd] = s.split('-').map(Number); return new Date(y, m - 1, dd); };
  function hhmm(mins) { const h = Math.floor(mins / 60) % 24; const m = mins % 60; return `${pad(h)}:${pad(m)}`; }

  /* ---------- campaign → days / slots ---------- */
  function daysOf(c) {
    if (!c) return [];
    const a = new Date(c.startISO); a.setHours(0, 0, 0, 0);
    const b = new Date(c.endISO); b.setHours(0, 0, 0, 0);
    const out = [];
    for (let d = new Date(a); d <= b; d.setDate(d.getDate() + 1)) {
      const iso = isoDay(d);
      out.push({ iso, weekday: WD[d.getDay()], label: `${WD_LABEL[d.getDay()]} · ${pad(d.getDate())}/${pad(d.getMonth() + 1)}` });
    }
    return out;
  }
  function slotsForDay(c) {
    const step = c.shiftMin;
    const count = Math.floor(1440 / step);
    const out = [];
    for (let i = 0; i < count; i++) {
      const startMin = i * step;
      const hour = Math.floor(startMin / 60);
      out.push({ idx: i, start: hhmm(startMin), end: hhmm(startMin + step), hour, startMin, madrugada: hour < 5 });
    }
    return out;
  }

  /* ---------- reservations ---------- */
  const resForSlot = (c, day, idx) => (c.reservations || []).filter((r) => r.day === day && r.idx === idx);
  const capacityOf = (c) => c.exclusive ? 1 : (c.capacity || 5);
  const slotFull = (c, day, idx) => resForSlot(c, day, idx).length >= capacityOf(c);

  function coverage(c, day) {
    const slots = slotsForDay(c);
    const covered = slots.filter((s) => resForSlot(c, day, s.idx).length > 0).length;
    return { covered, total: slots.length, pct: Math.round((covered / slots.length) * 100) };
  }

  /* ---------- time window of a slot (real Date) ---------- */
  function slotWindow(c, day, slot) {
    const base = parseDay(day);
    const start = new Date(base); start.setMinutes(slot.startMin, 0, 0);
    const end = new Date(start); end.setMinutes(start.getMinutes() + c.shiftMin, 0, 0);
    return { start, end };
  }
  function slotState(c, day, slot, now = new Date()) {
    const { start, end } = slotWindow(c, day, slot);
    if (now >= start && now < end) return 'agora';
    if (now < start) return 'futuro';
    return 'passado';
  }

  /* ---------- gamification ---------- */
  const isMadrugada = (hour) => hour < 5;        // 00:00–05:00
  const xpForHour = (hour) => isMadrugada(hour) ? 30 : 15;

  /* ---------- motives (geral ou por dia da semana) ---------- */
  function motivesForDay(c, day) {
    const wd = WD[parseDay(day).getDay()];
    const per = c.motivesByDay && c.motivesByDay[wd];
    if (per && per.length) return per;
    return c.motivesGeneral || [];
  }

  /* ---------- visibility ---------- */
  function activeForMember(c, now = new Date()) {
    if (!c || c.status !== 'publicada') return false;
    return now <= new Date(c.endISO); // visível enquanto não terminou
  }

  /* ---------- display name (respects anonymity) ---------- */
  function displayName(r) {
    if (r.anon) return { name: 'Irmão(ã) em Cristo', initials: '✦', anon: true };
    return { name: r.name, initials: r.initials, anon: false };
  }

  /* ---------- seed: campanha publicada, ativa hoje ---------- */
  function seed() {
    const now = new Date();
    const start = new Date(now); start.setHours(0, 0, 0, 0);
    const end = new Date(start); end.setDate(end.getDate() + 6); end.setHours(23, 59, 0, 0);
    const today = isoDay(start);
    const curHour = now.getHours();

    const people = [
      ['Mariana Alves', 'MA'], ['Rafael Souza', 'RS'], ['Juliana Dias', 'JD'],
      ['Tiago Ferreira', 'TF'], ['Beatriz Carvalho', 'BC'], ['Carlos Nunes', 'CN'],
      ['Sara Ribeiro', 'SR'], ['André Nunes', 'AN'], ['Larissa Monteiro', 'LM'],
      ['Felipe Castro', 'FC'], ['Priscila Gomes', 'PG'], ['Marcos Pereira', 'MP'],
    ];
    // cobre 00h e 05h→23h; deixa a madrugada 01–04 VAZIA (ponto cego clássico)
    // e mantém a HORA ATUAL livre para o membro assumir e testar a Sala de Clamor.
    let fill = [0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]
      .filter((h) => h !== curHour);
    const reservations = fill.map((h, i) => ({
      day: today, idx: h, name: people[i % people.length][0], initials: people[i % people.length][1],
      anon: h === 22, mine: false, doneAt: null,
    }));

    return {
      id: 'camp_' + Date.now().toString(36),
      title: '7 Dias de Clamor pela Família',
      description: 'Uma corrente de oração ininterrupta clamando pela restauração dos lares, pela salvação dos não convertidos e pelo avivamento da nossa igreja. Cada hora coberta é um tijolo na nossa muralha de intercessão.',
      startISO: start.toISOString(),
      endISO: end.toISOString(),
      shiftMin: 60,
      exclusive: true,
      capacity: 1,
      motivesGeneral: [
        'Pela restauração e unidade das famílias da igreja',
        'Pela salvação de parentes e amigos não convertidos',
        'Por proteção sobre as crianças e os jovens',
        'Pelo avivamento e fome da Palavra na comunidade',
        'Pelos enfermos, pela cura e consolo',
      ],
      motivesByDay: {},
      status: 'publicada',
      reservations,
      createdBy: 'Pr. André Martins',
    };
  }

  function newCampaign(adminName) {
    const start = new Date(); start.setHours(0, 0, 0, 0);
    const end = new Date(start); end.setDate(end.getDate() + 6); end.setHours(23, 59, 0, 0);
    return {
      id: 'camp_' + Date.now().toString(36),
      title: 'Nova corrente de oração',
      description: '',
      startISO: start.toISOString(),
      endISO: end.toISOString(),
      shiftMin: 60,
      exclusive: true,
      capacity: 1,
      motivesGeneral: [],
      motivesByDay: {},
      status: 'rascunho',
      reservations: [],
      createdBy: adminName || 'Administrador',
    };
  }

  /* ---------- persistence ---------- */
  function load() {
    try {
      const v = JSON.parse(localStorage.getItem(KEY));
      if (v && typeof v === 'object') return v;
    } catch (e) {}
    if (!IS_DEMO) return null; // igreja nova: sem campanha (módulo oculto até criar)
    const s = seed();
    try { localStorage.setItem(KEY, JSON.stringify(s)); } catch (e) {}
    return s;
  }
  function save(c) { try { localStorage.setItem(KEY, JSON.stringify(c)); } catch (e) {} }
  function clear() { try { localStorage.removeItem(KEY); } catch (e) {} }

  /* datetime-local helpers para o formulário do admin */
  function toLocalInput(iso) {
    const d = new Date(iso);
    return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T${pad(d.getHours())}:${pad(d.getMinutes())}`;
  }
  const fromLocalInput = (s) => new Date(s).toISOString();

  window.INTER = {
    KEY, SHIFT_OPTIONS, WD, WD_LABEL,
    isoDay, parseDay, hhmm,
    daysOf, slotsForDay, resForSlot, capacityOf, slotFull, coverage,
    slotWindow, slotState, isMadrugada, xpForHour, motivesForDay,
    activeForMember, displayName, seed, newCampaign,
    load, save, clear, toLocalInput, fromLocalInput,
  };
})();
