/* HorarioSemanal + TIPOS_CULTO → window.
   Props: { horario, proximo_culto }
   - "HOY" destacado con cards por slot (barra vertical de color + hora + título + live badge).
   - "ESTA SEMANA": días futuros agrupados, rotación comienza MAÑANA.
   - Paleta por tipo de culto. Dark mode soportado. */
(function () {
  const { useMemo } = React;

  const TIPOS_CULTO = {
    culto:      { label: "Culto",      color: "#2563EB", bgClass: "bg-blue-50 dark:bg-blue-900/30",       textClass: "text-blue-700 dark:text-blue-300",       dotClass: "bg-blue-500" },
    jovenes:    { label: "Jóvenes",    color: "#7C3AED", bgClass: "bg-purple-50 dark:bg-purple-900/30",   textClass: "text-purple-700 dark:text-purple-300",   dotClass: "bg-purple-500" },
    caballeros: { label: "Caballeros", color: "#475569", bgClass: "bg-slate-50 dark:bg-slate-800/60",     textClass: "text-slate-700 dark:text-slate-300",     dotClass: "bg-slate-500" },
    damas:      { label: "Damas",      color: "#EC4899", bgClass: "bg-pink-50 dark:bg-pink-900/30",       textClass: "text-pink-700 dark:text-pink-300",       dotClass: "bg-pink-500" },
    ninos:      { label: "Niños",      color: "#0D9488", bgClass: "bg-teal-50 dark:bg-teal-900/30",       textClass: "text-teal-700 dark:text-teal-300",       dotClass: "bg-teal-500" },
    oracion:    { label: "Oración",    color: "#059669", bgClass: "bg-emerald-50 dark:bg-emerald-900/30", textClass: "text-emerald-700 dark:text-emerald-300", dotClass: "bg-emerald-500" },
    estudio:    { label: "Estudio",    color: "#D97706", bgClass: "bg-amber-50 dark:bg-amber-900/30",     textClass: "text-amber-700 dark:text-amber-300",     dotClass: "bg-amber-500" },
    celula:     { label: "Célula",     color: "#0891B2", bgClass: "bg-cyan-50 dark:bg-cyan-900/30",       textClass: "text-cyan-700 dark:text-cyan-300",       dotClass: "bg-cyan-500" },
    otro:       { label: "Otro",       color: "#6B7280", bgClass: "bg-gray-50 dark:bg-gray-800/60",       textClass: "text-gray-700 dark:text-gray-300",       dotClass: "bg-gray-500" },
  };

  const DIAS_FULL  = ["Domingo","Lunes","Martes","Miércoles","Jueves","Viernes","Sábado"];
  const DIAS_ABREV = ["DOM","LUN","MAR","MIÉ","JUE","VIE","SÁB"];
  const MESES      = ["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"];

  const getTipo = (t) => TIPOS_CULTO[t] || TIPOS_CULTO.otro;

  function fmtHora12(hhmm) {
    if (!hhmm) return "";
    const [h, m] = hhmm.split(":").map(Number);
    const period = h >= 12 ? "PM" : "AM";
    const hr = h % 12 || 12;
    return hr + ":" + String(m).padStart(2, "0") + " " + period;
  }

  function SlotHoy({ slot, live }) {
    const tipo = getTipo(slot.tipo);
    return (
      <div className={"relative overflow-hidden rounded-2xl p-4 pl-5 flex items-center gap-3 " + tipo.bgClass}>
        <div className="absolute left-0 top-0 bottom-0 w-1.5" style={{ background: tipo.color }} />
        <div className="flex-1 min-w-0">
          <div className="flex items-baseline gap-2 flex-wrap">
            <span className="text-2xl font-black text-[#3C3C3C] dark:text-gray-100 leading-none">{fmtHora12(slot.hora_inicio)}</span>
            <span className="text-xs font-semibold text-[#777] dark:text-gray-400">— {fmtHora12(slot.hora_fin)}</span>
          </div>
          <div className={"font-bold mt-1.5 " + tipo.textClass}>{slot.titulo}</div>
          <div className="text-[10px] font-black uppercase tracking-widest mt-0.5 text-[#9AA0A6]">{tipo.label}</div>
        </div>
        {live && (
          <span className={
            "shrink-0 inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full text-[11px] font-black uppercase tracking-wide " +
            (live.variant === "vivo"
              ? "bg-green-100 text-green-800 dark:bg-green-900/40 dark:text-green-300"
              : "bg-orange-100 text-orange-800 dark:bg-orange-900/40 dark:text-orange-300")
          }>
            {live.variant === "vivo" && <span className="w-2 h-2 rounded-full bg-red-500 animate-pulse"></span>}
            {live.label}
          </span>
        )}
      </div>
    );
  }

  function FilaDia({ abrev, slots }) {
    return (
      <div className="flex items-start gap-4 py-3.5">
        <div className="flex-shrink-0 w-10 pt-0.5">
          <span className="text-xs font-black uppercase tracking-widest text-[#9AA0A6]">{abrev}</span>
        </div>
        <div className="flex-1 min-w-0 space-y-1.5">
          {slots.map((s, i) => {
            const tipo = getTipo(s.tipo);
            return (
              <div key={i} className="flex items-center gap-2 text-sm">
                <span className={"w-1.5 h-1.5 rounded-full flex-shrink-0 " + tipo.dotClass}></span>
                <span className="font-black text-[#3C3C3C] dark:text-gray-200 whitespace-nowrap">{fmtHora12(s.hora_inicio)}</span>
                <span className="text-[#555] dark:text-gray-300 font-semibold truncate">{s.titulo}</span>
              </div>
            );
          })}
        </div>
      </div>
    );
  }

  // Normaliza el día del slot a un índice 0..6 (0=Dom). Soporta número
  // (formato actual según reglas RTDB) y string histórico por tolerancia.
  function diaIdx(d) {
    if (typeof d === "number" && d >= 0 && d <= 6) return d;
    if (typeof d === "string") {
      const i = DIAS_FULL.indexOf(d);
      if (i >= 0) return i;
      const n = Number(d);
      if (!isNaN(n) && n >= 0 && n <= 6) return n;
    }
    return -1;
  }

  function HorarioSemanal({ horario, proximo_culto }) {
    const now = useMemo(() => new Date(), []);
    const todayIdx = now.getDay();
    const slots = (horario || []).filter((s) => s && (s.activo !== false));

    if (slots.length === 0) {
      return (
        <div className="card-soft p-8 text-center">
          <div className="text-5xl mb-2">📅</div>
          <div className="font-black text-[#3C3C3C] dark:text-gray-100">Sin horarios publicados</div>
          <div className="text-sm font-semibold text-[#777] dark:text-gray-400 mt-1">Esta iglesia aún no ha publicado horarios</div>
        </div>
      );
    }

    // HOY
    const slotsHoy = slots
      .filter((s) => diaIdx(s.dia) === todayIdx)
      .sort((a, b) => String(a.hora_inicio || "").localeCompare(String(b.hora_inicio || "")));

    // Rotación: mañana → 6 días adelante (excluye hoy)
    const ordenIdx = [];
    for (let i = 1; i <= 6; i++) ordenIdx.push((todayIdx + i) % 7);

    const slotsPorDia = {};
    slots.forEach((s) => {
      const idx = diaIdx(s.dia);
      if (idx < 0) return;
      (slotsPorDia[idx] = slotsPorDia[idx] || []).push(s);
    });
    Object.keys(slotsPorDia).forEach((d) =>
      slotsPorDia[d].sort((a, b) => String(a.hora_inicio || "").localeCompare(String(b.hora_inicio || "")))
    );

    const semanaFiltrada = ordenIdx
      .map((i) => ({ idx: i, abrev: DIAS_ABREV[i], slots: slotsPorDia[i] || [] }))
      .filter((d) => d.slots.length > 0);

    // Badge live calculado del lado del cliente sobre el slot de HOY.
    // Si proximo_culto viene del backend y hace match por título, lo preferimos.
    const nowMin = now.getHours() * 60 + now.getMinutes();
    function parseMin(hhmm) {
      const [h, m] = String(hhmm || "").split(":").map(Number);
      if (isNaN(h) || isNaN(m)) return null;
      return h * 60 + m;
    }
    function liveInfo(slot) {
      if (proximo_culto && proximo_culto.titulo === slot.titulo) {
        const m = proximo_culto.minutos_para_empezar;
        if (m != null) {
          if (m >= -60 && m <= 0) return { variant: "vivo", label: "EN VIVO" };
          if (m > 0 && m < 180) return { variant: "pronto", label: "En " + m + " min" };
          return null;
        }
      }
      const ini = parseMin(slot.hora_inicio);
      const fin = parseMin(slot.hora_fin);
      if (ini == null || fin == null) return null;
      if (nowMin >= ini && nowMin <= fin) return { variant: "vivo", label: "EN VIVO" };
      const delta = ini - nowMin;
      if (delta > 0 && delta < 180) return { variant: "pronto", label: "En " + delta + " min" };
      return null;
    }

    const fechaLarga = DIAS_FULL[todayIdx] + " " + now.getDate() + " de " + MESES[now.getMonth()];

    return (
      <div className="flex flex-col gap-6">
        <div>
          <div className="flex items-baseline justify-between mb-3">
            <span className="text-[11px] font-black uppercase tracking-[0.2em] text-[#2563EB]">Hoy</span>
            <span className="text-xs font-bold text-[#777] dark:text-gray-400">{fechaLarga}</span>
          </div>
          {slotsHoy.length > 0 ? (
            <div className="flex flex-col gap-2.5">
              {slotsHoy.map((s, i) => (
                <SlotHoy key={i} slot={s} live={liveInfo(s)} />
              ))}
            </div>
          ) : (
            <div className="text-sm font-semibold text-[#9AA0A6] italic py-2">Sin actividades hoy</div>
          )}
        </div>

        {semanaFiltrada.length > 0 && (
          <div>
            <div className="h-px bg-[#EEE] dark:bg-gray-700 mb-3" />
            <div className="mb-1">
              <span className="text-[11px] font-black uppercase tracking-[0.2em] text-[#777] dark:text-gray-400">Esta semana</span>
            </div>
            <div className="divide-y divide-[#EEE] dark:divide-gray-700">
              {semanaFiltrada.map((d) => (
                <FilaDia key={d.idx} abrev={d.abrev} slots={d.slots} />
              ))}
            </div>
          </div>
        )}
      </div>
    );
  }

  Object.assign(window, { HorarioSemanal, TIPOS_CULTO });
})();
