// ═══════════════════════════════════════════════════════════════
// UI · Notificações · sino contextual por perfil
// ═══════════════════════════════════════════════════════════════

function gerarNotificacoes(user) {
  if (!user) return [];
  const hoje = new Date().toISOString().slice(0, 10);
  const em7d = new Date(); em7d.setDate(em7d.getDate() + 7);
  const semana = em7d.toISOString().slice(0, 10);
  const lista = [];

  function ler(key, fallback) {
    try { return JSON.parse(localStorage.getItem(key) || 'null') || fallback; } catch { return fallback; }
  }

  // ── ADMIN / RH ────────────────────────────────────────────────────────────
  if (user.perfil === 'admin') {
    // Candidatos novos em triagem
    const processos = ler('escalab_recrutamento', []);
    const novosCandit = processos.flatMap(p => (p.candidatos || []).filter(c => c.etapa === 'triagem')).length;
    if (novosCandit > 0) lista.push({ id:'cand', tipo:'info', icone:'users', titulo:`${novosCandit} candidato${novosCandit>1?'s':''} aguardando triagem`, sub:'Recrutamento', screen:'recrutamento', cor:'#1F4A8A', bg:'#EEF3FA' });

    // Ausências pendentes
    const ausencias = ler('escalab_ausencias', []);
    const ausP = ausencias.filter(a => a.status === 'pendente').length;
    if (ausP > 0) lista.push({ id:'aus', tipo:'warn', icone:'clock', titulo:`${ausP} ausência${ausP>1?'s':''} aguardando aprovação`, sub:'Ausências', screen:'ausencia', cor:'#B56500', bg:'#FFF7EB' });

    // Day offs pendentes
    const dayoffs = ler('escalab_dayoff', []);
    const doP = dayoffs.filter(d => d.status === 'pendente').length;
    if (doP > 0) lista.push({ id:'do', tipo:'warn', icone:'calendar', titulo:`${doP} day off${doP>1?'s':''} pendente${doP>1?'s':''}`, sub:'Férias & Day Off', screen:'ferias', cor:'#B56500', bg:'#FFF7EB' });

    // Férias pendentes RH
    const ferias = ler('escalab_ferias', []);
    const ferP = ferias.filter(f => f.status === 'pendente_rh').length;
    if (ferP > 0) lista.push({ id:'fer', tipo:'warn', icone:'calendar', titulo:`${ferP} férias aguardando aprovação GC`, sub:'Férias & Day Off', screen:'ferias', cor:'#6B3FA0', bg:'#F4EEFF' });

    // Pesquisas com novas respostas
    const pesquisas = ler('escalab_outras_pesquisas', []);
    const respostas = ler('escalab_op_respostas', []);
    pesquisas.filter(p => p.status === 'ativa').forEach(p => {
      const n = respostas.filter(r => r.pesquisaId === p.id).length;
      if (n > 0) lista.push({ id:'pq'+p.id, tipo:'info', icone:'clipboard', titulo:`"${p.titulo}" · ${n} resposta${n>1?'s':''}`, sub:'Outras Pesquisas', screen:'outras_pesquisas', cor:'#B56500', bg:'#FFF7EB' });
    });

    // NPS respostas de treinamento
    const npsResps = ler('escalab_nps_respostas', []);
    if (npsResps.length > 0) {
      const treinos = (ler('escalab_treinamentos_v2', null) || ler('escalab_treinamentos', []));
      const agrupado = {};
      npsResps.forEach(r => { agrupado[r.treinoId] = (agrupado[r.treinoId] || 0) + 1; });
      Object.entries(agrupado).forEach(([tid, n]) => {
        const t = treinos.find(x => x.id === tid);
        if (t) lista.push({ id:'nps'+tid, tipo:'info', icone:'star', titulo:`${n} avaliação${n>1?'s':''} NPS · "${t.titulo}"`, sub:'Treinamentos', screen:'treinamentos', cor:'#00836B', bg:'#E6F5F1' });
      });
    }

    // Formações não vistas
    const novosForm = COLABORADORES.reduce((acc, c) => {
      try {
        const fs = JSON.parse(localStorage.getItem(`escalab_form_${c.id}`) || '[]');
        const n = fs.filter(f => !f.vistoRH).length;
        return acc + n;
      } catch { return acc; }
    }, 0);
    if (novosForm > 0) lista.push({ id:'form', tipo:'success', icone:'trophy', titulo:`${novosForm} nova${novosForm>1?'s':''} formação${novosForm>1?'s':''} para revisar`, sub:'Perfil dos colaboradores', screen:'colaboradores', cor:'#00836B', bg:'#E6F5F1' });
  }

  // ── GESTOR ────────────────────────────────────────────────────────────────
  if (user.perfil === 'gestor') {
    // Avaliações pendentes do time
    const liderados = COLABORADORES.filter(c => c.gestorNome === user.nome);
    const avsPend = AVALIACOES.filter(a => a.avaliadorId === user.id && a.status === 'pendente').length;
    if (avsPend > 0) lista.push({ id:'avd', tipo:'warn', icone:'star', titulo:`${avsPend} avaliação${avsPend>1?'s':''} pendente${avsPend>1?'s':''}`, sub:'AVD & Feedback', screen:'avd', cor:'#B56500', bg:'#FFF7EB' });

    // Ausências do time pendentes
    const ausencias = ler('escalab_ausencias', []);
    const ausPend = ausencias.filter(a => a.status === 'pendente' && liderados.some(l => l.id === a.colaboradorId)).length;
    if (ausPend > 0) lista.push({ id:'austime', tipo:'warn', icone:'clock', titulo:`${ausPend} ausência${ausPend>1?'s':''} do time aguardando`, sub:'Ausências', screen:'ausencia', cor:'#B56500', bg:'#FFF7EB' });

    // Pesquisas ativas não respondidas
    const pesquisas = ler('escalab_outras_pesquisas', []);
    const respostas = ler('escalab_op_respostas', []);
    const pqPend = pesquisas.filter(p => p.status === 'ativa' && !respostas.some(r => r.pesquisaId === p.id && r.colaboradorId === user.id)).length;
    if (pqPend > 0) lista.push({ id:'pqg', tipo:'info', icone:'clipboard', titulo:`${pqPend} pesquisa${pqPend>1?'s':''} aguardando sua resposta`, sub:'Pesquisas', screen:'outras_pesquisas', cor:'#1F4A8A', bg:'#EEF3FA' });

    // Treinamentos próximos
    const treinos = (ler('escalab_treinamentos_v2', null) || ler('escalab_treinamentos', []));
    const proximos = treinos.filter(t => t.status === 'agendado' && t.data >= hoje && t.data <= semana).length;
    if (proximos > 0) lista.push({ id:'tg', tipo:'info', icone:'trophy', titulo:`${proximos} treinamento${proximos>1?'s':''} agendado${proximos>1?'s':''} esta semana`, sub:'Treinamentos', screen:'treinamentos', cor:'#00836B', bg:'#E6F5F1' });
  }

  // ── MOVIMENTAÇÃO: responsáveis de subtarefas (qualquer perfil) ───────────
  try {
    const movAll = ler('escalab_movimentacao', {});
    const tipos = ['admissao','promocao','desligamento'];
    const primeiroNome = (user.nome || '').split(' ')[0].toLowerCase();
    tipos.forEach(tp => {
      (movAll[tp] || []).forEach(sol => {
        const minhasTarefas = (sol.subtarefas || []).filter(s => !s.feita && s.resp && s.resp.toLowerCase().includes(primeiroNome));
        if (minhasTarefas.length > 0) {
          const label = tp === 'admissao' ? 'Admissão' : tp === 'promocao' ? 'Movimentação' : 'Desligamento';
          lista.push({ id:`mov-${tp}-${sol.id}`, tipo:'warn', icone:'clipboard', titulo:`${minhasTarefas.length} tarefa${minhasTarefas.length>1?'s':''} pra você em ${label} #${sol.id}`, sub:`Movimentação · ${sol.dados?.nomeColaborador || sol.dados?.solicitante || ''}`, screen:'movimentacao', cor:'#6B3FA0', bg:'#F4EEFF' });
        }
      });
    });
  } catch {}

  // ── PDI · ações do colaborador perto de vencer (qualquer perfil com PDI) ────
  try {
    const pdisLista = ler('escalab_pdi_v1', []);
    const meuPDI = pdisLista.find(p => p.colaboradorId === user.id);
    if (meuPDI) {
      const limiteDias = 7;
      const limite = Date.now() + limiteDias * 86400000;
      const todasAcoes = [...(meuPDI.acoes || []), ...(meuPDI.acoesColab || [])];
      const proximas = todasAcoes.filter(a => {
        if (!a.prazo) return false;
        const st = a.status || 'planejada';
        if (st === 'concluida' || st === 'cancelada') return false;
        const t = new Date(a.prazo + 'T00:00:00').getTime();
        return isFinite(t) && t >= Date.now() && t <= limite;
      });
      proximas.forEach(a => {
        const t = new Date(a.prazo + 'T00:00:00');
        const dias = Math.max(0, Math.round((t.getTime() - Date.now()) / 86400000));
        const desc = (a.descricao || 'Ação do seu PDI').slice(0, 60);
        lista.push({
          id: 'pdi_acao_' + a.id,
          tipo: 'warn',
          icone: 'clock',
          titulo: `Ação do PDI vence ${dias === 0 ? 'hoje' : `em ${dias} dia${dias === 1 ? '' : 's'}`}: ${desc}`,
          sub: `Prazo ${t.toLocaleDateString('pt-BR')} · PDI`,
          screen: 'pdi',
          cor: '#B45309', bg: '#FEF3C7',
        });
      });
    }
  } catch {}

  // ── PDI · gestor recebe aviso das ações do time perto de vencer ────────────
  if (user.perfil === 'gestor') {
    try {
      const pdisLista = ler('escalab_pdi_v1', []);
      const liderados = COLABORADORES.filter(c => c.gestorNome === user.nome);
      const limiteDias = 7;
      const limite = Date.now() + limiteDias * 86400000;
      let totalProximas = 0;
      liderados.forEach(l => {
        const pdi = pdisLista.find(p => p.colaboradorId === l.id);
        if (!pdi) return;
        const acoes = [...(pdi.acoes || []), ...(pdi.acoesColab || [])];
        acoes.forEach(a => {
          if (!a.prazo) return;
          const st = a.status || 'planejada';
          if (st === 'concluida' || st === 'cancelada') return;
          const t = new Date(a.prazo + 'T00:00:00').getTime();
          if (isFinite(t) && t >= Date.now() && t <= limite) totalProximas++;
        });
      });
      if (totalProximas > 0) {
        lista.push({
          id: 'pdi_time_prazo',
          tipo: 'warn',
          icone: 'clock',
          titulo: `${totalProximas} ação${totalProximas > 1 ? 'ões' : ''} do PDI do time perto${totalProximas > 1 ? '' : ' do'} prazo`,
          sub: 'PDI · seu time',
          screen: 'pdi',
          cor: '#B45309', bg: '#FEF3C7',
        });
      }
    } catch {}
  }

  // ── COLABORADOR / FINANCEIRO ──────────────────────────────────────────────
  if (user.perfil === 'colaborador' || user.perfil === 'financeiro') {
    // Pesquisas ativas não respondidas
    const pesquisas = ler('escalab_outras_pesquisas', []);
    const respostas = ler('escalab_op_respostas', []);
    const pqPend = pesquisas.filter(p => p.status === 'ativa' && !respostas.some(r => r.pesquisaId === p.id && r.colaboradorId === user.id)).length;
    if (pqPend > 0) lista.push({ id:'pqc', tipo:'warn', icone:'clipboard', titulo:`${pqPend} pesquisa${pqPend>1?'s':''} disponível${pqPend>1?'is':''} para responder`, sub:'Pesquisas', screen:'outras_pesquisas', cor:'#6B3FA0', bg:'#F4EEFF' });

    // Treinamentos próximos
    const treinos = (ler('escalab_treinamentos_v2', null) || ler('escalab_treinamentos', []));
    const proximos = treinos.filter(t => t.status === 'agendado' && t.data >= hoje && t.data <= semana).length;
    if (proximos > 0) lista.push({ id:'tc', tipo:'info', icone:'trophy', titulo:`${proximos} treinamento${proximos>1?'s':''} agendado${proximos>1?'s':''} esta semana`, sub:'Treinamentos', screen:'treinamentos', cor:'#00836B', bg:'#E6F5F1' });

    // Avisos gerais (escalab_avisos)
    const avisos = ler('escalab_avisos', []);
    const lidos = ler(`escalab_avisos_lidos_${user.id}`, []);
    avisos.filter(a => !lidos.includes(a.id)).forEach(a => {
      lista.push({ id:'av'+a.id, tipo:'info', icone:'bell', titulo:a.titulo, sub:a.corpo?.slice(0,60)||'Aviso geral', screen:'avisos', cor:'#1F4A8A', bg:'#EEF3FA' });
    });
  }

  return lista;
}

// ── Componente sino ───────────────────────────────────────────────────────────

const SinoNotificacoes = ({ user, onNavigate }) => {
  const [aberto, setAberto] = useState(false);
  const [notifs, setNotifs] = useState([]);
  const [lidas, setLidas]   = useState(() => {
    try { return JSON.parse(localStorage.getItem(`escalab_notif_lidas_${user?.id}`) || '[]'); } catch { return []; }
  });

  useEffect(() => {
    setNotifs(gerarNotificacoes(user));
    const t = setInterval(() => setNotifs(gerarNotificacoes(user)), 30000);
    return () => clearInterval(t);
  }, [user?.id]);

  const novas = notifs.filter(n => !lidas.includes(n.id));
  const count  = novas.length;

  function marcarTodasLidas() {
    const novasIds = [...lidas, ...notifs.map(n => n.id)];
    localStorage.setItem(`escalab_notif_lidas_${user?.id}`, JSON.stringify(novasIds));
    setLidas(novasIds);
  }

  function handleClick(notif) {
    const novasIds = [...lidas, notif.id];
    localStorage.setItem(`escalab_notif_lidas_${user?.id}`, JSON.stringify(novasIds));
    setLidas(novasIds);
    onNavigate(notif.screen);
    setAberto(false);
  }

  return (
    <div style={{ position:'relative' }}>
      {/* Botão */}
      <button onClick={() => setAberto(v => !v)} style={{ border:0, background:aberto?'var(--escalab-brand-tint)':'transparent', cursor:'pointer', color:aberto?'var(--escalab-brand)':'var(--escalab-mute)', padding:'6px 7px', borderRadius:8, position:'relative', transition:'all .15s' }}>
        <Icon name="bell" size={17}/>
        {count > 0 && (
          <span style={{ position:'absolute', top:2, right:2, width:16, height:16, borderRadius:'50%', background:'#B3261E', color:'#fff', fontSize:9, fontWeight:700, display:'flex', alignItems:'center', justifyContent:'center', border:'2px solid #fff' }}>
            {count > 9 ? '9+' : count}
          </span>
        )}
      </button>

      {/* Dropdown */}
      {aberto && (
        <>
          <div onClick={() => setAberto(false)} style={{ position:'fixed', inset:0, zIndex:50 }}/>
          <div style={{ position:'absolute', right:0, top:'calc(100% + 8px)', width:340, background:'#fff', borderRadius:16, boxShadow:'0 8px 32px rgba(0,0,0,.14)', border:'1px solid var(--escalab-line)', zIndex:51, overflow:'hidden', animation:'popIn .18s var(--ease-out)' }}>
            {/* Header dropdown */}
            <div style={{ padding:'14px 18px', borderBottom:'1px solid var(--escalab-line)', display:'flex', alignItems:'center', gap:8 }}>
              <span style={{ fontSize:14, fontWeight:700, flex:1, color:'var(--escalab-ink)' }}>Notificações</span>
              {count > 0 && <span style={{ fontSize:11, background:'#B3261E', color:'#fff', borderRadius:999, padding:'1px 8px', fontWeight:700 }}>{count} nova{count>1?'s':''}</span>}
              {notifs.length > 0 && (
                <button onClick={marcarTodasLidas} style={{ border:0, background:'transparent', cursor:'pointer', fontSize:12, color:'var(--escalab-brand)', fontFamily:'var(--font-sans)', fontWeight:600 }}>Marcar tudo lido</button>
              )}
            </div>

            {/* Lista */}
            <div style={{ maxHeight:380, overflowY:'auto' }}>
              {notifs.length === 0 ? (
                <div style={{ padding:'36px 20px', textAlign:'center', color:'var(--escalab-mute)', fontSize:13 }}>
                  <div style={{ fontSize:28, marginBottom:8 }}>🔔</div>
                  Nenhuma novidade por aqui!
                </div>
              ) : (
                notifs.map(n => {
                  const isNova = !lidas.includes(n.id);
                  return (
                    <div key={n.id} onClick={() => handleClick(n)} style={{ display:'flex', gap:12, padding:'13px 18px', cursor:'pointer', background:isNova?n.bg:'#fff', borderBottom:'1px solid var(--escalab-line)', transition:'background .12s' }}
                      onMouseEnter={e=>e.currentTarget.style.background=n.bg}
                      onMouseLeave={e=>e.currentTarget.style.background=isNova?n.bg:'#fff'}>
                      <div style={{ width:34, height:34, borderRadius:10, background:n.cor+'20', display:'flex', alignItems:'center', justifyContent:'center', flexShrink:0 }}>
                        <Icon name={n.icone} size={15} />
                      </div>
                      <div style={{ flex:1, minWidth:0 }}>
                        <div style={{ fontSize:13, fontWeight:isNova?600:400, color:'var(--escalab-ink)', lineHeight:1.35, marginBottom:3 }}>{n.titulo}</div>
                        <div style={{ fontSize:11.5, color:'var(--escalab-mute)' }}>{n.sub}</div>
                      </div>
                      {isNova && <div style={{ width:7, height:7, borderRadius:'50%', background:n.cor, flexShrink:0, marginTop:4 }}/>}
                    </div>
                  );
                })
              )}
            </div>

            {notifs.length > 0 && (
              <div style={{ padding:'10px 18px', borderTop:'1px solid var(--escalab-line)', background:'var(--escalab-paper)', textAlign:'center' }}>
                <span style={{ fontSize:12, color:'var(--escalab-mute)' }}>{notifs.length} notificação{notifs.length>1?'s':''} · atualiza a cada 30s</span>
              </div>
            )}
          </div>
        </>
      )}
    </div>
  );
};

window.SinoNotificacoes = SinoNotificacoes;
