// AiPreviewWeekPlan.jsx — Forhåndsvisning «Lag ukeplan» (§4.2).
//
// 7 kolonner (man–søn) som Uke-visningen i Todo: oppgaver fordelt på dager,
// deadlines/Big Wins markert. X-fjerning per rad; fjernede sendes som rejected.
// Drag-and-drop er utsatt til E6 (§4.2 — ønskelig, ikke påkrevd i v1).

function AiPreviewWeekPlan({ result, onChangeSelection, aliasTitles, aliasTables }) {
  const [removed, setRemoved] = React.useState(() => new Set());
  React.useEffect(() => { setRemoved(new Set()); }, [result]);

  const items = Array.isArray(result?.items) ? result.items : [];
  const ops = Array.isArray(result?.ops) ? result.ops : [];

  function keyFor(item, idx) { return item.ref || `new:${idx}`; }

  React.useEffect(() => {
    const removedRefs = new Set([...removed].filter(k => !String(k).startsWith('new:')));
    const removedNew = new Set([...removed].filter(k => String(k).startsWith('new:')).map(k => +String(k).slice(4)));
    let createIdx = -1;
    const kept = ops.filter(op => {
      if (op.op === 'create_task') { createIdx++; return !removedNew.has(createIdx); }
      return !(op.ref && removedRefs.has(op.ref));
    });

    // Hver eksisterende oppgave i ukeplanen skal faktisk få forfall på dagen
    // den er plassert på, ellers dukker den ikke opp på riktig dag i appen.
    const hasDueOp = new Set(kept.filter(o => o.op === 'reschedule').map(o => o.ref));
    const activeOps = kept.slice();
    items.forEach(item => {
      if (!item.ref || !item.day || removedRefs.has(item.ref) || hasDueOp.has(item.ref)) return;
      activeOps.push({ id: `auto-due-${item.ref}`, op: 'reschedule', ref: item.ref, value: item.day });
    });

    onChangeSelection && onChangeSelection({ activeOps, rejected: [...removed] });
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, [removed, result]);

  function toggle(k) {
    setRemoved(prev => { const n = new Set(prev); n.has(k) ? n.delete(k) : n.add(k); return n; });
  }

  // Bygg 7 dager fra den tidligste dagen i planen (mandag om mulig).
  const DOW = ['søn', 'man', 'tir', 'ons', 'tor', 'fre', 'lør'];
  const withIdx = items.map((it, idx) => ({ it, idx })).filter(x => x.it.day);
  const days = [...new Set(withIdx.map(x => x.it.day))].sort();
  const byDay = {};
  days.forEach(d => (byDay[d] = []));
  withIdx.forEach(x => { (byDay[x.it.day] ||= []).push(x); });
  Object.values(byDay).forEach(arr => arr.sort((a, b) => (a.it.rank || 0) - (b.it.rank || 0)));

  function dayLabel(d) {
    const dt = new Date(d + 'T00:00:00');
    return `${DOW[dt.getDay()]} ${dt.getDate()}.`;
  }

  if (!days.length) return <div className="ai-pv-empty">Ingen dager i ukeplanen ennå.</div>;

  return (
    <div className="ai-pv ai-pv-week">
      {result.headline && <div className="ai-pv-headline">{result.headline}</div>}
      <div className="ai-pv-week-grid">
        {days.map(d => (
          <div key={d} className="ai-pv-daycol">
            <div className="ai-pv-daycol-h">{dayLabel(d)}</div>
            <div className="ai-pv-daycol-body">
              {byDay[d].map(({ it, idx }) => {
                const k = keyFor(it, idx);
                const gone = removed.has(k);
                const title = it.new ? it.new.title : ((aliasTitles && aliasTitles[it.ref]) || it.title || it.ref);
                return (
                  <div key={k} className={`ai-pv-chip${gone ? ' is-removed' : ''}${it.tag === 'due' ? ' is-due' : ''}${it.tag === 'big_win' ? ' is-bw' : ''}`}>
                    <span className="ai-pv-chip-t">{title}</span>
                    {it.new && <span className="ai-pv-badge ai-pv-badge-new">Ny</span>}
                    <button className="ai-pv-chip-x" onClick={() => toggle(k)} aria-label="Fjern">
                      <i className={`ti ${gone ? 'ti-arrow-back-up' : 'ti-x'}`}></i>
                    </button>
                  </div>
                );
              })}
              {!byDay[d].length && <div className="ai-pv-daycol-empty">—</div>}
            </div>
          </div>
        ))}
      </div>
    </div>
  );
}

window.AiPreviewWeekPlan = AiPreviewWeekPlan;
