/* global React, Icon, Avatar, AvatarGroup, Tag, dateFmt, dateState */
const { useState, useEffect, useRef, useMemo } = React;

// Hardcoded team list for the MVP. Comes from the seed data in primitives.jsx.
// Replace with a Supabase query when memberships exist.
const TEAM_MEMBERS = [
  "Marina Costa",
  "Diego Tavares",
  "Helena Ribeiro",
  "Pedro Almeida",
  "Bruno Santos",
  "Sofia Lima",
  "João Pereira",
];

const CHECKLIST_DEMO_TEXTS = [
  "Levantar requisitos com stakeholders",
  "Esboçar fluxo no Figma",
  "Validar com 3 usuários",
  "Implementar primeiro protótipo",
  "Pareamento com QA",
  "Documentar no Notion",
  "Review com design lead",
  "Ajustes de microcopy",
  "Testes em iOS e Android",
  "Lançar em beta",
  "Coletar feedback",
  "Versão final",
];

const dateToInputValue = (d) => {
  if (!d) return "";
  const y = d.getFullYear();
  const m = String(d.getMonth() + 1).padStart(2, "0");
  const day = String(d.getDate()).padStart(2, "0");
  return `${y}-${m}-${day}`;
};

// ============ TASK MODAL ============
const TaskModal = ({ card, columnName, onClose, onUpdate, onDelete }) => {
  const [title, setTitle] = useState(card.title);
  const [desc, setDesc] = useState(card.desc || "");
  const [showAssigneePicker, setShowAssigneePicker] = useState(false);
  const [editingDate, setEditingDate] = useState(false);
  const titleRef = useRef(null);
  const assigneePickerRef = useRef(null);
  const dateInputRef = useRef(null);

  useEffect(() => {
    const onKey = (e) => {
      if (e.key === "Escape") {
        if (showAssigneePicker) setShowAssigneePicker(false);
        else if (editingDate) setEditingDate(false);
        else onClose();
      }
    };
    window.addEventListener("keydown", onKey);
    return () => window.removeEventListener("keydown", onKey);
  }, [onClose, showAssigneePicker, editingDate]);

  useEffect(() => {
    if (titleRef.current) {
      titleRef.current.style.height = "auto";
      titleRef.current.style.height = titleRef.current.scrollHeight + "px";
    }
  }, [title]);

  // Click outside to close the assignee picker
  useEffect(() => {
    if (!showAssigneePicker) return;
    const handler = (e) => {
      if (assigneePickerRef.current && !assigneePickerRef.current.contains(e.target)) {
        setShowAssigneePicker(false);
      }
    };
    document.addEventListener("mousedown", handler);
    return () => document.removeEventListener("mousedown", handler);
  }, [showAssigneePicker]);

  // Focus the date input when entering edit mode
  useEffect(() => {
    if (editingDate && dateInputRef.current) {
      dateInputRef.current.focus();
      // Try to open the native picker on browsers that support it
      try { dateInputRef.current.showPicker?.(); } catch (e) {}
    }
  }, [editingDate]);

  const commit = () => onUpdate({ title: title.trim() || card.title, desc });

  // Hydrate checklist items from the card model. Older cards only carry
  // { done, total }; we expand into a stable items array on first edit.
  const checklist = useMemo(() => {
    if (!card.checklist) return [];
    if (Array.isArray(card.checklist.items)) return card.checklist.items;
    return Array.from({ length: card.checklist.total }, (_, i) => ({
      text: CHECKLIST_DEMO_TEXTS[i % CHECKLIST_DEMO_TEXTS.length],
      done: i < card.checklist.done,
    }));
  }, [card.checklist]);

  const toggleAssignee = (name) => {
    const current = card.assignees || [];
    const next = current.includes(name)
      ? current.filter((n) => n !== name)
      : [...current, name];
    onUpdate({ assignees: next });
  };

  const handleDateChange = (value) => {
    if (!value) {
      onUpdate({ due: null });
    } else {
      const [y, m, d] = value.split("-").map(Number);
      onUpdate({ due: new Date(y, m - 1, d) });
    }
  };

  const toggleChecklistItem = (idx) => {
    const next = checklist.map((it, i) => (i === idx ? { ...it, done: !it.done } : it));
    const doneCount = next.filter((it) => it.done).length;
    onUpdate({ checklist: { done: doneCount, total: next.length, items: next } });
  };

  const due = card.due ? dateFmt(card.due) : null;
  const assignees = card.assignees || [];

  return (
    <>
      <div className="scrim" onClick={onClose} />
      <div className="modal" role="dialog" aria-modal="true">
        <div className="modal-head">
          <textarea
            ref={titleRef}
            className="modal-title"
            value={title}
            rows={1}
            onChange={(e) => setTitle(e.target.value)}
            onBlur={commit}
          />
          <button className="icon-btn" onClick={onClose} title="Fechar"><Icon name="x" size={16} /></button>
        </div>

        {card.tags && card.tags.length > 0 && (
          <div className="modal-tags">
            {card.tags.map((t, i) => <Tag key={i} color={t.color}>{t.label}</Tag>)}
          </div>
        )}

        <div className="modal-body">
          <div className="modal-grid">
            <span className="k">Coluna</span>
            <span className="v">
              <span className="meta-value">{columnName}</span>
            </span>
            <span className="k">Responsáveis</span>
            <span className="v" style={{ position: "relative" }}>
              {assignees.length > 0 && <AvatarGroup names={assignees} max={5} size="sm" />}
              <button
                className="add-link"
                onClick={() => setShowAssigneePicker((s) => !s)}
              >
                {assignees.length > 0 ? "Editar" : "Adicionar"}
              </button>
              {showAssigneePicker && (
                <div
                  ref={assigneePickerRef}
                  className="dropdown"
                  style={{ top: 28, left: 0, minWidth: 220 }}
                >
                  {TEAM_MEMBERS.map((name) => {
                    const isAssigned = assignees.includes(name);
                    return (
                      <div
                        key={name}
                        className="dropdown-item"
                        onClick={() => toggleAssignee(name)}
                      >
                        <Avatar name={name} size="xs" />
                        <span style={{ flex: 1 }}>{name}</span>
                        {isAssigned && <Icon name="check" size={12} stroke={2.25} />}
                      </div>
                    );
                  })}
                </div>
              )}
            </span>
            <span className="k">Prioridade</span>
            <span className="v">
              {card.priority === "high" && <span className="priority-flag" data-prio="high" />}
              {card.priority === "med" && <span className="priority-flag" data-prio="med" />}
              <span className="meta-value">{({ high: "Alta", med: "Média", low: "Baixa" })[card.priority || "low"]}</span>
            </span>
            <span className="k">Data limite</span>
            <span className="v">
              {editingDate ? (
                <input
                  ref={dateInputRef}
                  type="date"
                  className="modal-date-input"
                  value={dateToInputValue(card.due)}
                  onChange={(e) => handleDateChange(e.target.value)}
                  onBlur={() => setEditingDate(false)}
                />
              ) : due ? (
                <>
                  <span
                    className="meta-value"
                    style={{
                      color:
                        dateState(card.due) === "overdue"
                          ? "var(--tag-rose-fg)"
                          : dateState(card.due) === "soon"
                            ? "var(--tag-amber-fg)"
                            : "var(--text)",
                      cursor: "pointer",
                    }}
                    onClick={() => setEditingDate(true)}
                  >
                    {due}
                  </span>
                  <button
                    className="add-link"
                    onClick={() => handleDateChange("")}
                    title="Remover data"
                  >
                    Remover
                  </button>
                </>
              ) : (
                <button className="add-link" onClick={() => setEditingDate(true)}>
                  Definir data
                </button>
              )}
            </span>
          </div>

          <div className="modal-section">
            <h4>Descrição</h4>
            <textarea
              className="modal-textarea"
              placeholder="Adicione uma descrição mais detalhada…"
              value={desc}
              onChange={(e) => setDesc(e.target.value)}
              onBlur={commit}
            />
          </div>

          {checklist.length > 0 && (
            <div className="modal-section">
              <h4>
                Checklist · {checklist.filter(i => i.done).length}/{checklist.length}
              </h4>
              <div style={{ height: 4, background: "var(--bg-sunken)", borderRadius: 999, overflow: "hidden" }}>
                <div style={{
                  width: `${(checklist.filter(i => i.done).length / checklist.length) * 100}%`,
                  height: "100%",
                  background: "var(--text-secondary)",
                  transition: "width 280ms ease",
                }} />
              </div>
              <div className="checklist">
                {checklist.map((item, i) => (
                  <div
                    key={i}
                    className="checklist-row"
                    data-done={item.done}
                    onClick={() => toggleChecklistItem(i)}
                    style={{ cursor: "pointer" }}
                  >
                    <span className="checkbox" data-checked={item.done}>
                      {item.done && <Icon name="check-sm" size={9} stroke={2.5} />}
                    </span>
                    <span className="label">{item.text}</span>
                  </div>
                ))}
              </div>
            </div>
          )}

          <div className="modal-section">
            <h4>Atividade</h4>
            <div style={{ display: "flex", flexDirection: "column", gap: 10 }}>
              {[
                { who: card.assignees?.[0] || "Marina Costa", what: "moveu de Backlog para Em progresso", when: "há 2h" },
                { who: card.assignees?.[1] || "Diego Tavares", what: "marcou 2 itens da checklist", when: "ontem" },
                { who: "Helena Ribeiro", what: "adicionou um comentário", when: "ontem" },
              ].map((a, i) => (
                <div key={i} style={{ display: "flex", alignItems: "center", gap: 9, fontSize: 12.5 }}>
                  <Avatar name={a.who} size="xs" />
                  <span style={{ color: "var(--text-secondary)" }}>
                    <span style={{ color: "var(--text)", fontWeight: 500 }}>{a.who}</span>{" "}{a.what}
                  </span>
                  <span style={{ marginLeft: "auto", color: "var(--text-tertiary)", fontSize: 11.5 }}>{a.when}</span>
                </div>
              ))}
            </div>
          </div>
        </div>
      </div>
    </>
  );
};

// ============ COMMAND MENU ============
const CommandMenu = ({ onClose, onSelectBoard, boards, cards, onOpenCard, onToggleTheme }) => {
  const [q, setQ] = useState("");
  const [sel, setSel] = useState(0);
  const inputRef = useRef(null);

  useEffect(() => { inputRef.current && inputRef.current.focus(); }, []);

  const items = useMemo(() => {
    const all = [];
    // Actions
    const actions = [
      { id: "act-new", icon: "plus", label: "Nova tarefa", hint: "⌘N", run: () => { onClose(); } },
      { id: "act-theme", icon: "sparkles", label: "Alternar tema claro/escuro", hint: "⌘D", run: () => { onToggleTheme(); onClose(); } },
      { id: "act-settings", icon: "settings", label: "Configurações", hint: "⌘,", run: onClose },
    ];
    // Boards
    const boardItems = Object.values(boards).map((b) => ({
      id: "board-" + b.id,
      icon: "layers",
      label: b.label || b.name,
      hint: "Board",
      run: () => { onSelectBoard(b.id); onClose(); },
    }));
    // Cards
    const cardItems = Object.values(cards).map((c) => ({
      id: "card-" + c.id,
      icon: "check-sm",
      label: c.title,
      hint: "Tarefa",
      run: () => { onOpenCard(c.id); onClose(); },
    }));

    if (!q.trim()) {
      all.push({ type: "section", label: "Ações rápidas" });
      actions.forEach(a => all.push({ type: "item", ...a }));
      all.push({ type: "section", label: "Boards" });
      boardItems.forEach(a => all.push({ type: "item", ...a }));
      return all;
    }
    const f = q.toLowerCase();
    const match = (s) => s.toLowerCase().includes(f);
    const matchedActions = actions.filter(a => match(a.label));
    const matchedBoards = boardItems.filter(a => match(a.label));
    const matchedCards = cardItems.filter(a => match(a.label));

    if (matchedActions.length) {
      all.push({ type: "section", label: "Ações" });
      matchedActions.forEach(a => all.push({ type: "item", ...a }));
    }
    if (matchedBoards.length) {
      all.push({ type: "section", label: "Boards" });
      matchedBoards.forEach(a => all.push({ type: "item", ...a }));
    }
    if (matchedCards.length) {
      all.push({ type: "section", label: "Tarefas" });
      matchedCards.forEach(a => all.push({ type: "item", ...a }));
    }
    return all;
  }, [q, boards, cards, onClose, onSelectBoard, onOpenCard, onToggleTheme]);

  const itemList = items.filter(i => i.type === "item");

  useEffect(() => { setSel(0); }, [q]);

  useEffect(() => {
    const onKey = (e) => {
      if (e.key === "Escape") onClose();
      if (e.key === "ArrowDown") { e.preventDefault(); setSel(s => Math.min(s + 1, itemList.length - 1)); }
      if (e.key === "ArrowUp") { e.preventDefault(); setSel(s => Math.max(s - 1, 0)); }
      if (e.key === "Enter") { e.preventDefault(); itemList[sel] && itemList[sel].run(); }
    };
    window.addEventListener("keydown", onKey);
    return () => window.removeEventListener("keydown", onKey);
  }, [sel, itemList, onClose]);

  let runningIdx = -1;

  return (
    <>
      <div className="cmdk-scrim" onClick={onClose} />
      <div className="cmdk" role="dialog" aria-modal="true">
        <div className="cmdk-input-wrap">
          <Icon name="search" size={15} />
          <input
            ref={inputRef}
            className="cmdk-input"
            placeholder="Buscar tarefas, boards, comandos…"
            value={q}
            onChange={(e) => setQ(e.target.value)}
          />
          <span className="kbd">ESC</span>
        </div>
        <div className="cmdk-list">
          {items.length === 0 || itemList.length === 0 ? (
            <div className="cmdk-empty">Nenhum resultado para "{q}"</div>
          ) : items.map((it, i) => {
            if (it.type === "section") return <div className="cmdk-section" key={"s" + i}>{it.label}</div>;
            runningIdx++;
            const idx = runningIdx;
            return (
              <div
                key={it.id}
                className="cmdk-item"
                data-selected={idx === sel}
                onMouseEnter={() => setSel(idx)}
                onClick={it.run}
              >
                <span className="icon"><Icon name={it.icon} size={14} /></span>
                <span className="label">{it.label}</span>
                <span className="hint">{it.hint}</span>
              </div>
            );
          })}
        </div>
      </div>
    </>
  );
};

Object.assign(window, { TaskModal, CommandMenu });
