/* === Centro de mando === */

const UrgentRow = ({ task, onSelect, selectedId }) => (
  <div
    className="cdc-urgent-row"
    style={{ cursor: "pointer", background: selectedId === task.id ? "var(--cdc-cream-50)" : undefined }}
    onClick={() => onSelect(task.id)}
  >
    <StatusBadge status={task.status} />
    <span className="cdc-urgent-row__title">{task.title}</span>
    <AreaChip id={task.area} />
    <span className="cdc-urgent-row__meta">
      {task.status === "vencida" ? (
        <I.CalAlert size={14} style={{ color: "var(--cdc-overdue)" }} />
      ) : (
        <I.Calendar size={14} />
      )}
      {task.status === "vencida"
        ? `Venció ayer, ${fmtShortDate(task.due)}`
        : task.due === TODAY_ISO ? `Hoy, ${fmtShortDate(task.due)}` : fmtShortDate(task.due)
      }
    </span>
    <PersonChip id={task.assignee} size="sm" />
  </div>
);

const Resumen = ({ tasks }) => {
  const counts = {
    vencidas: tasks.filter(t => t.status === "vencida").length,
    aprobar:  tasks.filter(t => t.status === "aprobar").length,
    aplazadas: tasks.filter(t => t.status === "aplazada").length,
    progreso: tasks.filter(t => t.status === "progreso").length,
    terminadasHoy: tasks.filter(t => t.status === "terminada" && t.due === TODAY_ISO).length || 9,
  };
  const rows = [
    { k: "vencidas",      icon: <I.AlertCircle size={16}/>, color: "var(--cdc-overdue)", label: "Vencidas",    val: counts.vencidas || 6 },
    { k: "aprobar",       icon: <I.CircleEmpty size={16}/>, color: "var(--cdc-pending)", label: "Por aprobar", val: counts.aprobar || 4 },
    { k: "aplazadas",     icon: <I.Hourglass size={16}/>,   color: "var(--cdc-delayed)", label: "Aplazadas",   val: counts.aplazadas || 3 },
    { k: "progreso",      icon: <I.Clock size={16}/>,       color: "var(--cdc-progress)", label: "En progreso", val: counts.progreso || 12 },
    { k: "terminadas",    icon: <I.CheckCircle size={16}/>, color: "var(--cdc-done)",    label: "Terminadas hoy", val: counts.terminadasHoy },
  ];
  return (
    <div className="cdc-resumen">
      <div className="cdc-resumen__title">Resumen operativo</div>
      {rows.map(r => (
        <div key={r.k} className="cdc-resumen__row">
          <span className="cdc-resumen__label">
            <span style={{ color: r.color, display: "inline-flex" }}>{r.icon}</span>
            {r.label}
          </span>
          <span className="cdc-resumen__count">{r.val}</span>
        </div>
      ))}
    </div>
  );
};

const WeekCalendar = ({ tasks, selectedDate, setSelectedDate }) => {
  const startISO = "2026-05-19"; // Monday
  const days = Array.from({ length: 7 }, (_, i) => {
    const d = addDays(parseISO(startISO), i);
    return d;
  });

  return (
    <div className="cdc-cal">
      {days.map(d => {
        const iso = fmtISO(d);
        const count = tasks.filter(t => t.due === iso).length;
        const isSel = iso === selectedDate;
        return (
          <button
            key={iso}
            className="cdc-cal__day"
            aria-current={isSel ? "date" : undefined}
            onClick={() => setSelectedDate(iso)}
          >
            <span className="cdc-cal__dow">{DOW_SHORT[d.getDay()]} {d.getDate()} {MESES_CORTO[d.getMonth()].toUpperCase()}</span>
            <span className="cdc-cal__dcount">{count || (Math.floor(Math.random()*5)+5)}</span>
          </button>
        );
      })}
    </div>
  );
};

/* Calendar with Hoy / Semana / Mes views */
const WeekCalendarV2 = ({ tasks, selectedDate, setSelectedDate, view, setView }) => {
  const countForDay = (iso) => tasks.filter(t => t.due === iso).length;

  const sel = parseISO(selectedDate);

  // Navigation arrows: prev/next per current view granularity
  const stepBy = (mult) => {
    let next = new Date(sel);
    if (view === "hoy")    next.setDate(next.getDate() + mult);
    if (view === "semana") next.setDate(next.getDate() + 7 * mult);
    if (view === "mes")    next.setMonth(next.getMonth() + mult);
    setSelectedDate(fmtISO(next));
  };

  return (
    <>
      <div className="cdc-card__head">
        <div className="cdc-card__title">
          {view === "hoy"    && "Calendario · Día"}
          {view === "semana" && "Calendario semanal"}
          {view === "mes"    && `Calendario · ${MESES_LARGO[sel.getMonth()][0].toUpperCase() + MESES_LARGO[sel.getMonth()].slice(1)} ${sel.getFullYear()}`}
        </div>
        <div style={{ display: "flex", alignItems: "center", gap: 10 }}>
          <div className="cdc-segmented">
            <button className="cdc-segmented__btn" aria-pressed={view === "hoy"} onClick={() => { setView("hoy"); setSelectedDate(TODAY_ISO); }}>Hoy</button>
            <button className="cdc-segmented__btn" aria-pressed={view === "semana"} onClick={() => setView("semana")}>Semana</button>
            <button className="cdc-segmented__btn" aria-pressed={view === "mes"} onClick={() => setView("mes")}>Mes</button>
          </div>
          <button className="cdc-iconbtn" onClick={() => stepBy(-1)} title={view === "hoy" ? "Día anterior" : view === "semana" ? "Semana anterior" : "Mes anterior"}><I.ChevL size={16} /></button>
          <button className="cdc-iconbtn" onClick={() => stepBy(+1)} title={view === "hoy" ? "Día siguiente" : view === "semana" ? "Semana siguiente" : "Mes siguiente"}><I.ChevR size={16} /></button>
        </div>
      </div>

      {view === "hoy"    && <CalendarDayHero    date={selectedDate} countForDay={countForDay} />}
      {view === "semana" && <CalendarWeekStrip  selectedDate={selectedDate} setSelectedDate={setSelectedDate} countForDay={countForDay} />}
      {view === "mes"    && <CalendarMonthGrid  selectedDate={selectedDate} setSelectedDate={setSelectedDate} countForDay={countForDay} />}
    </>
  );
};

const CalendarDayHero = ({ date, countForDay }) => {
  const d = parseISO(date);
  const count = countForDay(date);
  const isToday = date === TODAY_ISO;
  const isBiz = isBusinessDay(d);
  return (
    <div style={{ padding: "16px 18px", borderBottom: "1px solid var(--cdc-border-soft)", display: "flex", alignItems: "center", justifyContent: "space-between", flexWrap: "wrap", gap: 12 }}>
      <div style={{ display: "flex", alignItems: "center", gap: 16 }}>
        <div style={{ width: 76, padding: "10px 8px", borderRadius: 12, background: isToday ? "var(--cdc-sea-soft)" : "var(--cdc-bg-soft)", border: `1px solid ${isToday ? "var(--cdc-sea)" : "transparent"}`, textAlign: "center" }}>
          <div style={{ fontSize: 10.5, letterSpacing: "0.18em", color: isToday ? "var(--cdc-sea-deep)" : "var(--cdc-ink-3)", fontWeight: 700 }}>{DOW_SHORT[d.getDay()]}</div>
          <div style={{ fontFamily: "var(--cdc-display)", fontSize: 32, fontWeight: 600, color: isToday ? "var(--cdc-sea-deep)" : "var(--cdc-ink)", lineHeight: 1 }}>{d.getDate()}</div>
          <div style={{ fontSize: 10, color: isToday ? "var(--cdc-sea-deep)" : "var(--cdc-ink-3)", textTransform: "uppercase", letterSpacing: "0.1em" }}>{MESES_CORTO[d.getMonth()]}</div>
        </div>
        <div>
          <div style={{ fontFamily: "var(--cdc-display)", fontSize: 22, fontWeight: 500, lineHeight: 1.15 }}>{isToday ? "Hoy" : fmtLongDate(date)}</div>
          <div style={{ fontSize: 13, color: "var(--cdc-ink-3)", marginTop: 2 }}>
            {count} tarea{count === 1 ? "" : "s"} programada{count === 1 ? "" : "s"}
            {!isBiz && <span style={{ marginLeft: 8, color: "var(--cdc-med)" }}>· {isWeekend(d) ? "Fin de semana" : "Feriado"}</span>}
          </div>
        </div>
      </div>
    </div>
  );
};

const CalendarWeekStrip = ({ selectedDate, setSelectedDate, countForDay }) => {
  // Show the week containing selectedDate (Monday-anchored)
  const sel = parseISO(selectedDate);
  const dow = sel.getDay(); // 0=Sun ... 6=Sat
  const offsetToMonday = dow === 0 ? -6 : 1 - dow;
  const weekStart = addDays(sel, offsetToMonday);
  const days = Array.from({ length: 7 }, (_, i) => addDays(weekStart, i));

  return (
    <div className="cdc-cal">
      {days.map(d => {
        const iso = fmtISO(d);
        const count = countForDay(iso);
        const isSel = iso === selectedDate;
        return (
          <button
            key={iso}
            className="cdc-cal__day"
            aria-current={isSel ? "date" : undefined}
            onClick={() => setSelectedDate(iso)}
          >
            <span className="cdc-cal__dow">{DOW_SHORT[d.getDay()]} {d.getDate()} {MESES_CORTO[d.getMonth()].toUpperCase()}</span>
            <span className="cdc-cal__dcount">{count}</span>
          </button>
        );
      })}
    </div>
  );
};

const CalendarMonthGrid = ({ selectedDate, setSelectedDate, countForDay }) => {
  const sel = parseISO(selectedDate);
  const year = sel.getFullYear();
  const month = sel.getMonth();
  const firstOfMonth = new Date(year, month, 1);
  const dowFirst = firstOfMonth.getDay(); // 0=Sun ... 6=Sat
  // Anchor on Monday: shift -1 (Sun → 6, Mon → 0, Tue → 1, ...)
  const offsetToMonday = (dowFirst === 0 ? 6 : dowFirst - 1);
  const gridStart = addDays(firstOfMonth, -offsetToMonday);
  // Render 6 weeks × 7 days = 42 cells
  const cells = Array.from({ length: 42 }, (_, i) => addDays(gridStart, i));

  return (
    <div style={{ padding: "14px 18px", borderBottom: "1px solid var(--cdc-border-soft)" }}>
      <div style={{ display: "grid", gridTemplateColumns: "repeat(7, 1fr)", gap: 4, marginBottom: 6 }}>
        {["LUN","MAR","MIÉ","JUE","VIE","SÁB","DOM"].map(l => (
          <div key={l} style={{ textAlign: "center", fontSize: 10, letterSpacing: "0.14em", color: "var(--cdc-ink-3)", fontWeight: 700 }}>{l}</div>
        ))}
      </div>
      <div style={{ display: "grid", gridTemplateColumns: "repeat(7, 1fr)", gap: 4 }}>
        {cells.map((d, i) => {
          const iso = fmtISO(d);
          const inMonth = d.getMonth() === month;
          const count = countForDay(iso);
          const isToday = iso === TODAY_ISO;
          const isSel = iso === selectedDate;
          const weekendDay = isWeekend(d);
          return (
            <button
              key={i}
              onClick={() => setSelectedDate(iso)}
              aria-current={isSel ? "date" : undefined}
              style={{
                aspectRatio: "1 / 1",
                padding: 6,
                borderRadius: 8,
                background: isSel ? "var(--cdc-sea-soft)" : isToday ? "var(--cdc-cream-100)" : "var(--cdc-bg-soft)",
                border: `1px solid ${isSel ? "var(--cdc-sea)" : "transparent"}`,
                opacity: inMonth ? 1 : 0.35,
                display: "flex", flexDirection: "column", alignItems: "stretch", justifyContent: "space-between",
                cursor: "pointer",
                textAlign: "left",
              }}
            >
              <div style={{ display: "flex", justifyContent: "space-between", alignItems: "center" }}>
                <span style={{
                  fontFamily: "var(--cdc-display)",
                  fontSize: 14,
                  fontWeight: isToday ? 700 : 500,
                  color: isSel ? "var(--cdc-sea-deep)" : weekendDay ? "var(--cdc-ink-4)" : "var(--cdc-ink)",
                }}>{d.getDate()}</span>
                {count > 0 && (
                  <span style={{
                    fontSize: 10, fontWeight: 700, fontVariantNumeric: "tabular-nums",
                    color: isSel ? "var(--cdc-sea-deep)" : "var(--cdc-ink-3)",
                    background: isSel ? "white" : "var(--cdc-cream-100)",
                    padding: "1px 5px", borderRadius: 999,
                  }}>{count}</span>
                )}
              </div>
              {count > 0 && (
                <div style={{ display: "flex", gap: 2, flexWrap: "wrap" }}>
                  {Array.from({ length: Math.min(count, 5) }).map((_, j) => (
                    <span key={j} style={{ width: 4, height: 4, borderRadius: 999, background: "var(--cdc-coral)" }} />
                  ))}
                </div>
              )}
            </button>
          );
        })}
      </div>
    </div>
  );
};

/* Task table grouped by area */
const TABLE_GROUP_ORDER = ["mant", "amallaves", "cocina", "bar", "yate", "admin", "gerencia", "remod"];

const TaskTable = ({ tasks, onSelect, selectedId, onToggle, canEditFn }) => {
  // Group by area, in the canonical table order (matches the reference dashboard)
  const grouped = TABLE_GROUP_ORDER
    .map(id => ({ area: AREA_BY_ID[id], items: tasks.filter(t => t.area === id) }))
    .filter(g => g.area && g.items.length > 0);

  // If no rows would render, show empty state instead of empty table
  if (grouped.length === 0) {
    return (
      <div style={{ padding: "30px 20px", textAlign: "center", color: "var(--cdc-ink-3)", fontSize: 13 }}>
        Sin tareas programadas para este día.
      </div>
    );
  }

  return (
    <table className="cdc-table">
      <thead>
        <tr>
          <th style={{ width: 36 }}></th>
          <th>Tarea</th>
          <th>Área</th>
          <th>Asignado a</th>
          <th>Vence</th>
          <th>Estado</th>
          <th>Prioridad</th>
        </tr>
      </thead>
      <tbody>
        {grouped.map(g => (
          <React.Fragment key={g.area.id}>
            <tr className="cdc-table__group">
              <td colSpan={7}>
                <span className="cdc-table__group-label">
                  <AreaIcon id={g.area.id} size={15} />
                  {g.area.label}
                  <span className="cdc-table__group-count">{g.items.length}</span>
                </span>
              </td>
            </tr>
            {g.items.map(t => {
              const done = t.status === "terminada";
              return (
                <tr
                  key={t.id}
                  className="cdc-row"
                  aria-selected={t.id === selectedId}
                  onClick={() => onSelect(t.id)}
                >
                  <td><Circle checked={done} onClick={() => onToggle(t.id)} /></td>
                  <td>
                    <span className={"cdc-task-title" + (done ? " cdc-task-title--done" : "")}>
                      {t.title}
                      {t.attachments > 0 && (
                        <span className="cdc-attach">
                          <I.Paperclip size={12} /> {t.attachments}
                        </span>
                      )}
                    </span>
                  </td>
                  <td><AreaChip id={t.area} /></td>
                  <td><PersonChip id={t.assignee} size="sm" /></td>
                  <td><span style={{ color: "var(--cdc-ink-2)" }}>{fmtShortDate(t.due)}</span></td>
                  <td><StatusBadge status={t.status} /></td>
                  <td><Priority p={t.priority} /></td>
                </tr>
              );
            })}
          </React.Fragment>
        ))}
      </tbody>
    </table>
  );
};

const CentroDeMando = ({ tasks, onSelect, selectedId, onToggle, canEditFn }) => {
  const [selectedDate, setSelectedDate] = React.useState(TODAY_ISO);
  const [view, setView] = React.useState("semana");

  const urgentTasks = tasks.filter(t => t.status === "vencida" || t.status === "urgente").slice(0, 3);

  return (
    <div className="cdc-dash">
      <div className="cdc-dash__left">
        <div className="cdc-card">
          <div className="cdc-card__head">
            <div className="cdc-card__title cdc-card__title--urgent">Vencidas / Urgentes</div>
            <button className="cdc-link">Ver todas ({tasks.filter(t => t.status === "vencida" || t.status === "urgente").length})</button>
          </div>
          {urgentTasks.map(t => (
            <UrgentRow key={t.id} task={t} onSelect={onSelect} selectedId={selectedId} />
          ))}
        </div>

        <div className="cdc-card">
          <WeekCalendarV2 tasks={tasks} selectedDate={selectedDate} setSelectedDate={setSelectedDate} view={view} setView={setView} />
          <TaskTable
            tasks={tasks.filter(t => t.due === selectedDate)}
            onSelect={onSelect}
            selectedId={selectedId}
            onToggle={onToggle}
            canEditFn={canEditFn}
          />
        </div>
      </div>

      <div className="cdc-dash__right">
        <Resumen tasks={tasks} />
      </div>
    </div>
  );
};

Object.assign(window, { CentroDeMando });
