// ═══════════════════════════════════════════════════════════════
// APP · Escalab Gestão de Pessoas · raiz do aplicativo
// ═══════════════════════════════════════════════════════════════

// perfis: admin=GC, gestor=lider de setor, financeiro=adm financeiro, colaborador, admissao=novo colaborador aguardando
const NAV = [
  { id: 'intranet',      label: 'Intranet',             icon: 'home',      perfis: ['admin', 'gestor', 'colaborador', 'financeiro'] },
  { id: 'avisos',        label: 'Avisos',               icon: 'bell',      perfis: ['admin', 'gestor', 'colaborador', 'financeiro'] },
  { id: 'dashboard',     label: 'Painel',               icon: 'chart',     perfis: ['admin'] },
  { id: 'colaboradores', label: 'Colaboradores',        icon: 'users',     perfis: ['admin', 'gestor', 'financeiro'] },
  { id: 'organograma',   label: 'Organograma',          icon: 'org',       perfis: ['admin', 'gestor', 'colaborador', 'financeiro'] },
  { id: 'recrutamento',  label: 'Recrutamento',         icon: 'users',     perfis: ['admin', 'gestor', 'financeiro'] }, // financeiro ve tudo (regra global do 81a4921 ja plugada em screen-recrutamento)
  { id: 'admissao',      label: 'Admissão',             icon: 'plus',      perfis: ['admin', 'financeiro', 'admissao'] }, // PDF Site AVD 5 · item 23: gestor não vê
  { id: 'movimentacao',  label: 'Movimentação',         icon: 'send',      perfis: ['admin', 'gestor', 'financeiro'] },
  { id: 'ferias',        label: 'Férias & Day Off',     icon: 'calendar',  perfis: ['admin', 'gestor', 'colaborador', 'financeiro'] },
  { id: 'ausencia',         label: 'Ausências',          icon: 'warn',      perfis: ['admin', 'gestor', 'colaborador', 'financeiro'] },
  { id: 'horas',         label: 'Horas',                icon: 'clock',     perfis: ['admin', 'gestor', 'colaborador'] },
  // Gestor/colaborador: grupo Pesquisas com AVD + PCO + Censo + Outras Pesquisas
  { id: '_pesquisas_gc',  label: 'Pesquisas',           icon: 'clipboard', perfis: ['gestor', 'colaborador'], isGroup: true,
    filhos: [
      { id: 'avd',              label: 'AVD & Feedback',       icon: 'star' },
      { id: 'pco',              label: 'PCO · Clima',          icon: 'chart' },
      { id: 'censo',            label: 'Censo de Diversidade', icon: 'users' },
      { id: 'outras_pesquisas', label: 'Outras Pesquisas',     icon: 'send' },
    ]
  },
  // Financeiro: grupo Pesquisas com AVD + Censo + Outras Pesquisas (igual admin, sem PCO)
  { id: '_pesquisas_fin', label: 'Pesquisas',           icon: 'clipboard', perfis: ['financeiro'], isGroup: true,
    filhos: [
      { id: 'avd',              label: 'AVD & Feedback',       icon: 'star'  },
      { id: 'censo',            label: 'Censo de Diversidade', icon: 'users' },
      { id: 'outras_pesquisas', label: 'Outras Pesquisas',     icon: 'send'  },
    ]
  },
  // Admin: grupo "Pesquisas" expansível com AVD, PCO, Censo e Outras Pesquisas
  { id: '_pesquisas',    label: 'Pesquisas',            icon: 'clipboard', perfis: ['admin'], isGroup: true,
    filhos: [
      { id: 'avd',              label: 'AVD & Feedback',       icon: 'star'    },
      { id: 'pco',              label: 'PCO',                  icon: 'chart'   },
      { id: 'censo',            label: 'Censo de Diversidade', icon: 'users'   },
      { id: 'outras_pesquisas', label: 'Outras Pesquisas',     icon: 'send'    },
    ]
  },
  { id: 'treinamentos',  label: 'Treinamentos',         icon: 'trophy',    perfis: ['admin', 'gestor', 'colaborador'] },
  { id: 'pdi',           label: 'PDI',                  icon: 'trend_up',  perfis: ['admin', 'gestor', 'colaborador'] }, // SPEC_PDI.md · spec entregue por G&C em 16/06/2026 · colaborador vê seu próprio PDI
  { id: 'completar_cadastro', label: 'Meus Dados',     icon: 'user',      perfis: ['gestor', 'colaborador', 'financeiro', 'admissao'] }, // modelo Caju · auto-cadastro de docs/diversidade. Admin nao tem auto-cadastro.
  { id: 'admin',         label: 'Administração',         icon: 'lock',      perfis: ['admin'] }, // Painel GC: liberar notas, usuarios, ciclos, intersetorial, cargos, tabela salarial, banco de perguntas, permissoes, indicadores financeiros
];

// Sidebar tem 232px quando aberta. "Escalab" + chip "Gestao de Pessoas"
// estourava — agora usa "GC" compacto, que ainda identifica claramente o app.
// title="Gestao de Pessoas" preserva o nome completo em hover.
const Logo = () => (
  <div style={{ display: 'flex', alignItems: 'center', gap: 9 }} title="Escalab · Gestão de Pessoas">
    <img src="assets/escalab-icon.png" width={28} height={28} style={{ borderRadius: 6 }}
      onError={e => { e.target.style.display = 'none'; }} />
    <span style={{ fontWeight: 700, fontSize: 15, color: 'var(--escalab-ink)', letterSpacing: '-.01em' }}>Escalab</span>
    <span style={{ fontSize: 10.5, fontWeight: 700, letterSpacing: '.08em', textTransform: 'uppercase', color: 'var(--escalab-brand)', background: 'var(--escalab-brand-tint)', border: '1px solid var(--escalab-brand-soft)', borderRadius: 5, padding: '2px 7px', whiteSpace: 'nowrap' }}>GC</span>
  </div>
);

const Sidebar = ({ user, screen, onNavigate, onLogout, collapsed, onToggle }) => {
  const bloq = new Set(getPaginasBloqueadas(user.id));
  const navItems = NAV
    .filter(n => n.perfis.includes(user.perfil))
    .map(n => n.isGroup ? { ...n, filhos: (n.filhos || []).filter(f => !bloq.has(f.id)) } : n)
    .filter(n => n.isGroup ? n.filhos.length > 0 : !bloq.has(n.id));
  // Auto-expande o grupo que contém a tela ativa
  const grupoDoScreen = navItems.find(n => n.isGroup && n.filhos?.some(f => f.id === screen));
  const [gruposAbertos, setGruposAbertos] = useState(() => grupoDoScreen ? new Set([grupoDoScreen.id]) : new Set());

  function toggleGrupo(id) {
    setGruposAbertos(prev => {
      const next = new Set(prev);
      next.has(id) ? next.delete(id) : next.add(id);
      return next;
    });
  }

  function renderItem(n, isFilho = false) {
    const active = screen === n.id || (screen === 'perfil' && n.id === 'colaboradores');
    return (
      <button key={n.id + (isFilho ? '_f' : '')} onClick={() => onNavigate(n.id)} title={collapsed ? n.label : undefined} style={{
        display: 'flex', alignItems: 'center', gap: 9,
        padding: collapsed ? '10px' : isFilho ? '8px 12px 8px 28px' : '9px 12px',
        border: 0, cursor: 'pointer', justifyContent: collapsed ? 'center' : 'flex-start',
        background: active ? 'var(--escalab-brand-tint)' : 'transparent',
        color: active ? 'var(--escalab-brand-deep)' : isFilho ? 'var(--escalab-slate)' : 'var(--escalab-slate)',
        fontFamily: 'var(--font-sans)', fontWeight: active ? 600 : 400, fontSize: isFilho ? 13 : 13.5,
        transition: 'all .15s', textAlign: 'left', width: '100%',
        borderRadius: collapsed ? 8 : (active ? '0 8px 8px 0' : 8),
        boxShadow: active && !collapsed ? 'inset 3px 0 0 var(--escalab-brand)' : 'none',
      }}>
        <div style={{ flexShrink: 0, color: active ? 'var(--escalab-brand)' : isFilho ? 'var(--escalab-mute)' : 'var(--escalab-mute)' }}>
          <Icon name={n.icon} size={isFilho ? 14 : 16} />
        </div>
        {!collapsed && <span style={{ flex: 1 }}>{n.label}</span>}
      </button>
    );
  }

  return (
    <aside style={{
      width: collapsed ? 60 : 232, flexShrink: 0, background: '#fff',
      borderRight: '1px solid var(--escalab-line)', display: 'flex', flexDirection: 'column',
      height: '100vh', position: 'sticky', top: 0, overflow: 'hidden',
      transition: 'width .22s var(--ease-out)',
    }}>
      {/* Logo header */}
      <div style={{ padding: collapsed ? '16px 12px' : '16px 18px', borderBottom: '1px solid var(--escalab-line)', display: 'flex', alignItems: 'center', justifyContent: 'space-between', minHeight: 60 }}>
        {!collapsed && <Logo />}
        <button onClick={onToggle} style={{ border: 0, background: 'transparent', cursor: 'pointer', color: 'var(--escalab-mute)', padding: 6, borderRadius: 8, flexShrink: 0, transition: 'background .15s' }}>
          <Icon name="menu" size={17} />
        </button>
      </div>

      {/* User */}
      {!collapsed && (
        <div style={{ padding: '14px 18px 12px', borderBottom: '1px solid var(--escalab-line)' }}>
          <div style={{ display: 'flex', gap: 10, alignItems: 'center' }}>
            <Avatar nome={user.nome} cor={user.cor} iniciais={user.iniciais} size={34} />
            <div style={{ minWidth: 0 }}>
              <div style={{ fontSize: 13, fontWeight: 600, color: 'var(--escalab-ink)', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{user.nome.split(' ')[0]}</div>
              <div style={{ fontSize: 11, color: 'var(--escalab-mute)', marginTop: 1 }}>{user.cargo}</div>
            </div>
          </div>
        </div>
      )}

      {/* Nav */}
      <nav style={{ flex: 1, padding: '10px 8px 10px', display: 'flex', flexDirection: 'column', gap: 1, overflowY: 'auto' }}>
        {!collapsed && (
          <div style={{ fontSize: 10, fontWeight: 700, letterSpacing: '.1em', textTransform: 'uppercase', color: 'var(--escalab-mute)', padding: '8px 12px 6px', userSelect: 'none' }}>
            Gestão de Pessoas
          </div>
        )}
        {navItems.map(n => {
          if (n.isGroup) {
            const aberto = gruposAbertos.has(n.id);
            const filhoAtivo = n.filhos?.some(f => f.id === screen);
            return (
              <div key={n.id}>
                {/* Cabeçalho do grupo */}
                <button onClick={() => toggleGrupo(n.id)} title={collapsed ? n.label : undefined} style={{
                  display: 'flex', alignItems: 'center', gap: 9, padding: collapsed ? '10px' : '9px 12px',
                  border: 0, cursor: 'pointer', justifyContent: collapsed ? 'center' : 'flex-start',
                  background: filhoAtivo ? 'var(--escalab-brand-tint)' : aberto ? 'var(--escalab-paper)' : 'transparent',
                  color: filhoAtivo ? 'var(--escalab-brand-deep)' : 'var(--escalab-slate)',
                  fontFamily: 'var(--font-sans)', fontWeight: (filhoAtivo || aberto) ? 600 : 400, fontSize: 13.5,
                  transition: 'all .15s', textAlign: 'left', width: '100%', borderRadius: 8,
                  boxShadow: filhoAtivo && !collapsed ? 'inset 3px 0 0 var(--escalab-brand)' : 'none',
                }}>
                  <div style={{ flexShrink: 0, color: filhoAtivo ? 'var(--escalab-brand)' : 'var(--escalab-mute)' }}>
                    <Icon name={n.icon} size={16} />
                  </div>
                  {!collapsed && (
                    <>
                      <span style={{ flex: 1 }}>{n.label}</span>
                      <Icon name={aberto ? 'chev_down' : 'chev_right'} size={12} />
                    </>
                  )}
                </button>
                {/* Filhos do grupo */}
                {aberto && !collapsed && n.filhos?.map(f => renderItem(f, true))}
                {/* Collapsed: mostra filhos como icons */}
                {collapsed && n.filhos?.map(f => {
                  const active = screen === f.id;
                  return (
                    <button key={f.id} onClick={() => onNavigate(f.id)} title={f.label} style={{
                      display: 'flex', alignItems: 'center', justifyContent: 'center', padding: '8px',
                      border: 0, cursor: 'pointer', background: active ? 'var(--escalab-brand-tint)' : 'transparent',
                      color: active ? 'var(--escalab-brand)' : 'var(--escalab-mute)', transition: 'all .15s', width: '100%', borderRadius: 8,
                    }}>
                      <Icon name={f.icon} size={14} />
                    </button>
                  );
                })}
              </div>
            );
          }
          return renderItem(n);
        })}
      </nav>

      {/* Logout */}
      <div style={{ padding: '8px 8px 12px', borderTop: '1px solid var(--escalab-line)' }}>
        <button onClick={onLogout} title={collapsed ? 'Sair' : undefined} style={{
          display: 'flex', alignItems: 'center', gap: 9, padding: collapsed ? '10px' : '9px 12px',
          borderRadius: 8, border: 0, cursor: 'pointer', justifyContent: collapsed ? 'center' : 'flex-start',
          background: 'transparent', color: 'var(--escalab-mute)', fontFamily: 'var(--font-sans)',
          fontSize: 13.5, width: '100%', transition: 'all .15s',
        }}>
          <Icon name="logout" size={16} />
          {!collapsed && <span>Sair</span>}
        </button>
      </div>
    </aside>
  );
};

const Topbar = ({ screen, user, onVerPerfil, onNavigate, onAbrirFeedback }) => {
  const allItems = NAV.reduce((acc, n) => { acc.push(n); if (n.filhos) n.filhos.forEach(f => acc.push(f)); return acc; }, []);
  const label = allItems.find(n => n.id === screen)?.label || (screen === 'perfil' ? 'Perfil' : '');
  return (
    <header style={{
      height: 56, borderBottom: '1px solid var(--escalab-line)', background: '#fff',
      display: 'flex', alignItems: 'center', padding: '0 28px', gap: 12,
      position: 'sticky', top: 0, zIndex: 10,
    }}>
      <span style={{ fontSize: 14, fontWeight: 600, color: 'var(--escalab-ink)', flex: 1 }}>{label}</span>
      <div style={{ display: 'flex', alignItems: 'center', gap: 10 }}>
        {onAbrirFeedback && (
          <button onClick={onAbrirFeedback} title="Enviar feedback sobre a plataforma" style={{
            display: 'flex', alignItems: 'center', gap: 6,
            border: '1px solid #F0CE6A', background: '#FFF7EB', color: '#7A4A00',
            borderRadius: 999, padding: '5px 12px', cursor: 'pointer',
            fontSize: 12.5, fontWeight: 600, fontFamily: 'var(--font-sans)',
          }}>
            <Icon name="message" size={13} /> Feedback
          </button>
        )}
        <SinoNotificacoes user={user} onNavigate={onNavigate} />
        <button onClick={() => onVerPerfil(user)} style={{
          display: 'flex', alignItems: 'center', gap: 8, border: '1px solid var(--escalab-line)',
          borderRadius: 999, padding: '4px 12px 4px 4px', background: '#fff', cursor: 'pointer',
        }}>
          <Avatar nome={user.nome} cor={user.cor} iniciais={user.iniciais} size={26} />
          <span style={{ fontSize: 13, fontWeight: 500, color: 'var(--escalab-ink)' }}>{user.nome.split(' ')[0]}</span>
        </button>
      </div>
    </header>
  );
};

const SCREEN_LABELS = {
  dashboard: 'Painel', colaboradores: 'Colaboradores', perfil: 'Perfil', organograma: 'Organograma',
  recrutamento: 'Recrutamento', admissao: 'Admissão', movimentacao: 'Movimentações',
  ferias: 'Férias', ausencia: 'Ausências', horas: 'Banco de Horas',
  outras_pesquisas: 'Outras Pesquisas', avisos: 'Avisos', avd: 'AVD',
  treinamentos: 'Treinamentos', pco: 'PCO', censo: 'Censo de Diversidade', intranet: 'Intranet', pdi: 'PDI',
  admin: 'Administração', completar_cadastro: 'Meus Dados',
};

const FEEDBACK_KEY = 'escalab_feedbacks';

const FeedbackModal = ({ open, onClose, user, screen }) => {
  const [tipo, setTipo] = useState('sugestao');
  const [texto, setTexto] = useState('');
  const [enviando, setEnviando] = useState(false);
  const [enviado, setEnviado] = useState(false);

  useEffect(() => {
    if (open) { setTipo('sugestao'); setTexto(''); setEnviado(false); }
  }, [open]);

  if (!open) return null;

  async function enviar() {
    if (!texto.trim()) return;
    setEnviando(true);
    const tela = SCREEN_LABELS[screen] || screen || '·';
    const tipoLabel = { sugestao: 'Sugestão', bug: 'Erro / Bug', elogio: 'Elogio', outro: 'Outro' }[tipo] || tipo;
    const registro = {
      id: 'fb' + Date.now(),
      data: new Date().toISOString(),
      por: user?.nome || '·',
      email: user?.email || '',
      tela, tipo: tipoLabel, texto: texto.trim(),
    };
    try {
      const lista = JSON.parse(localStorage.getItem(FEEDBACK_KEY) || '[]');
      lista.unshift(registro);
      localStorage.setItem(FEEDBACK_KEY, JSON.stringify(lista));
    } catch {}

    const subject = `[Pré-lançamento Escalab Gestão de Pessoas] ${tipoLabel} · ${tela}`;
    const corpo = [
      `Tipo: ${tipoLabel}`,
      `Tela: ${tela}`,
      `Por: ${user?.nome || '·'} (${user?.email || 'sem e-mail'})`,
      `Perfil: ${user?.perfil || '·'}`,
      `Data: ${new Date().toLocaleString('pt-BR')}`,
      '',
      texto.trim(),
    ].join('\n');

    try {
      if (typeof enviarEmailEscalab === 'function') {
        await enviarEmailEscalab({
          // Pre-lancamento: vai pra Maria Clara (GC) com copia pra Hiago
          to: 'mclaraferreira@escalab.com.br',
          cc: 'hiago.lucas@escalab.com.br',
          subject, corpo,
          replyTo: user?.email || undefined,
        });
      }
    } catch {}

    setEnviando(false);
    setEnviado(true);
    setTimeout(() => { setEnviado(false); onClose?.(); }, 1800);
  }

  return (
    <Modal open={open} onClose={onClose} title="Enviar feedback" width={520}
      footer={
        <>
          <Button size="sm" variant="outline" onClick={onClose}>Cancelar</Button>
          <Button size="sm" variant="primary" onClick={enviar} disabled={!texto.trim() || enviando}>
            {enviando ? 'Enviando…' : enviado ? '✓ Enviado!' : 'Enviar'}
          </Button>
        </>
      }>
      <div style={{ display: 'flex', flexDirection: 'column', gap: 14 }}>
        <Banner tone="warn">
          Estamos em pré-lançamento. Sua opinião sobre o que você acabou de ver ajuda a chegar ao lançamento oficial sem surpresas.
        </Banner>

        <div>
          <label style={{ fontSize: 11, fontWeight: 700, letterSpacing: '.08em', textTransform: 'uppercase', color: 'var(--escalab-slate)', display: 'block', marginBottom: 8 }}>
            Tipo
          </label>
          <div style={{ display: 'flex', gap: 8, flexWrap: 'wrap' }}>
            {[
              { id: 'sugestao', label: 'Sugestão' },
              { id: 'bug', label: 'Erro / Bug' },
              { id: 'elogio', label: 'Elogio' },
              { id: 'outro', label: 'Outro' },
            ].map(opt => {
              const ativo = tipo === opt.id;
              return (
                <button key={opt.id} onClick={() => setTipo(opt.id)} style={{
                  border: `1px solid ${ativo ? 'var(--escalab-brand)' : 'var(--escalab-line)'}`,
                  background: ativo ? 'var(--escalab-brand-tint)' : '#fff',
                  color: ativo ? 'var(--escalab-brand-deep)' : 'var(--escalab-slate)',
                  borderRadius: 999, padding: '6px 14px', cursor: 'pointer',
                  fontSize: 13, fontWeight: ativo ? 700 : 500, fontFamily: 'var(--font-sans)',
                }}>{opt.label}</button>
              );
            })}
          </div>
        </div>

        <div>
          <label style={{ fontSize: 11, fontWeight: 700, letterSpacing: '.08em', textTransform: 'uppercase', color: 'var(--escalab-slate)', display: 'block', marginBottom: 6 }}>
            Tela atual
          </label>
          <div style={{ fontSize: 13.5, color: 'var(--escalab-ink)', background: 'var(--escalab-paper)', border: '1px solid var(--escalab-line)', borderRadius: 8, padding: '8px 12px' }}>
            {SCREEN_LABELS[screen] || screen || '·'}
          </div>
        </div>

        <div>
          <label style={{ fontSize: 11, fontWeight: 700, letterSpacing: '.08em', textTransform: 'uppercase', color: 'var(--escalab-slate)', display: 'block', marginBottom: 6 }}>
            Sua mensagem
          </label>
          <textarea value={texto} onChange={e => setTexto(e.target.value)} rows={6}
            placeholder="Descreva o que achou, o que estava tentando fazer, o que esperava…"
            style={{ width: '100%', border: '1px solid var(--escalab-line)', borderRadius: 10, padding: '10px 12px', fontSize: 13.5, fontFamily: 'var(--font-sans)', resize: 'vertical', outline: 'none', boxSizing: 'border-box', lineHeight: 1.5 }} />
          <div style={{ fontSize: 11.5, color: 'var(--escalab-mute)', marginTop: 6 }}>
            Vai para <strong>Maria Clara (GC)</strong> com cópia pra <strong>Hiago Lucas</strong>. Você é identificado como <strong>{user?.nome}</strong>.
          </div>
        </div>
      </div>
    </Modal>
  );
};

const PRELAUNCH_BANNER_KEY = 'escalab_prelaunch_banner_dismissed_v1';

// Banner persistente quando o cadastro do colab esta incompleto. Some quando 100%.
// Admin nao ve o banner (visual mais limpo na demo); ainda acessa via menu "Meus Dados".
const BannerCadastroIncompleto = ({ user, onNavigate }) => {
  if (!user || user.perfil === 'admin') return null;
  const prog = typeof getCadastroProgresso === 'function' ? getCadastroProgresso(user.id) : { pct: 100 };
  if (prog.pct >= 100) return null;
  return (
    <div style={{
      background: 'linear-gradient(90deg, #E6F5F1 0%, #D5F0E8 100%)',
      borderBottom: '1px solid #B3D9CB',
      color: '#00614D',
      padding: '8px 16px',
      display: 'flex', alignItems: 'center', gap: 10,
      fontSize: 13, fontWeight: 500,
      fontFamily: 'var(--font-sans)',
    }}>
      <span style={{
        display: 'inline-flex', alignItems: 'center',
        background: 'var(--escalab-brand)', color: '#fff',
        borderRadius: 999, padding: '2px 9px',
        fontSize: 10.5, fontWeight: 700, letterSpacing: '.05em', textTransform: 'uppercase',
        flexShrink: 0,
      }}>{prog.pct}% completo</span>
      <span style={{ flex: 1, lineHeight: 1.35 }}>
        Seu cadastro está incompleto. {prog.faltando?.length > 0 && <>Faltam: <strong>{prog.faltando.join(', ')}</strong>.</>}
      </span>
      <button onClick={() => onNavigate('completar_cadastro')} style={{
        border: '1px solid var(--escalab-brand)', background: '#fff', color: 'var(--escalab-brand-deep)',
        padding: '5px 12px', borderRadius: 7, cursor: 'pointer',
        fontSize: 12.5, fontWeight: 600, fontFamily: 'var(--font-sans)',
        whiteSpace: 'nowrap', flexShrink: 0,
      }}>Completar agora</button>
    </div>
  );
};

const PreLaunchBanner = ({ onAbrirFeedback }) => {
  const [aberto, setAberto] = useState(() => {
    try { return localStorage.getItem(PRELAUNCH_BANNER_KEY) !== '1'; } catch { return true; }
  });
  if (!aberto) return null;
  function dispensar() {
    try { localStorage.setItem(PRELAUNCH_BANNER_KEY, '1'); } catch {}
    setAberto(false);
  }
  return (
    <div className="prelaunch-banner" style={{
      background: 'linear-gradient(90deg, #FFF4D6 0%, #FFE9A8 100%)',
      borderBottom: '1px solid #F0CE6A',
      color: '#6B4A00',
      padding: '8px 16px',
      display: 'flex', alignItems: 'center', gap: 10,
      fontSize: 13, fontWeight: 500,
      fontFamily: 'var(--font-sans)',
    }}>
      <span className="prelaunch-badge" style={{
        display: 'inline-flex', alignItems: 'center',
        background: '#E89B3B', color: '#fff',
        borderRadius: 999, padding: '2px 9px',
        fontSize: 10.5, fontWeight: 700, letterSpacing: '.05em', textTransform: 'uppercase',
        flexShrink: 0,
      }}>Pré-lançamento</span>
      <span className="prelaunch-text" style={{ flex: 1, lineHeight: 1.35 }}>
        Versão de pré-lançamento. Já com dados reais de colaboradores, PCO 2024 e treinamentos. Seu feedback ajuda a refinar antes do lançamento oficial em 09/07.
      </span>
      {onAbrirFeedback && (
        <button onClick={onAbrirFeedback} className="prelaunch-feedback-btn" style={{
          border: '1px solid #C9A14A', background: '#fff', color: '#6B4A00',
          padding: '5px 12px', borderRadius: 7, cursor: 'pointer',
          fontSize: 12.5, fontWeight: 600, fontFamily: 'var(--font-sans)',
          whiteSpace: 'nowrap', flexShrink: 0,
        }}>Enviar feedback</button>
      )}
      <button onClick={dispensar} aria-label="Dispensar" title="Dispensar" className="prelaunch-dismiss-btn"
        style={{ border: 0, background: 'transparent', color: '#6B4A00', cursor: 'pointer', padding: 4, fontSize: 16, lineHeight: 1, flexShrink: 0 }}>
        ✕
      </button>
    </div>
  );
};

const App = () => {
  const [user, setUser] = useState(() => {
    try { return JSON.parse(localStorage.getItem('avd_user') || 'null'); } catch { return null; }
  });
  const [bootando, setBootando] = useState(true); // valida sessao Supabase no mount
  const [screen, setScreen] = useState('dashboard');
  const [colaboradorSel, setColaboradorSel] = useState(null);
  const [sidebarCollapsed, setSidebarCollapsed] = useState(false);

  const [notasLiberadas, setNotasLiberadas] = useState(() => getNotasLiberadasIds());
  const [, setVersao] = useState(0);
  function refreshColaboradores() { setVersao(v => v + 1); }

  const isMobile = useMobile();

  // Valida sessao Supabase no mount: se ha sessao ativa, restaura o user real.
  // Se nao ha (e o avd_user em LS era de login real), limpa.
  useEffect(() => {
    let cancelado = false;
    (async () => {
      if (typeof restaurarSessaoSupabase === 'function') {
        const colab = await restaurarSessaoSupabase();
        if (cancelado) return;
        if (colab) {
          setUser(colab);
        } else if (user?.supabaseUser) {
          // Tinha sessao Supabase no LS mas o servidor nao confirma → desloga
          setUser(null);
        }
      }
      if (!cancelado) setBootando(false);
    })();
    return () => { cancelado = true; };
  }, []);

  useEffect(() => {
    if (user) localStorage.setItem('avd_user', JSON.stringify(user));
    else localStorage.removeItem('avd_user');
  }, [user]);

  // Carrega CICLOS + AVALIACOES do Supabase apos login. RLS filtra por perfil
  // (admin tudo, gestor time, colab proprio se liberada). Sem login, ambos vazios.
  useEffect(() => {
    if (!user) return;
    (async () => {
      if (typeof syncNotasLiberadasFromSupabase === 'function') {
        await syncNotasLiberadasFromSupabase();
        setNotasLiberadas(getNotasLiberadasIds());
      }
      if (typeof fetchCiclosSupabase === 'function') await fetchCiclosSupabase();
      if (typeof fetchAvaliacoesSupabase === 'function') await fetchAvaliacoesSupabase();
      refreshColaboradores(); // re-render pra refletir os arrays preenchidos
    })();
  }, [user?.id]);

  useEffect(() => {
    if (user) {
      const defaultScreen = user.perfil === 'admissao' ? 'admissao' : 'intranet';
      setScreen(defaultScreen);
    }
  }, [user]);

  // PDF Site AVD 5 · item 40: pop-up tutorial nas 2 primeiras entradas + dica lateral persistente.
  // Mostrado para colaborador e gestor (não para admin/financeiro/admissão).
  const [tutorialAberto, setTutorialAberto] = useState(false);
  const [dicaLateralAberta, setDicaLateralAberta] = useState(false);
  useEffect(() => {
    if (!user) return;
    if (!['colaborador','gestor'].includes(user.perfil)) return;
    try {
      const key = `escalab_tutorial_visitas_${user.id}`;
      const visitas = Number(localStorage.getItem(key) || '0');
      if (visitas < 2) {
        setTutorialAberto(true);
        localStorage.setItem(key, String(visitas + 1));
      }
      // Dica lateral fica disponível sempre — usuário decide se quer abrir
      setDicaLateralAberta(true);
    } catch {}
  }, [user]);

  // Se a tela atual foi bloqueada pelo GC para esta pessoa, volta para a intranet
  useEffect(() => {
    if (user && screen !== 'perfil' && getPaginasBloqueadas(user.id).includes(screen)) {
      setScreen('intranet');
    }
  }, [user, screen]);

  function liberarNotas(id) {
    liberarNotasColaborador(id);
    setNotasLiberadas(getNotasLiberadasIds());
  }
  function bloquearNotas(id) {
    bloquearNotasColaborador(id);
    setNotasLiberadas(getNotasLiberadasIds());
  }
  function podeVerNotas(colaboradorId) {
    const cid = Number(colaboradorId);
    // RH / G&C sempre vê
    if (user?.perfil === 'admin' || user?.perfil === 'financeiro') return true;
    // O próprio colab vê suas notas SE o G&C liberou
    if (user?.id === cid) return notasLiberadas.has(cid);
    // Gestor vê notas do liderado direto (gestorNome == user.nome) se as permissões permitirem
    if (user?.perfil === 'gestor') {
      const liderado = (typeof COLABORADORES !== 'undefined' ? COLABORADORES : [])
        .find(c => c.id === cid && c.gestorNome === user.nome);
      if (liderado) {
        const perms = typeof getGestorPerms === 'function' ? getGestorPerms(user.id) : { verAvaliacoes: true };
        return perms.verAvaliacoes !== false;
      }
    }
    return false;
  }

  // hooks devem vir ANTES de qualquer return condicional
  const [maisAberto, setMaisAberto] = useState(false);
  const [feedbackAberto, setFeedbackAberto] = useState(false);

  function handleLogin(u) { setUser(u); }
  async function handleLogout() {
    if (typeof encerrarSessaoSupabase === 'function') await encerrarSessaoSupabase();
    setUser(null);
    setScreen('dashboard');
    setColaboradorSel(null);
  }
  function handleNavigate(s) { setScreen(s); setColaboradorSel(null); }
  function handleVerPerfil(c) { setColaboradorSel(c); setScreen('perfil'); }

  if (bootando) {
    return (
      <div style={{ minHeight:'100vh', display:'flex', alignItems:'center', justifyContent:'center', background:'var(--escalab-paper)' }}>
        <div style={{ display:'flex', flexDirection:'column', alignItems:'center', gap:14 }}>
          <div style={{ width:36, height:36, border:'3px solid var(--escalab-line)', borderTopColor:'var(--escalab-brand)', borderRadius:'50%', animation:'spin .8s linear infinite' }} />
          <div style={{ fontSize:12.5, color:'var(--escalab-mute)', fontWeight:600, letterSpacing:'.06em', textTransform:'uppercase' }}>Carregando…</div>
        </div>
      </div>
    );
  }
  if (!user) return <ScreenLogin onLogin={handleLogin} />;

  // Flatten NAV para mobile (expandir grupos em itens diretos)
  const bloqUser = new Set(getPaginasBloqueadas(user.id));
  const navItemsFlat = NAV.reduce((acc, n) => {
    if (!n.perfis.includes(user.perfil)) return acc;
    if (n.isGroup) {
      n.filhos?.forEach(f => { if (!bloqUser.has(f.id)) acc.push({ ...f, perfis: ['admin'] }); });
    } else if (!bloqUser.has(n.id)) {
      acc.push(n);
    }
    return acc;
  }, []);
  const navItems = navItemsFlat;
  // Bottom nav mobile: mostrar os 5 mais relevantes
  const bottomNavItems = navItems.filter(n => !n.id.startsWith('_')).slice(0, 5);

  return (
    <div style={{ display: 'flex', minHeight: '100vh', background: 'var(--escalab-paper)' }}>
      {/* Sidebar · oculta completamente no mobile */}
      {!isMobile && (
        <Sidebar
          user={user} screen={screen}
          onNavigate={handleNavigate} onLogout={handleLogout}
          collapsed={sidebarCollapsed}
          onToggle={() => setSidebarCollapsed(s => !s)}
        />
      )}

      <div style={{ flex: 1, display: 'flex', flexDirection: 'column', minWidth: 0 }}>
        {/* Topbar adaptado para mobile */}
        {isMobile ? (
          <header style={{
            height: 56, borderBottom: '1px solid var(--escalab-line)',
            background: 'rgba(255,255,255,.92)', backdropFilter: 'saturate(180%) blur(14px)', WebkitBackdropFilter: 'saturate(180%) blur(14px)',
            display: 'flex', alignItems: 'center', padding: '0 16px', gap: 10,
            position: 'sticky', top: 0, zIndex: 10,
            boxShadow: '0 1px 0 rgba(10,15,18,.02)',
          }}>
            <img src="assets/escalab-icon.png" width={26} height={26} style={{ borderRadius: 6 }} onError={e => { e.target.style.display = 'none'; }} />
            <span style={{ fontWeight: 700, fontSize: 15, color: 'var(--escalab-ink)', flex: 1 }}>
              {navItemsFlat.find(n => n.id === screen)?.label || NAV.flatMap(n => n.filhos || []).find(f => f.id === screen)?.label || (screen === 'perfil' ? 'Perfil' : 'Escalab')}
            </span>
            <button onClick={() => setFeedbackAberto(true)} title="Enviar feedback" style={{
              display: 'flex', alignItems: 'center', justifyContent: 'center',
              border: '1px solid #F0CE6A', background: '#FFF7EB', color: '#7A4A00',
              width: 32, height: 32, borderRadius: 999, cursor: 'pointer', flexShrink: 0,
            }}>
              <Icon name="message" size={14} />
            </button>
            <SinoNotificacoes user={user} onNavigate={handleNavigate} />
            <button onClick={() => handleVerPerfil(user)} style={{ display: 'flex', alignItems: 'center', gap: 7, border: '1px solid var(--escalab-line)', borderRadius: 999, padding: '4px 10px 4px 4px', background: '#fff', cursor: 'pointer' }}>
              <Avatar nome={user.nome} cor={user.cor} iniciais={user.iniciais} size={24} />
              <span style={{ fontSize: 13, fontWeight: 500, color: 'var(--escalab-ink)' }}>{user.nome.split(' ')[0]}</span>
            </button>
          </header>
        ) : (
          <Topbar screen={screen} user={user} onVerPerfil={handleVerPerfil} onNavigate={handleNavigate} onAbrirFeedback={() => setFeedbackAberto(true)} />
        )}

        <BannerCadastroIncompleto user={user} onNavigate={handleNavigate} />
        <PreLaunchBanner onAbrirFeedback={() => setFeedbackAberto(true)} />

        <main className="main-content" style={{
          flex: 1,
          padding: isMobile
            ? '16px 14px calc(80px + env(safe-area-inset-bottom, 0px))'
            : '28px 32px',
          maxWidth: 1280, width: '100%', alignSelf: 'center', boxSizing: 'border-box', overflowX: 'hidden',
        }}>

          {screen === 'dashboard'    && <ScreenDashboard user={user} onNavigate={handleNavigate} />}
          {screen === 'colaboradores'&& <ScreenColaboradores user={user} onVerPerfil={handleVerPerfil} podeVerNotas={podeVerNotas} />}
          {screen === 'perfil'       && colaboradorSel && <ScreenPerfil colaborador={colaboradorSel} user={user} onVoltar={() => handleNavigate('colaboradores')} podeVerNotas={podeVerNotas} onRefresh={refreshColaboradores} />}
          {screen === 'organograma'  && <ScreenOrganograma user={user} onRefresh={refreshColaboradores} />}
          {screen === 'recrutamento' && <ScreenRecrutamento user={user} />}
          {screen === 'admissao'     && <ScreenAdmissao user={user} />}
          {screen === 'movimentacao' && <ScreenMovimentacao user={user} />}
          {screen === 'ferias'       && <ScreenFerias user={user} />}
          {screen === 'ausencia'         && <ScreenAusencia user={user} />}
          {screen === 'horas'            && <ScreenHoras user={user} />}
          {screen === 'outras_pesquisas' && <ScreenOutrasPesquisas user={user} />}
          {screen === 'avisos'           && <ScreenAvisos user={user} />}
          {screen === 'aviso_detalhe'    && <ScreenAvisos user={user} />}
          {screen === 'avd'          && <ScreenAVD user={user} onVerPerfil={handleVerPerfil} />}
          {screen === 'treinamentos' && <ScreenTreinamentos user={user} />}
          {screen === 'pco'          && <ScreenPCO user={user} />}
          {screen === 'censo'        && <ScreenCenso user={user} />}
          {screen === 'intranet'     && <ScreenIntranet user={user} />}
          {screen === 'pdi'          && <ScreenPDI user={user} />}
          {screen === 'completar_cadastro' && <ScreenCompletarCadastro user={user} onNavigate={handleNavigate} />}
          {screen === 'admin'              && <ScreenAdmin user={user} notasLiberadas={notasLiberadas} onLiberarNotas={liberarNotas} onBloquearNotas={bloquearNotas} />}

        </main>
      </div>

      {/* Pop-up tutorial (2 primeiras entradas) — PDF Site AVD 5 · item 40 */}
      {tutorialAberto && (
        <TutorialPlataforma user={user} onClose={() => setTutorialAberto(false)} />
      )}

      {/* Dica lateral persistente — PDF Site AVD 5 · item 40 */}
      {['colaborador','gestor'].includes(user?.perfil) && (
        <DicaLateral user={user} screen={screen} aberta={dicaLateralAberta} setAberta={setDicaLateralAberta} onAbrirTutorial={() => setTutorialAberto(true)} />
      )}

      {/* Bottom Navigation · apenas mobile */}
      {isMobile && (
        <>
          <nav className="mobile-bottom-nav" style={{
            position: 'fixed', bottom: 0, left: 0, right: 0,
            height: 'calc(62px + env(safe-area-inset-bottom, 0px))',
            paddingBottom: 'env(safe-area-inset-bottom, 0px)',
            background: 'rgba(255,255,255,.96)', backdropFilter: 'saturate(180%) blur(16px)', WebkitBackdropFilter: 'saturate(180%) blur(16px)',
            borderTop: '1px solid var(--escalab-line)', display: 'flex', zIndex: 100,
            boxShadow: '0 -6px 24px rgba(10,15,18,.06)',
          }}>
            {bottomNavItems.map(n => {
              const ativa = screen === n.id || (screen === 'perfil' && n.id === 'colaboradores');
              return (
                <button key={n.id} onClick={() => { handleNavigate(n.id); setMaisAberto(false); }} className="mobile-nav-btn" style={{
                  flex: 1, border: 0, background: 'transparent', display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', gap: 4, cursor: 'pointer', padding: '6px 2px',
                  color: ativa ? 'var(--escalab-brand)' : 'var(--escalab-mute)',
                  fontFamily: 'var(--font-sans)', fontSize: 10, fontWeight: ativa ? 700 : 500,
                  position: 'relative',
                  transition: 'color .2s cubic-bezier(.4,0,.2,1)',
                }}>
                  {ativa && <span style={{ position: 'absolute', top: 0, left: '50%', transform: 'translateX(-50%)', width: 28, height: 3, borderRadius: '0 0 3px 3px', background: 'var(--escalab-brand)', animation: 'navIndicator .3s cubic-bezier(.4,0,.2,1)' }} />}
                  <div style={{ transition: 'transform .2s cubic-bezier(.4,0,.2,1)', transform: ativa ? 'translateY(-1px) scale(1.08)' : 'none' }}>
                    <Icon name={n.icon} size={20} />
                  </div>
                  <span style={{ overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', maxWidth: 60 }}>{n.label.split(' ')[0]}</span>
                </button>
              );
            })}
            {/* Botão "Mais" · sempre visível */}
            <button onClick={() => setMaisAberto(v => !v)} className="mobile-nav-btn" style={{
              flex: 1, border: 0, background: 'transparent',
              display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', gap: 4, cursor: 'pointer',
              color: maisAberto ? 'var(--escalab-brand)' : 'var(--escalab-mute)',
              fontFamily: 'var(--font-sans)', fontSize: 10, fontWeight: maisAberto ? 700 : 500,
              position: 'relative',
              transition: 'color .2s cubic-bezier(.4,0,.2,1)',
            }}>
              {maisAberto && <span style={{ position: 'absolute', top: 0, left: '50%', transform: 'translateX(-50%)', width: 28, height: 3, borderRadius: '0 0 3px 3px', background: 'var(--escalab-brand)' }} />}
              <div style={{ transition: 'transform .25s cubic-bezier(.4,0,.2,1)', transform: maisAberto ? 'rotate(90deg)' : 'rotate(0deg)' }}>
                <Icon name={maisAberto ? 'close' : 'more_v'} size={20} />
              </div>
              <span>Mais</span>
            </button>
          </nav>

          {/* Painel "Mais" · slide up com scroll interno e safe area */}
          {maisAberto && (
            <div onClick={() => setMaisAberto(false)} style={{
              position: 'fixed', inset: 0, background: 'rgba(10,15,18,.5)',
              backdropFilter: 'blur(6px)', WebkitBackdropFilter: 'blur(6px)',
              zIndex: 99, display: 'flex', alignItems: 'flex-end',
              animation: 'maisOverlayIn .22s cubic-bezier(.4,0,.2,1)',
            }}>
              <div onClick={e => e.stopPropagation()} style={{
                background: '#fff', borderRadius: '22px 22px 0 0', width: '100%',
                maxHeight: '85vh', display: 'flex', flexDirection: 'column',
                boxShadow: '0 -12px 40px rgba(10,15,18,.18)',
                animation: 'maisSheetIn .32s cubic-bezier(.16,1,.3,1)',
              }}>
                {/* Handle drag */}
                <div style={{ flexShrink: 0, padding: '10px 0 6px', cursor: 'grab' }}>
                  <div style={{ width: 44, height: 4.5, borderRadius: 999, background: 'var(--escalab-line)', margin: '0 auto' }} />
                </div>
                {/* Header */}
                <div style={{ flexShrink: 0, padding: '4px 18px 14px', borderBottom: '1px solid var(--escalab-line)' }}>
                  <div style={{ fontSize: 17, fontWeight: 700, color: 'var(--escalab-ink)', letterSpacing: '-.01em' }}>Todas as seções</div>
                  <div style={{ fontSize: 12.5, color: 'var(--escalab-mute)', marginTop: 2 }}>Acesse qualquer área da plataforma</div>
                </div>
                {/* Lista com scroll interno */}
                <div style={{
                  flex: 1, overflowY: 'auto', overflowX: 'hidden',
                  WebkitOverflowScrolling: 'touch',
                  padding: '14px 12px calc(20px + env(safe-area-inset-bottom, 0px))',
                }}>
                  <div style={{ display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)', gap: 8 }}>
                    {navItems.filter(n => !n.id.startsWith('_')).map((n, idx) => {
                      const ativa = screen === n.id;
                      return (
                        <button key={n.id} onClick={() => { handleNavigate(n.id); setMaisAberto(false); }} className="mais-tile" style={{
                          border: `1px solid ${ativa ? 'var(--escalab-brand-soft)' : 'var(--escalab-line)'}`,
                          background: ativa ? 'var(--escalab-brand-tint)' : '#fff',
                          borderRadius: 16, padding: '16px 8px', cursor: 'pointer',
                          display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 8,
                          color: ativa ? 'var(--escalab-brand-deep)' : 'var(--escalab-slate)',
                          fontFamily: 'var(--font-sans)', fontSize: 11.5, fontWeight: ativa ? 700 : 600,
                          textAlign: 'center', minHeight: 88,
                          transition: 'transform .18s cubic-bezier(.4,0,.2,1), box-shadow .18s, background .18s, border-color .18s',
                          animation: `maisTileIn .35s cubic-bezier(.16,1,.3,1) ${idx * 25}ms both`,
                        }}>
                          <div style={{
                            width: 40, height: 40, borderRadius: 12,
                            background: ativa ? 'var(--escalab-brand)' : 'var(--escalab-paper)',
                            display: 'flex', alignItems: 'center', justifyContent: 'center',
                            color: ativa ? '#fff' : 'var(--escalab-brand-deep)',
                            boxShadow: ativa ? '0 4px 12px rgba(0,150,123,.28)' : 'none',
                            transition: 'all .2s',
                          }}>
                            <Icon name={n.icon} size={19} />
                          </div>
                          <span style={{ lineHeight: 1.25, wordBreak: 'break-word' }}>{n.label}</span>
                        </button>
                      );
                    })}
                  </div>
                  <div style={{ marginTop: 16, paddingTop: 14, borderTop: '1px solid var(--escalab-line)' }}>
                    <button onClick={handleLogout} style={{
                      width: '100%', border: '1px solid #fecaca', background: '#fff5f5', borderRadius: 14,
                      padding: '14px 16px', cursor: 'pointer', display: 'flex', alignItems: 'center', gap: 12,
                      color: '#dc2626', fontFamily: 'var(--font-sans)', fontSize: 14, fontWeight: 600,
                      transition: 'transform .15s, background .15s, box-shadow .15s',
                    }}
                    onMouseDown={e => e.currentTarget.style.transform = 'scale(.98)'}
                    onMouseUp={e => e.currentTarget.style.transform = 'scale(1)'}
                    onMouseLeave={e => e.currentTarget.style.transform = 'scale(1)'}>
                    <div style={{ width: 36, height: 36, borderRadius: 10, background: '#fee2e2', display: 'flex', alignItems: 'center', justifyContent: 'center', flexShrink: 0 }}>
                      <Icon name="logout" size={18} />
                    </div>
                    Sair da conta
                  </button>
                  </div>
                </div>
              </div>
            </div>
          )}
        </>
      )}

      <FeedbackModal open={feedbackAberto} onClose={() => setFeedbackAberto(false)} user={user} screen={screen} />
    </div>
  );
};

// Conteúdo do tutorial por perfil — PDF Site AVD 5 · item 40
const TUTORIAL_PASSOS = {
  colaborador: [
    { titulo:'Intranet',        desc:'Sua central: avisos, eventos, jornal, aniversariantes, atalhos do dia a dia, reconhecimentos e arquivos por setor.',                          icon:'home',     cor:'#00836B' },
    { titulo:'Pesquisas',        desc:'Aqui você responde a PCO (clima), o Censo (diversidade) e Outras Pesquisas. Sua opinião direciona o que o GC vai priorizar.',                  icon:'clipboard', cor:'#1F4A8A' },
    { titulo:'AVD & Feedback',  desc:'A avaliação acontece em 5 etapas: autoavaliação · setor · líder · intersetorial · feedback estruturado. Acompanhe seu progresso no ciclo.',     icon:'star',     cor:'#6B3FA0' },
    { titulo:'Férias & Day Off',desc:'Veja seu saldo, solicite férias e Day Off, e acompanhe a aprovação do líder e do GC.',                                                          icon:'calendar', cor:'#B56500' },
    { titulo:'Ausências e Horas',desc:'Lance ausências (com atestado), justifique faltas e registre horas trabalhadas no banco de horas.',                                            icon:'clock',    cor:'#B3261E' },
    { titulo:'Treinamentos',    desc:'Acesse o calendário de treinamentos, marque presença nas chamadas e avalie cada curso pelo NPS.',                                              icon:'trophy',   cor:'#00836B' },
  ],
  gestor: [
    { titulo:'Visão do Time',    desc:'Em Colaboradores e Organograma você acompanha seus liderados: cargo, datas, feedbacks, AVD e contatos.',                                       icon:'users',    cor:'#1F4A8A' },
    { titulo:'Movimentação',     desc:'Abra cards de admissão, promoção/movimentação e desligamento. Você acompanha tudo por etapas com subtarefas e comentários.',                   icon:'send',     cor:'#6B3FA0' },
    { titulo:'Recrutamento',     desc:'Vagas em que você é responsável aparecem como card. Use o kanban para mover candidatos por etapa e avaliar com notas.',                       icon:'users',    cor:'#00836B' },
    { titulo:'AVD do Time',      desc:'Antes de dar feedback, é obrigatório preencher o preparo (notas + destaques + pontos a evoluir). O preparo libera o feedback estruturado.',    icon:'star',     cor:'#B56500' },
    { titulo:'Aprovações',       desc:'Aprovações de férias, Day Off e ausências passam por você antes de chegar ao GC. Use o sino de notificações para não perder pedidos abertos.', icon:'check',    cor:'#B3261E' },
    { titulo:'Painéis',          desc:'Visualize indicadores do seu setor: AVD, feedbacks, presença em treinamentos, ausências e perfil do quadro.',                                  icon:'chart',    cor:'#00967B' },
  ],
};

const TutorialPlataforma = ({ user, onClose }) => {
  const passos = TUTORIAL_PASSOS[user.perfil] || TUTORIAL_PASSOS.colaborador;
  const [idx, setIdx] = useState(0);
  const p = passos[idx];
  return (
    <div onClick={onClose} style={{ position:'fixed', inset:0, background:'rgba(10,15,18,.65)', backdropFilter:'blur(8px)', zIndex:1200, display:'flex', alignItems:'center', justifyContent:'center', padding:24 }}>
      <div onClick={e => e.stopPropagation()} style={{ background:'#fff', borderRadius:20, width:'100%', maxWidth:520, overflow:'hidden', boxShadow:'0 32px 96px rgba(0,0,0,.28)' }}>
        <div style={{ background:`linear-gradient(135deg, ${p.cor}, ${p.cor}cc)`, color:'#fff', padding:'24px 28px', position:'relative' }}>
          <button onClick={onClose} style={{ position:'absolute', top:14, right:14, border:'1px solid rgba(255,255,255,.4)', background:'rgba(0,0,0,.18)', borderRadius:8, cursor:'pointer', color:'#fff', width:28, height:28 }}>×</button>
          <div style={{ fontSize:10.5, fontWeight:700, letterSpacing:'.14em', textTransform:'uppercase', marginBottom:6, opacity:.85 }}>Tutorial · {idx + 1} de {passos.length}</div>
          <h3 style={{ margin:0, fontSize:22, fontWeight:800, letterSpacing:'-.01em', color:'#fff' }}>Bem-vindo(a) ao Escalab Gestão de Pessoas</h3>
          <div style={{ fontSize:13, opacity:.9, marginTop:6 }}>Esse guia rápido aparece nas duas primeiras vezes que você entra. Depois fica disponível no botão de dica lateral.</div>
        </div>
        <div style={{ padding:'22px 28px 8px' }}>
          <div style={{ display:'flex', gap:12, alignItems:'flex-start' }}>
            <div style={{ width:44, height:44, borderRadius:12, background:p.cor + '20', color:p.cor, display:'flex', alignItems:'center', justifyContent:'center', flexShrink:0 }}>
              <Icon name={p.icon} size={22} />
            </div>
            <div>
              <div style={{ fontSize:16, fontWeight:800, color:'var(--escalab-ink)', marginBottom:4 }}>{p.titulo}</div>
              <div style={{ fontSize:13.5, color:'var(--escalab-slate)', lineHeight:1.55 }}>{p.desc}</div>
            </div>
          </div>
        </div>
        <div style={{ padding:'14px 28px 20px', display:'flex', alignItems:'center', justifyContent:'space-between', gap:10 }}>
          <div style={{ display:'flex', gap:6 }}>
            {passos.map((_,i) => <span key={i} style={{ width: i === idx ? 22 : 7, height:7, borderRadius:7, background: i === idx ? p.cor : 'var(--escalab-line)', transition:'all .2s' }} />)}
          </div>
          <div style={{ display:'flex', gap:8 }}>
            {idx > 0 && <button onClick={() => setIdx(i => i - 1)} style={{ border:'1px solid var(--escalab-line)', background:'#fff', borderRadius:8, padding:'7px 14px', cursor:'pointer', fontSize:13, fontFamily:'var(--font-sans)' }}>Anterior</button>}
            {idx < passos.length - 1
              ? <button onClick={() => setIdx(i => i + 1)} style={{ border:0, background:p.cor, color:'#fff', borderRadius:8, padding:'7px 16px', cursor:'pointer', fontSize:13, fontFamily:'var(--font-sans)', fontWeight:700 }}>Próximo</button>
              : <button onClick={onClose} style={{ border:0, background:p.cor, color:'#fff', borderRadius:8, padding:'7px 16px', cursor:'pointer', fontSize:13, fontFamily:'var(--font-sans)', fontWeight:700 }}>Começar</button>}
          </div>
        </div>
      </div>
    </div>
  );
};

const DicaLateral = ({ user, screen, aberta, setAberta, onAbrirTutorial }) => {
  // Dica contextual por tela atual
  const dicasPorTela = {
    intranet: 'Cada caixinha do Acesso Rápido é um atalho. Use o reconhecimento para celebrar quem fez a diferença.',
    avisos: 'Avisos importantes do GC aparecem aqui. Marque como lido para limpar a lista.',
    avd: 'A AVD acontece em 5 etapas. Comece pela autoavaliação e siga a ordem indicada.',
    pco: 'A PCO não é necessariamente anônima — você pode colocar seu nome se quiser ser identificado.',
    censo: 'O Censo é anônimo. Você pode pular qualquer pergunta que preferir não responder.',
    ferias: 'Seu saldo de férias renova a cada novo período aquisitivo. Dias não retirados são perdidos.',
    ausencia: 'Use Ausência para imprevistos médicos ou pessoais urgentes (com atestado quando aplicável).',
    horas: 'Lance suas horas o quanto antes. Se ficar 3 dias sem lançar, recebe lembrete automático.',
    treinamentos: 'Marque presença nos treinamentos pela tela de chamada. Sua frequência conta no painel.',
    organograma: 'Cada card mostra o que a pessoa faz no Escalab. Clique pra ver detalhes completos.',
    outras_pesquisas: 'Responda às pesquisas abertas — feedback estruturado é o que abastece o painel do GC.',
  };
  const dica = dicasPorTela[screen];
  if (!dica) return null;
  return (
    <div style={{ position:'fixed', bottom:24, right:24, zIndex:90, maxWidth: aberta ? 320 : 56, transition:'all .25s var(--ease-out)' }}>
      {aberta ? (
        <div style={{ background:'#fff', border:'1px solid var(--escalab-line)', borderRadius:14, padding:'14px 16px', boxShadow:'0 12px 32px rgba(0,0,0,.18)', position:'relative' }}>
          <button onClick={() => setAberta(false)} title="Esconder dica" style={{ position:'absolute', top:8, right:8, border:0, background:'transparent', cursor:'pointer', color:'var(--escalab-mute)', padding:4, lineHeight:1 }}>×</button>
          <div style={{ display:'flex', gap:8, alignItems:'center', marginBottom:6 }}>
            <span style={{ fontSize:18 }}>💡</span>
            <span style={{ fontSize:12, fontWeight:800, letterSpacing:'.08em', textTransform:'uppercase', color:'var(--escalab-brand)' }}>Dica</span>
          </div>
          <div style={{ fontSize:12.5, color:'var(--escalab-slate)', lineHeight:1.5, paddingRight:12 }}>{dica}</div>
          <button onClick={onAbrirTutorial} style={{ marginTop:10, border:'1px solid var(--escalab-brand-soft)', background:'var(--escalab-brand-tint)', color:'var(--escalab-brand-deep)', borderRadius:8, padding:'6px 12px', cursor:'pointer', fontSize:12, fontWeight:600 }}>
            Rever tutorial completo
          </button>
        </div>
      ) : (
        <button onClick={() => setAberta(true)} title="Abrir dica" style={{ width:48, height:48, borderRadius:'50%', border:0, background:'var(--escalab-brand)', color:'#fff', cursor:'pointer', fontSize:22, boxShadow:'0 8px 22px rgba(0,134,107,.4)' }}>💡</button>
      )}
    </div>
  );
};

ReactDOM.createRoot(document.getElementById('root')).render(<App />);
