// ---------- List View ----------
const { useState: useStateL, useRef: useRefL } = React;

function ListView({ tab, items, onItemClick, onReorder }) {
  const [dragId, setDragId] = useStateL(null);
  const [overId, setOverId] = useStateL(null);
  const [overPos, setOverPos] = useStateL('before'); // before | after

  // group by day for non-todo, sort todos by .order then by start
  const sorted = [...items].sort((a, b) => {
    if (tab === 'todo') {
      const ao = a.order ?? 9999, bo = b.order ?? 9999;
      if (ao !== bo) return ao - bo;
      return (a.startISO || '').localeCompare(b.startISO || '');
    }
    return (b.dateISO || '').localeCompare(a.dateISO || ''); // newest first
  });

  // group helper
  const groups = [];
  if (tab === 'todo') {
    // group by start date (YYYY-MM-DD)
    const map = new Map();
    for (const it of sorted) {
      const k = (it.startISO || '').slice(0, 10) || '미정';
      if (!map.has(k)) map.set(k, []);
      map.get(k).push(it);
    }
    // todo groups: keep insertion order (already sorted)
    [...map.entries()].forEach(([k, v]) => groups.push({ key: k, items: v }));
  } else {
    const map = new Map();
    for (const it of sorted) {
      const k = (it.dateISO || '').slice(0, 10) || '미정';
      if (!map.has(k)) map.set(k, []);
      map.get(k).push(it);
    }
    [...map.entries()].forEach(([k, v]) => groups.push({ key: k, items: v }));
  }

  if (items.length === 0) {
    return (
      <div className="list-empty">
        <div className="list-empty-ico"><Icon.Note size={24} /></div>
        <div className="list-empty-t">아직 항목이 없어요</div>
        <div className="list-empty-s">오른쪽 위 + 버튼으로 새로 만들어보세요.</div>
        <style>{`
          .list-empty{padding:80px 20px;text-align:center;color:var(--ink-3)}
          .list-empty-ico{display:inline-flex;width:48px;height:48px;border-radius:12px;background:var(--bg);border:1px solid var(--line);align-items:center;justify-content:center;margin-bottom:14px;color:var(--ink-4)}
          .list-empty-t{font-size:15px;font-weight:600;color:var(--ink);margin-bottom:6px}
          .list-empty-s{font-size:13px}
        `}</style>
      </div>
    );
  }

  const fmtKey = (k) => {
    if (k === '미정') return '날짜 미정';
    const d = D.parse(k);
    if (!d) return k;
    const dow = ['일','월','화','수','목','금','토'][d.getDay()];
    const isToday = k === D.todayISO();
    return `${d.getFullYear()}. ${D.pad(d.getMonth()+1)}. ${D.pad(d.getDate())} (${dow})${isToday ? ' · 오늘' : ''}`;
  };

  const onDragStart = (e, id) => {
    if (tab !== 'todo') return;
    setDragId(id);
    e.dataTransfer.effectAllowed = 'move';
    try { e.dataTransfer.setData('text/plain', id); } catch {}
  };
  const onDragOver = (e, id) => {
    if (tab !== 'todo' || !dragId) return;
    e.preventDefault();
    const r = e.currentTarget.getBoundingClientRect();
    const pos = (e.clientY - r.top) < r.height / 2 ? 'before' : 'after';
    setOverId(id); setOverPos(pos);
  };
  const onDrop = (e, id) => {
    if (tab !== 'todo' || !dragId || dragId === id) { setDragId(null); setOverId(null); return; }
    e.preventDefault();
    onReorder(dragId, id, overPos);
    setDragId(null); setOverId(null);
  };
  const onDragEnd = () => { setDragId(null); setOverId(null); };

  return (
    <div className="list-root">
      {groups.map(({ key, items: gItems }) => (
        <section key={key} className="list-group">
          <h3 className="list-group-h">{fmtKey(key)} <span className="list-group-n">{gItems.length}</span></h3>
          <ul className="list-ul">
            {gItems.map((it) => {
              const c = COLOR_BY_ID[it.color] || COLOR_BY_ID.blue;
              const done = it.tab === 'todo' && it.status === 'done';
              const isDrag = dragId === it.id;
              const isOver = overId === it.id;
              return (
                <li
                  key={it.id}
                  className={'list-row' + (isDrag ? ' dragging' : '') + (isOver ? ' over-' + overPos : '')}
                  draggable={tab === 'todo'}
                  onDragStart={(e) => onDragStart(e, it.id)}
                  onDragOver={(e) => onDragOver(e, it.id)}
                  onDrop={(e) => onDrop(e, it.id)}
                  onDragEnd={onDragEnd}
                  onClick={() => onItemClick(it)}
                >
                  {tab === 'todo' && (
                    <span className="list-grip" aria-hidden><Icon.Drag size={14} /></span>
                  )}
                  <span className="list-dot" style={{ background: c.hex }} />
                  <span className={'list-title' + (done ? ' done' : '')}>{it.title || '(제목 없음)'}</span>
                  <span className="list-meta">
                    {it.tab === 'todo' && it.urgent && <Icon.Flame size={13} filled fillColor="#ef4444" stroke="#ef4444" />}
                    {it.tab === 'todo' && it.important && <Icon.Star size={13} filled fillColor="#f59e0b" stroke="#f59e0b" />}
                    {it.tab === 'todo' && it.startISO && it.startISO.length > 10 && (
                      <span className="list-time"><Icon.Clock size={11} />{D.fmtTime(it.startISO)}{it.endISO && it.endISO.slice(11) ? '–' + D.fmtTime(it.endISO) : ''}</span>
                    )}
                    {it.location && <span className="list-loc">@ {it.location}</span>}
                    {(it.tags || []).slice(0, 3).map(t => <span key={t} className="list-tag">#{t}</span>)}
                    {it.tab === 'todo' && (
                      <span className={'list-status status-' + it.status}>{STATUSES.find(s => s.id === it.status)?.label || '예정'}</span>
                    )}
                  </span>
                </li>
              );
            })}
          </ul>
        </section>
      ))}

      <style>{`
        .list-root{display:flex;flex-direction:column;gap:20px;padding-bottom:80px}
        .list-group{background:var(--bg);border:1px solid var(--line);border-radius:var(--radius);overflow:hidden}
        .list-group-h{margin:0;padding:11px 14px;font-size:12px;font-weight:600;color:var(--ink-2);letter-spacing:.01em;background:var(--bg-soft);border-bottom:1px solid var(--line);display:flex;align-items:center;gap:8px}
        .list-group-n{font-size:11px;color:var(--ink-4);font-weight:500}
        .list-ul{list-style:none;margin:0;padding:0}
        .list-row{display:flex;align-items:center;gap:10px;padding:11px 14px;border-bottom:1px solid var(--line);cursor:pointer;transition:background .12s;position:relative}
        .list-row:last-child{border-bottom:none}
        .list-row:hover{background:var(--bg-soft)}
        .list-row.dragging{opacity:.4}
        .list-row.over-before::before,
        .list-row.over-after::after{content:'';position:absolute;left:0;right:0;height:2px;background:var(--ink);pointer-events:none}
        .list-row.over-before::before{top:-1px}
        .list-row.over-after::after{bottom:-1px}
        .list-grip{color:var(--ink-4);display:inline-flex;cursor:grab}
        .list-grip:active{cursor:grabbing}
        .list-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}
        .list-title{flex:1;min-width:0;font-size:14px;font-weight:500;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
        .list-title.done{text-decoration:line-through;color:var(--ink-3)}
        .list-meta{display:flex;align-items:center;gap:8px;flex-shrink:0;color:var(--ink-3);font-size:12px;flex-wrap:wrap;justify-content:flex-end}
        .list-time{display:inline-flex;align-items:center;gap:3px;color:var(--ink-3);font-variant-numeric:tabular-nums}
        .list-loc{color:var(--ink-3)}
        .list-tag{padding:1px 6px;background:var(--accent-soft);border-radius:999px;color:var(--ink-2);font-size:11px}
        .list-status{padding:2px 8px;border-radius:999px;font-size:11px;font-weight:500;border:1px solid var(--line)}
        .status-planned{color:var(--ink-3)}
        .status-in-progress{color:#60a5fa;background:color-mix(in oklab,#3b82f6 16%,var(--bg));border-color:color-mix(in oklab,#3b82f6 30%,var(--bg))}
        .status-done{color:#4ade80;background:color-mix(in oklab,#22c55e 16%,var(--bg));border-color:color-mix(in oklab,#22c55e 30%,var(--bg))}
        @media (max-width:720px){
          .list-row{flex-wrap:wrap;padding:10px 12px}
          .list-meta{width:100%;justify-content:flex-start;padding-left:18px;margin-top:2px}
          .list-title{flex-basis:calc(100% - 40px)}
        }
      `}</style>
    </div>
  );
}

window.ListView = ListView;
