/* ================================================================
   Khronus — Configurações (Time + Categorias)
   Tudo dentro de uma IIFE: os .jsx do Khronus são carregados como
   script global no navegador (sem bundler), então dois arquivos
   declarando a mesma const no escopo de topo derrubam o app inteiro.
   Isolar aqui dentro evita esse problema pra sempre neste arquivo.
   ================================================================ */
(function () {
  const { useState, useEffect, useRef } = React;
  const { LucideIcon, Btn, Badge, TopBar, SectionCard, IniciaisAvatar, useEscapeToClose } = window;

  const CORES = ['var(--accent)', 'var(--clr-info)', 'var(--clr-pos)', '#f472b6', '#a78bfa', 'var(--clr-neg)',
    '#fb923c', '#34d399', '#94a3b8', '#facc15', '#ffffff'];

  const inputStyle = {
    width: '100%', boxSizing: 'border-box', padding: '8px 12px', borderRadius: 'var(--r-sm)',
    background: 'var(--app-surface-2)', border: '1px solid var(--app-border)',
    color: 'var(--text-1)', fontFamily: 'Roboto, sans-serif', fontSize: 'var(--fs-lg)', outline: 'none',
  };
  function Campo({ label, children }) {
    return (
      <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>
        <span style={{ fontSize: 'var(--fs-xs)', fontFamily: 'Roboto, sans-serif', fontWeight: 700,
          letterSpacing: '0.1em', textTransform: 'uppercase', color: 'var(--text-3)' }}>{label}</span>
        {children}
      </div>
    );
  }

  function SeletorCor({ value, onChange }) {
    return (
      <div style={{ display: 'flex', gap: 6, flexWrap: 'wrap' }}>
        {CORES.map(c => (
          <button key={c} onClick={() => onChange(c)}
            style={{ width: 26, height: 26, borderRadius: '50%', background: c, cursor: 'pointer',
              border: value === c ? '2px solid var(--text-1)' : '2px solid var(--app-border-2)',
              boxShadow: value === c ? '0 0 0 2px var(--app-bg)' : 'none' }} />
        ))}
      </div>
    );
  }

  function ModalBase({ titulo, onClose, children, onSalvar, salvando, erro, onExcluir }) {
    useEscapeToClose(onClose);
    return (
      <div style={{ position: 'fixed', inset: 0, background: 'rgba(0,0,0,.55)', zIndex: 1000,
        display: 'flex', alignItems: 'center', justifyContent: 'center', padding: 20 }}
        onClick={onClose}>
        <div style={{ width: '100%', maxWidth: 380, background: 'var(--app-surface)',
          border: '1px solid var(--app-border)', borderRadius: 'var(--r-xl)', padding: 22,
          display: 'flex', flexDirection: 'column', gap: 12 }}
          onClick={e => e.stopPropagation()}>
          <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
            <span style={{ fontFamily: 'Roboto, sans-serif', fontWeight: 900, fontSize: 'var(--fs-xl)', color: 'var(--text-1)' }}>{titulo}</span>
            <button onClick={onClose} style={{ background: 'none', border: 'none', cursor: 'pointer', color: 'var(--text-3)' }}>
              <LucideIcon icon="x" size={18} />
            </button>
          </div>
          {children}
          {erro && (
            <div style={{ padding: '8px 12px', borderRadius: 'var(--r-sm)', background: 'rgba(248,113,113,.1)',
              border: '1px solid rgba(248,113,113,.25)', color: 'var(--clr-neg)', fontSize: 'var(--fs-md)' }}>{erro}</div>
          )}
          <div style={{ display: 'flex', justifyContent: 'space-between', gap: 8 }}>
            {onExcluir ? <Btn variant="danger" icon="trash-2" onClick={onExcluir}>Excluir</Btn> : <span />}
            <div style={{ display: 'flex', gap: 8 }}>
              <Btn variant="ghost" onClick={onClose}>Cancelar</Btn>
              <Btn variant="primary" onClick={onSalvar} disabled={salvando} icon={salvando ? undefined : 'check'}>
                {salvando ? 'Salvando…' : 'Salvar'}
              </Btn>
            </div>
          </div>
        </div>
      </div>
    );
  }

  /* ── Time ─────────────────────────────────────────────────────*/
  function TimeSection() {
    const [membros, setMembros] = useState([]);
    const [limite, setLimite] = useState(3);
    const [loading, setLoading] = useState(true);
    const [modal, setModal] = useState(null); // { item } | null

    async function load() {
      setLoading(true);
      const [{ data: m }, { data: est }] = await Promise.all([
        window.db.from('crm_team_members').select('*').eq('ativo', true).order('ordem'),
        window.db.from('crm_studios').select('limite_membros').single(),
      ]);
      setMembros(m || []);
      setLimite(est?.limite_membros ?? 3);
      setLoading(false);
    }
    useEffect(() => { load(); }, []);

    const atingiuLimite = membros.length >= limite;

    async function excluir(m) {
      if (!confirm(`Remover "${m.nome}" do time?`)) return;
      await window.db.from('crm_team_members').update({ ativo: false }).eq('id', m.id);
      setModal(null);
      load();
    }

    return (
      <div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>
        <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
          <span style={{ fontSize: 'var(--fs-md)', fontFamily: 'Roboto, sans-serif', color: 'var(--text-3)' }}>
            {membros.length} de {limite} membros
          </span>
          <Btn size="sm" icon="plus" disabled={atingiuLimite} onClick={() => setModal({ item: null })}>
            Adicionar
          </Btn>
        </div>

        {atingiuLimite && (
          <div style={{ padding: '8px 12px', borderRadius: 'var(--r-sm)', background: 'rgba(234,170,65,.1)',
            border: '1px solid rgba(234,170,65,.25)', color: 'var(--accent)', fontSize: 'var(--fs-sm)' }}>
            Limite de {limite} membros atingido. Remova alguém pra adicionar outro.
          </div>
        )}

        {loading ? (
          <div style={{ padding: 16, textAlign: 'center', color: 'var(--text-3)', fontSize: 'var(--fs-lg)' }}>Carregando…</div>
        ) : (
          <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>
            {membros.map(m => (
              <div key={m.id} onClick={() => setModal({ item: m })}
                style={{ display: 'flex', alignItems: 'center', gap: 10, padding: '8px 12px',
                  borderRadius: 'var(--r-sm)', background: 'var(--app-surface-2)', border: '1px solid var(--app-border)',
                  cursor: 'pointer' }}>
                <IniciaisAvatar nome={m.nome} cor={m.cor} size={26} />
                <span style={{ fontSize: 'var(--fs-lg)', fontFamily: 'Roboto, sans-serif', color: 'var(--text-1)', flex: 1 }}>{m.nome}</span>
                <div style={{ width: 14, height: 14, borderRadius: '50%', background: m.cor }} />
              </div>
            ))}
          </div>
        )}

        {modal && (
          <MembroModal item={modal.item} onClose={() => setModal(null)}
            onSaved={() => { setModal(null); load(); }} onExcluir={excluir} />
        )}
      </div>
    );
  }

  function MembroModal({ item, onClose, onSaved, onExcluir }) {
    const [nome, setNome] = useState(item?.nome || '');
    const [cor, setCor] = useState(item?.cor || CORES[0]);
    const [salvando, setSalvando] = useState(false);
    const [erro, setErro] = useState('');

    async function salvar() {
      if (!nome.trim()) { setErro('Dê um nome.'); return; }
      setSalvando(true); setErro('');
      try {
        const iniciais = nome.trim().split(/\s+/).map(p => p[0]).slice(0, 2).join('').toUpperCase();
        if (item?.id) {
          const { error } = await window.db.from('crm_team_members').update({ nome: nome.trim(), cor, iniciais }).eq('id', item.id);
          if (error) throw error;
        } else {
          const { error } = await window.db.from('crm_team_members').insert({ nome: nome.trim(), cor, iniciais });
          if (error) throw error;
        }
        onSaved();
      } catch (e) {
        setErro(e.message?.includes('Limite') ? e.message : (e.message || String(e)));
      } finally {
        setSalvando(false);
      }
    }

    return (
      <ModalBase titulo={item?.id ? 'Editar membro' : 'Novo membro'} onClose={onClose}
        onSalvar={salvar} salvando={salvando} erro={erro}
        onExcluir={item?.id ? () => onExcluir(item) : null}>
        <Campo label="Nome">
          <input style={inputStyle} value={nome} onChange={e => setNome(e.target.value)} placeholder="Ex.: Felipe" />
        </Campo>
        <Campo label="Cor">
          <SeletorCor value={cor} onChange={setCor} />
        </Campo>
      </ModalBase>
    );
  }

  /* ── Categorias ───────────────────────────────────────────────*/
  const APLICA_EM_OPCOES = [
    { id: 'ambos', label: 'Eventos e tarefas' },
    { id: 'evento', label: 'Só eventos' },
    { id: 'tarefa', label: 'Só tarefas' },
  ];

  function CategoriasSection() {
    const [categorias, setCategorias] = useState([]);
    const [loading, setLoading] = useState(true);
    const [modal, setModal] = useState(null);

    async function load() {
      setLoading(true);
      const { data } = await window.db.from('crm_agenda_categories').select('*').eq('ativo', true).order('ordem');
      setCategorias(data || []);
      setLoading(false);
    }
    useEffect(() => { load(); }, []);

    async function excluir(c) {
      if (!confirm(`Remover a categoria "${c.nome}"? Itens que já usam ela mantêm a cor, só some da lista de opções.`)) return;
      await window.db.from('crm_agenda_categories').update({ ativo: false }).eq('id', c.id);
      setModal(null);
      load();
    }

    return (
      <div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>
        <div style={{ display: 'flex', justifyContent: 'flex-end' }}>
          <Btn size="sm" icon="plus" onClick={() => setModal({ item: null })}>Adicionar</Btn>
        </div>

        {loading ? (
          <div style={{ padding: 16, textAlign: 'center', color: 'var(--text-3)', fontSize: 'var(--fs-lg)' }}>Carregando…</div>
        ) : (
          <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>
            {categorias.map(c => (
              <div key={c.id} onClick={() => setModal({ item: c })}
                style={{ display: 'flex', alignItems: 'center', gap: 10, padding: '8px 12px',
                  borderRadius: 'var(--r-sm)', background: 'var(--app-surface-2)', border: '1px solid var(--app-border)',
                  cursor: 'pointer' }}>
                <div style={{ width: 12, height: 12, borderRadius: '50%', background: c.cor, flexShrink: 0 }} />
                <span style={{ fontSize: 'var(--fs-lg)', fontFamily: 'Roboto, sans-serif', color: 'var(--text-1)', flex: 1 }}>{c.nome}</span>
                <Badge tone="default">{APLICA_EM_OPCOES.find(o => o.id === c.aplica_em)?.label || c.aplica_em}</Badge>
              </div>
            ))}
          </div>
        )}

        {modal && (
          <CategoriaModal item={modal.item} onClose={() => setModal(null)}
            onSaved={() => { setModal(null); load(); }} onExcluir={excluir} />
        )}
      </div>
    );
  }

  function CategoriaModal({ item, onClose, onSaved, onExcluir }) {
    const [nome, setNome] = useState(item?.nome || '');
    const [cor, setCor] = useState(item?.cor || CORES[0]);
    const [aplicaEm, setAplicaEm] = useState(item?.aplica_em || 'ambos');
    const [salvando, setSalvando] = useState(false);
    const [erro, setErro] = useState('');

    async function salvar() {
      if (!nome.trim()) { setErro('Dê um nome.'); return; }
      setSalvando(true); setErro('');
      try {
        const payload = { nome: nome.trim(), cor, aplica_em: aplicaEm };
        if (item?.id) {
          const { error } = await window.db.from('crm_agenda_categories').update(payload).eq('id', item.id);
          if (error) throw error;
        } else {
          const { error } = await window.db.from('crm_agenda_categories').insert(payload);
          if (error) throw error;
        }
        onSaved();
      } catch (e) {
        setErro(e.message || String(e));
      } finally {
        setSalvando(false);
      }
    }

    return (
      <ModalBase titulo={item?.id ? 'Editar categoria' : 'Nova categoria'} onClose={onClose}
        onSalvar={salvar} salvando={salvando} erro={erro}
        onExcluir={item?.id ? () => onExcluir(item) : null}>
        <Campo label="Nome">
          <input style={inputStyle} value={nome} onChange={e => setNome(e.target.value)} placeholder="Ex.: Sessão" />
        </Campo>
        <Campo label="Cor">
          <SeletorCor value={cor} onChange={setCor} />
        </Campo>
        <Campo label="Vale para">
          <select value={aplicaEm} onChange={e => setAplicaEm(e.target.value)} style={inputStyle}>
            {APLICA_EM_OPCOES.map(o => <option key={o.id} value={o.id}>{o.label}</option>)}
          </select>
        </Campo>
      </ModalBase>
    );
  }

  /* ── Empresas ─────────────────────────────────────────────────*/
  function EmpresasSection() {
    const [tags, setTags] = useState([]);
    const [loading, setLoading] = useState(true);
    const [modal, setModal] = useState(null);

    async function load() {
      setLoading(true);
      const { data } = await window.db.from('crm_company_tags').select('*').eq('ativo', true).order('ordem');
      setTags(data || []);
      setLoading(false);
    }
    useEffect(() => { load(); }, []);

    async function excluir(t) {
      if (!confirm(`Remover a tag "${t.nome}"? Cards que já usam ela mantêm a cor, só some da lista de opções.`)) return;
      await window.db.from('crm_company_tags').update({ ativo: false }).eq('id', t.id);
      setModal(null);
      load();
    }

    return (
      <div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>
        <div style={{ display: 'flex', justifyContent: 'flex-end' }}>
          <Btn size="sm" icon="plus" onClick={() => setModal({ item: null })}>Adicionar</Btn>
        </div>

        {loading ? (
          <div style={{ padding: 16, textAlign: 'center', color: 'var(--text-3)', fontSize: 'var(--fs-lg)' }}>Carregando…</div>
        ) : (
          <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>
            {tags.map(t => (
              <div key={t.id} onClick={() => setModal({ item: t })}
                style={{ display: 'flex', alignItems: 'center', gap: 10, padding: '8px 12px',
                  borderRadius: 'var(--r-sm)', background: 'var(--app-surface-2)', border: '1px solid var(--app-border)',
                  cursor: 'pointer' }}>
                <div style={{ width: 12, height: 12, borderRadius: '50%', background: t.cor,
                  border: '1px solid var(--app-border-2)', flexShrink: 0 }} />
                <span style={{ fontSize: 'var(--fs-lg)', fontFamily: 'Roboto, sans-serif', color: 'var(--text-1)', flex: 1 }}>{t.nome}</span>
              </div>
            ))}
          </div>
        )}

        {modal && (
          <EmpresaModal item={modal.item} onClose={() => setModal(null)}
            onSaved={() => { setModal(null); load(); }} onExcluir={excluir} />
        )}
      </div>
    );
  }

  function EmpresaModal({ item, onClose, onSaved, onExcluir }) {
    const [nome, setNome] = useState(item?.nome || '');
    const [cor, setCor] = useState(item?.cor || CORES[0]);
    const [salvando, setSalvando] = useState(false);
    const [erro, setErro] = useState('');

    async function salvar() {
      if (!nome.trim()) { setErro('Dê um nome.'); return; }
      setSalvando(true); setErro('');
      try {
        const payload = { nome: nome.trim(), cor };
        if (item?.id) {
          const { error } = await window.db.from('crm_company_tags').update(payload).eq('id', item.id);
          if (error) throw error;
        } else {
          const { error } = await window.db.from('crm_company_tags').insert(payload);
          if (error) throw error;
        }
        onSaved();
      } catch (e) {
        setErro(e.message || String(e));
      } finally {
        setSalvando(false);
      }
    }

    return (
      <ModalBase titulo={item?.id ? 'Editar empresa' : 'Nova empresa'} onClose={onClose}
        onSalvar={salvar} salvando={salvando} erro={erro}
        onExcluir={item?.id ? () => onExcluir(item) : null}>
        <Campo label="Nome">
          <input style={inputStyle} value={nome} onChange={e => setNome(e.target.value)} placeholder="Ex.: Ferreira e Maciel" />
        </Campo>
        <Campo label="Cor">
          <SeletorCor value={cor} onChange={setCor} />
        </Campo>
      </ModalBase>
    );
  }

  /* ── Tela ─────────────────────────────────────────────────────*/
  function ConfiguracoesScreen() {
    return (
      <div style={{ display: 'flex', flexDirection: 'column', flex: 1, minHeight: 0, overflow: 'hidden' }}>
        <TopBar title="Configurações" />
        <div style={{ flex: 1, minHeight: 0, overflowY: 'auto', padding: '18px 24px 24px',
          display: 'flex', flexDirection: 'column', gap: 16, maxWidth: 560 }}>
          <SectionCard title="Time">
            <TimeSection />
          </SectionCard>
          <SectionCard title="Categorias">
            <CategoriasSection />
          </SectionCard>
          <SectionCard title="Empresas">
            <EmpresasSection />
          </SectionCard>
        </div>
      </div>
    );
  }

  window.ConfiguracoesScreen = ConfiguracoesScreen;
})();
