/* SISTEMA · Organograma — Diretório + Hierarquia + Editor */

// ── Utilitários partilhados ────────────────────────────────────────────────

const _OrgAvatar = ({ nome, size = 36 }) => {
  const initials = (nome || '?').split(' ').filter(Boolean).slice(0, 2).map(w => w[0].toUpperCase()).join('');
  const colors   = ['#3b82f6','#8b5cf6','#10b981','#f59e0b','#ef4444','#06b6d4','#ec4899'];
  const color    = colors[(nome || '').charCodeAt(0) % colors.length];
  return (
    <div style={{
      width: size, height: size, borderRadius: '50%', background: color,
      display: 'flex', alignItems: 'center', justifyContent: 'center',
      fontSize: size * 0.38, fontWeight: 700, color: '#fff', flexShrink: 0,
      fontFamily: 'var(--font-mono)',
    }}>{initials}</div>
  );
};

const _orgCard  = { background: 'var(--bg-card)', border: '1px solid var(--border)', borderRadius: 8, overflow: 'hidden' };
const _orgHdr   = { padding: '10px 14px', background: 'var(--bg-sunken)', borderBottom: '1px solid var(--border)', display: 'flex', alignItems: 'center', justifyContent: 'space-between' };
const _orgLbl   = { fontFamily: 'var(--font-mono)', fontSize: 11, fontWeight: 700, letterSpacing: '0.06em', textTransform: 'uppercase', color: 'var(--text-dim)' };

// ── Tab: Diretório ─────────────────────────────────────────────────────────

const _OrgDirectorioTab = ({ filtered, q }) => {
  const grupos = {};
  for (const p of filtered) {
    const emp = p.empresa      || '(sem empresa)';
    const dep = p.departamento || '(sem departamento)';
    if (!grupos[emp])      grupos[emp] = {};
    if (!grupos[emp][dep]) grupos[emp][dep] = [];
    grupos[emp][dep].push(p);
  }
  const empresas = Object.keys(grupos).sort();

  if (empresas.length === 0) return (
    <div style={{ padding: 40, textAlign: 'center', color: 'var(--text-dim)', fontSize: 13 }}>
      {q ? 'Sem resultados.' : 'Sem dados.'}
    </div>
  );

  return (
    <div style={{ display: 'flex', flexDirection: 'column', gap: 20 }}>
      {empresas.map(emp => (
        <div key={emp} style={_orgCard}>
          <div style={_orgHdr}>
            <span style={{ ..._orgLbl, fontSize: 12, color: 'var(--text)' }}>{emp}</span>
            <span style={{ fontSize: 11, color: 'var(--text-dim)', fontFamily: 'var(--font-mono)' }}>
              {Object.values(grupos[emp]).flat().length} pessoas
            </span>
          </div>
          {Object.keys(grupos[emp]).sort().map(dep => (
            <div key={dep}>
              <div style={{ padding: '8px 16px', background: 'var(--bg-base)', borderBottom: '1px solid var(--border)' }}>
                <span style={_orgLbl}>{dep}</span>
                <span style={{ fontSize: 10, color: 'var(--text-dim)', marginLeft: 8 }}>{grupos[emp][dep].length}</span>
              </div>
              {grupos[emp][dep].map(p => (
                <div key={p.email_profissional} style={{ padding: '10px 16px', borderBottom: '1px solid var(--border)', display: 'flex', gap: 14, alignItems: 'center' }}>
                  <_OrgAvatar nome={p.nome_completo || p.nome_apresentar} size={34} />
                  <div style={{ flex: 1, minWidth: 0 }}>
                    <div style={{ fontSize: 13, fontWeight: 600, color: 'var(--text)', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>
                      {p.nome_completo || p.nome_apresentar || p.email_profissional}
                    </div>
                    <div style={{ fontSize: 11, color: 'var(--text-dim)', marginTop: 1 }}>{p.perfil_cargo || '—'}</div>
                  </div>
                  <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'flex-end', gap: 2, flexShrink: 0 }}>
                    {p.telemovel && (
                      <a href={`tel:${p.telemovel}`} style={{ fontSize: 11, color: 'var(--text-muted)', fontFamily: 'var(--font-mono)', textDecoration: 'none' }}>{p.telemovel}</a>
                    )}
                    <a href={`mailto:${p.email_profissional}`} style={{ fontSize: 11, color: 'var(--text-dim)', fontFamily: 'var(--font-mono)', textDecoration: 'none' }}>{p.email_profissional}</a>
                    {p.office && <span style={{ fontSize: 10, color: 'var(--text-dim)', background: 'var(--bg-sunken)', padding: '1px 6px', borderRadius: 4 }}>{p.office}</span>}
                  </div>
                </div>
              ))}
            </div>
          ))}
        </div>
      ))}
    </div>
  );
};

// ── Tab: Organograma (árvore) ──────────────────────────────────────────────

const _OrgNode = ({ email, depth, byEmail, children, expanded, toggleNode, q }) => {
  const p = byEmail[email];
  if (!p) return null;

  const matchesSearch = (em) => {
    if (!q) return true;
    const person = byEmail[em];
    if (!person) return false;
    const direct = (person.nome_completo || '').toLowerCase().includes(q)
      || (person.perfil_cargo || '').toLowerCase().includes(q)
      || (person.email_profissional || '').toLowerCase().includes(q)
      || (person.departamento || '').toLowerCase().includes(q);
    if (direct) return true;
    return (children[em] || []).some(c => matchesSearch(c));
  };

  if (!matchesSearch(email)) return null;

  const kids       = (children[email] || []).filter(c => matchesSearch(c));
  const hasKids    = kids.length > 0;
  const isExpanded = expanded[email] !== false;
  const highlight  = q && (
    (p.nome_completo || '').toLowerCase().includes(q) ||
    (p.perfil_cargo  || '').toLowerCase().includes(q) ||
    (p.email_profissional || '').toLowerCase().includes(q)
  );

  return (
    <div>
      <div
        onClick={hasKids ? () => toggleNode(email) : undefined}
        style={{
          display: 'flex', alignItems: 'center', gap: 10,
          padding: '8px 16px', paddingLeft: 16 + depth * 28,
          borderBottom: '1px solid var(--border)',
          cursor: hasKids ? 'pointer' : 'default',
          background: highlight ? 'rgba(59,130,246,0.07)' : 'transparent',
        }}
      >
        <span style={{ width: 14, flexShrink: 0, color: 'var(--text-dim)', fontSize: 10, textAlign: 'center' }}>
          {hasKids ? (isExpanded ? '▼' : '▶') : ''}
        </span>
        <_OrgAvatar nome={p.nome_completo || p.nome_apresentar} size={30} />
        <div style={{ flex: 1, minWidth: 0 }}>
          <div style={{ fontSize: 13, fontWeight: 600, color: 'var(--text)', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>
            {p.nome_completo || p.nome_apresentar || email}
          </div>
          <div style={{ fontSize: 11, color: 'var(--text-dim)', display: 'flex', gap: 8 }}>
            {p.perfil_cargo && <span>{p.perfil_cargo}</span>}
            {p.departamento && <span style={{ opacity: 0.7 }}>· {p.departamento}</span>}
            {p.empresa && depth === 0 && <span style={{ opacity: 0.6 }}>· {p.empresa}</span>}
          </div>
        </div>
        <div style={{ flexShrink: 0, display: 'flex', gap: 6, alignItems: 'center' }}>
          {p.office && <span style={{ fontSize: 10, color: 'var(--text-dim)', background: 'var(--bg-sunken)', padding: '1px 5px', borderRadius: 4 }}>{p.office}</span>}
          {hasKids && <span style={{ fontSize: 10, color: 'var(--text-dim)', fontFamily: 'var(--font-mono)' }}>{kids.length}</span>}
        </div>
      </div>
      {hasKids && isExpanded && kids.map(c => (
        <_OrgNode key={c} email={c} depth={depth + 1} byEmail={byEmail} children={children} expanded={expanded} toggleNode={toggleNode} q={q} />
      ))}
    </div>
  );
};

const _OrgOrganogramaTab = ({ pessoas, q, expanded, setExpanded }) => {
  const byEmail  = {};
  const children = {};

  for (const p of pessoas) {
    byEmail[p.email_profissional] = p;
    children[p.email_profissional] = [];
  }
  for (const p of pessoas) {
    const mgr = p.manager_email;
    if (mgr && byEmail[mgr]) children[mgr].push(p.email_profissional);
  }

  const toggleNode = email => setExpanded(v => ({ ...v, [email]: !v[email] }));

  const matchRoot = (em) => {
    if (!q) return true;
    const check = (e) => {
      const person = byEmail[e];
      if (!person) return false;
      const direct = (person.nome_completo || '').toLowerCase().includes(q)
        || (person.perfil_cargo || '').toLowerCase().includes(q)
        || (person.email_profissional || '').toLowerCase().includes(q);
      if (direct) return true;
      return (children[e] || []).some(c => check(c));
    };
    return check(em);
  };

  const roots = pessoas
    .filter(p => !p.manager_email || !byEmail[p.manager_email])
    .map(p => p.email_profissional)
    .filter(matchRoot)
    .sort((a, b) => (byEmail[a]?.nome_completo || '').localeCompare(byEmail[b]?.nome_completo || ''));

  if (roots.length === 0) return (
    <div style={{ padding: 40, textAlign: 'center', color: 'var(--text-dim)', fontSize: 13 }}>
      {q ? 'Sem resultados.' : 'Sem dados. Define a hierarquia no editor.'}
    </div>
  );

  return (
    <div style={_orgCard}>
      <div style={_orgHdr}>
        <span style={_orgLbl}>Hierarquia de reporte</span>
        <span style={{ fontSize: 11, color: 'var(--text-dim)', fontFamily: 'var(--font-mono)' }}>
          {roots.length} raízes · {pessoas.length} total
        </span>
      </div>
      {roots.map(email => (
        <_OrgNode key={email} email={email} depth={0} byEmail={byEmail} children={children} expanded={expanded} toggleNode={toggleNode} q={q} />
      ))}
    </div>
  );
};

// ── Tab: Editor de hierarquia ──────────────────────────────────────────────

const _OrgEditorTab = ({ pessoas, load, q }) => {
  const [edits,   setEdits]   = React.useState({});
  const [saving,  setSaving]  = React.useState(false);
  const [saveMsg, setSaveMsg] = React.useState(null);

  React.useEffect(() => {
    const init = {};
    for (const p of pessoas) init[p.email_profissional] = p.manager_email || '';
    setEdits(init);
  }, [pessoas.length]);

  const byEmail = {};
  for (const p of pessoas) byEmail[p.email_profissional] = p;

  const hasCycle = (email, managerEmail, depth = 0) => {
    if (depth > 30 || !managerEmail) return false;
    if (managerEmail === email) return true;
    return hasCycle(email, edits[managerEmail], depth + 1);
  };

  const empresaMap = {};
  const sorted = [...pessoas].sort((a, b) => {
    const ea = a.empresa || ''; const eb = b.empresa || '';
    if (ea !== eb) return ea.localeCompare(eb);
    return (a.nome_completo || '').localeCompare(b.nome_completo || '');
  });
  for (const p of sorted) {
    const emp = p.empresa || '(sem empresa)';
    if (!empresaMap[emp]) empresaMap[emp] = [];
    empresaMap[emp].push(p);
  }

  const saveHierarquia = async () => {
    setSaving(true); setSaveMsg(null);
    try {
      const payload = Object.entries(edits).map(([email, manager_email]) => ({
        email, manager_email: manager_email || null,
      }));
      const r = await fetch('/api/organograma/hierarquia', {
        method: 'PATCH',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify(payload),
      });
      const data = await r.json();
      if (!r.ok) throw new Error(data.error || r.statusText);
      setSaveMsg({ ok: true, msg: `${data.updated} registos guardados.` });
      load();
    } catch (e) {
      setSaveMsg({ ok: false, msg: e.message });
    } finally {
      setSaving(false);
    }
  };

  const pessoasFiltered = q
    ? pessoas.filter(p =>
        (p.nome_completo || '').toLowerCase().includes(q) ||
        (p.perfil_cargo  || '').toLowerCase().includes(q) ||
        (p.empresa       || '').toLowerCase().includes(q) ||
        (p.departamento  || '').toLowerCase().includes(q)
      )
    : pessoas;

  const comSuperior = Object.values(edits).filter(v => v).length;

  return (
    <div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>
      <div style={{ display: 'flex', gap: 12, alignItems: 'center', flexWrap: 'wrap' }}>
        <div style={{ fontSize: 13, color: 'var(--text-muted)' }}>
          Define o superior hierárquico de cada colaborador. Deixa em branco para topo da hierarquia.
        </div>
        <div style={{ marginLeft: 'auto', display: 'flex', gap: 8, alignItems: 'center' }}>
          {saveMsg && (
            <span style={{ fontSize: 12, color: saveMsg.ok ? '#22c55e' : '#ef4444' }}>{saveMsg.msg}</span>
          )}
          <button
            className="btn btn-primary btn-sm"
            onClick={saveHierarquia}
            disabled={saving}
            style={{ display: 'flex', alignItems: 'center', gap: 6 }}
          >
            {saving
              ? <><span style={{ display: 'inline-block', width: 11, height: 11, border: '2px solid rgba(255,255,255,0.3)', borderTopColor: '#fff', borderRadius: '50%', animation: 'spin 0.7s linear infinite' }} /> A guardar…</>
              : '↓ Guardar hierarquia'
            }
          </button>
        </div>
      </div>

      <div style={_orgCard}>
        <div style={_orgHdr}>
          <span style={_orgLbl}>Colaboradores ({pessoasFiltered.length})</span>
          <span style={{ fontSize: 11, color: 'var(--text-dim)', fontFamily: 'var(--font-mono)' }}>
            {comSuperior} com superior definido
          </span>
        </div>
        {pessoasFiltered.map(p => {
          const currentMgr = edits[p.email_profissional] ?? (p.manager_email || '');
          const cycle = !!currentMgr && hasCycle(p.email_profissional, currentMgr);
          return (
            <div key={p.email_profissional} style={{
              display: 'flex', alignItems: 'center', gap: 14,
              padding: '9px 16px', borderBottom: '1px solid var(--border)',
              background: cycle ? 'rgba(239,68,68,0.06)' : 'transparent',
            }}>
              <_OrgAvatar nome={p.nome_completo || p.nome_apresentar} size={30} />
              <div style={{ flex: 1, minWidth: 0 }}>
                <div style={{ fontSize: 13, fontWeight: 600, color: 'var(--text)', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>
                  {p.nome_completo || p.nome_apresentar || p.email_profissional}
                </div>
                <div style={{ fontSize: 11, color: 'var(--text-dim)' }}>
                  {p.perfil_cargo || '—'}{p.empresa ? ` · ${p.empresa}` : ''}
                </div>
              </div>
              <div style={{ flexShrink: 0, display: 'flex', alignItems: 'center', gap: 8 }}>
                {cycle && <span style={{ fontSize: 10, color: '#ef4444', fontFamily: 'var(--font-mono)' }}>⚠ ciclo</span>}
                <select
                  value={currentMgr}
                  onChange={e => setEdits(prev => ({ ...prev, [p.email_profissional]: e.target.value }))}
                  style={{
                    padding: '4px 8px', fontSize: 12, borderRadius: 5,
                    border: `1px solid ${cycle ? '#ef4444' : 'var(--border)'}`,
                    background: 'var(--bg-sunken)', color: 'var(--text)',
                    fontFamily: 'var(--font-body)', minWidth: 220, maxWidth: 300,
                  }}
                >
                  <option value="">— sem superior (topo) —</option>
                  {Object.keys(empresaMap).sort().map(emp => (
                    <optgroup key={emp} label={emp}>
                      {empresaMap[emp]
                        .filter(op => op.email_profissional !== p.email_profissional)
                        .map(op => (
                          <option key={op.email_profissional} value={op.email_profissional}>
                            {op.nome_completo || op.nome_apresentar || op.email_profissional}
                            {op.perfil_cargo ? ` (${op.perfil_cargo})` : ''}
                          </option>
                        ))
                      }
                    </optgroup>
                  ))}
                </select>
              </div>
            </div>
          );
        })}
      </div>
    </div>
  );
};

// ── Componente principal ───────────────────────────────────────────────────

const SistemaOrganograma = () => {
  const [tab,      setTab]      = React.useState('directorio');
  const [pessoas,  setPessoas]  = React.useState([]);
  const [loading,  setLoading]  = React.useState(true);
  const [error,    setError]    = React.useState(null);
  const [search,   setSearch]   = React.useState('');
  const [expanded, setExpanded] = React.useState({});

  const load = React.useCallback(() => {
    setLoading(true);
    fetch('/api/organograma')
      .then(r => { if (!r.ok) throw new Error(r.statusText); return r.json(); })
      .then(data => { setPessoas(data); setLoading(false); })
      .catch(e  => { setError(e.message); setLoading(false); });
  }, []);

  React.useEffect(() => { load(); }, []);

  const q = search.toLowerCase().trim();
  const filtered = q
    ? pessoas.filter(p =>
        (p.nome_completo || '').toLowerCase().includes(q) ||
        (p.perfil_cargo  || '').toLowerCase().includes(q) ||
        (p.departamento  || '').toLowerCase().includes(q) ||
        (p.empresa       || '').toLowerCase().includes(q) ||
        (p.email_profissional || '').toLowerCase().includes(q)
      )
    : pessoas;

  const tabs = [
    { id: 'directorio',  label: 'Diretório' },
    { id: 'organograma', label: 'Organograma' },
    { id: 'editor',      label: 'Editar hierarquia' },
  ];

  return (
    <div className="scrollbar" style={{ height: '100%', overflowY: 'auto', padding: '24px 28px 60px' }}>

      <div style={{ marginBottom: 20, display: 'flex', alignItems: 'flex-start', justifyContent: 'space-between', flexWrap: 'wrap', gap: 12 }}>
        <div>
          <div className="font-mono" style={{ fontSize: 10, color: 'var(--text-dim)', letterSpacing: '0.08em', textTransform: 'uppercase' }}>SISTEMA · RECURSOS HUMANOS</div>
          <h2 className="font-display" style={{ margin: '4px 0 0', fontSize: 20, fontWeight: 500 }}>Organograma</h2>
        </div>
        <input
          type="text"
          placeholder="Pesquisar nome, cargo, área…"
          value={search}
          onChange={e => setSearch(e.target.value)}
          style={{
            padding: '6px 12px', fontSize: 13, borderRadius: 6,
            border: '1px solid var(--border)', background: 'var(--bg-sunken)',
            color: 'var(--text)', fontFamily: 'var(--font-body)', width: 240, outline: 'none',
          }}
        />
      </div>

      <div style={{ display: 'flex', gap: 0, marginBottom: 20, borderBottom: '1px solid var(--border)' }}>
        {tabs.map(t => (
          <button
            key={t.id}
            onClick={() => setTab(t.id)}
            style={{
              padding: '8px 20px', fontSize: 13, fontWeight: tab === t.id ? 600 : 400,
              color: tab === t.id ? 'var(--text)' : 'var(--text-dim)',
              background: 'none', border: 'none',
              borderBottom: tab === t.id ? '2px solid var(--accent)' : '2px solid transparent',
              cursor: 'pointer', marginBottom: -1,
            }}
          >{t.label}</button>
        ))}
        <span style={{ marginLeft: 'auto', fontSize: 12, color: 'var(--text-dim)', alignSelf: 'center', paddingRight: 4, fontFamily: 'var(--font-mono)' }}>
          {tab !== 'editor' ? `${filtered.length} / ${pessoas.length}` : `${pessoas.length} colaboradores`}
        </span>
      </div>

      {loading && <div style={{ color: 'var(--text-dim)', fontSize: 13 }}>A carregar…</div>}
      {error   && <div style={{ color: '#ef4444', fontSize: 13 }}>Erro: {error}</div>}

      {!loading && !error && tab === 'directorio'  && <_OrgDirectorioTab filtered={filtered} q={q} />}
      {!loading && !error && tab === 'organograma' && <_OrgOrganogramaTab pessoas={pessoas} q={q} expanded={expanded} setExpanded={setExpanded} />}
      {!loading && !error && tab === 'editor'      && <_OrgEditorTab pessoas={pessoas} load={load} q={q} />}

      <style>{`@keyframes spin { to { transform: rotate(360deg); } }`}</style>
    </div>
  );
};

window.SistemaOrganograma = SistemaOrganograma;
