// CTox EAD — módulos 02 a 14. Conteúdo fiel à Apostila de Treinamento Synvia.
// Módulo 01 tem animação própria (arquivo separado) e é referenciado pelo hub.

const MODULES = [
{
  n: '02', title: 'Aba de Coletas — Status', dur: '~1min40', audience: 'Recepção e coletores',
  sub: 'Como acompanhar cada amostra, do seu posto até a emissão do laudo.',
  topics: ['O painel de coletas', 'Informações por amostra', 'Tabela completa de status', 'O doador também acompanha'],
  beats: [
    { t: 'intro', dur: 6.5 },
    { t: 'screen', dur: 9, screen: 'coletas', props: (lt) => ({ revealRows: Math.min(6, Math.floor(Math.max(0, lt - 1.2) * 3)) }),
      cursor: [{ t: 0, x: 1400, y: 700 }, { t: 1.0, x: 48, y: 304, click: true }, { t: 3.5, x: 700, y: 620 }, { t: 6, x: 1500, y: 560 }],
      caption: 'A aba de Coletas é o painel central do posto — o ícone de tesoura no menu.', captionAt: 1.4, captionY: 930 },
    { t: 'bullets', dur: 8.5, kicker: 'INFORMAÇÕES VISÍVEIS POR COLETA', title: 'O que cada linha mostra',
      items: ['Número da Amostra', 'Status da Análise', 'Laboratório (PCL) e Nome do Coletor', 'Data da Coleta e Data do Recebimento'] },
    { t: 'bullets', dur: 8, dark: true, kicker: 'ÍCONES DE REFERÊNCIA — FINALIDADE CNH',
      title: 'Os carrinhos do RENACH',
      items: ['Carrinho do RENACH: identifica amostras com finalidade CNH.',
              'Carrinho preto: coleta prévia incluída com sucesso.',
              'Carrinho azul: laudo incluído com sucesso.'] },
    { t: 'table', dur: 20, kicker: 'ACOMPANHAMENTO', title: 'Tabela completa de status',
      cols: ['STATUS', 'O QUE SIGNIFICA', 'O QUE FAZER'], grid: '1fr 1.7fr 1.5fr',
      rows: [
        ['Aguardando Envio', 'A amostra ainda está no seu posto. Nenhum lote foi criado.', 'Crie o lote para que a logística agende a retirada.'],
        ['Aguardando Recebimento', 'O lote foi criado e a transportadora já retirou a amostra.', 'Acompanhe. Nenhuma ação necessária.'],
        ['Em Triagem', 'A amostra chegou ao laboratório e está sendo analisada.', 'Nenhuma ação. Aguarde o resultado.'],
        ['Amostra Recebida', 'Recebida, mas ainda não entrou em análise. Pode indicar erro de cadastro.', 'Aguarde o e-mail da Synvia indicando o que corrigir.'],
        ['Aguardando Confirmatório', 'A triagem detectou alguma substância. Precisa de análise confirmatória.', 'ATENÇÃO: isso NÃO significa resultado positivo.'],
        ['Em Confirmatório', 'Verificação de substâncias, metabólitos e quantificação.', 'Pode ser NEGATIVO se não atingir o cut-off do CONTRAN.'],
        ['Finalizado', 'O laudo foi emitido e está disponível.', 'Oriente o doador a acessar resultado.ctox.io.'],
        ['Recoleta', 'Amostra com erro que não tem como corrigir.', 'Nova coleta, sem custo ao doador.'],
      ] },
    { t: 'bullets', dur: 9, kicker: 'RESULTADO.CTOX.IO', title: 'O doador também acompanha',
      lead: 'Informe sempre o doador do site. Lá ele vê status da amostra, inclusão no RENACH, erros, pagamento e laudo.',
      items: ['Na FCC, o doador ASSINA confirmando que acompanhará o resultado — é obrigação dele.',
              { t: 'NUNCA diga "fica tranquilo, é automático". O acompanhamento ativo evita atrasos.', strong: true },
              'Uma informação errada pode atrasar o exame — por isso o doador precisa participar.'] },
    { t: 'rule', dur: 8, tone: 'warn', title: 'Dados do doador — nunca use os dados do posto',
      items: ['Sempre cadastre nome, telefone e e-mail do DOADOR.',
              'A Synvia pode precisar contatar o doador sobre CPF, data de nascimento, nome ou receituário.',
              'Colocar dados do posto impede o contato direto e atrasa a resolução de qualquer problema.'] },
    { t: 'closing', dur: 6, recap: ['Painel de coletas', 'Status da amostra', 'resultado.ctox.io'], next: 'Módulo 03 · Coletores, Testemunhas e Usuários' },
  ],
},
{
  n: '03', title: 'Coletores, Testemunhas e Usuários', dur: '~1min30', audience: 'Responsável do laboratório',
  sub: 'Quem pode realizar e quem pode testemunhar uma coleta.',
  topics: ['Aba de Coletores', 'Requisitos do coletor', 'Aba de Usuários', 'Coletor × Testemunha'],
  beats: [
    { t: 'intro', dur: 6.5 },
    { t: 'lesson', dur: 3.2, n: '01', title: 'Aba de Coletores', sub: 'Cadastro dos funcionários habilitados a realizar coletas.' },
    { t: 'bullets', dur: 11, kicker: 'REQUISITOS PARA SER COLETOR', title: 'Cinco condições obrigatórias',
      items: ['Ter vínculo empregatício com o laboratório/posto de coleta.',
              'Assistir ao vídeo oficial de treinamento no CTOX, pelo login do próprio coletor.',
              'Realizar a prova ao final do vídeo e atingir a nota mínima exigida.',
              'Após aprovação, solicitar o Certificado de Coleta emitido pela Synvia.',
              { t: 'O treinamento tem validade de 1 ano.', strong: true }] },
    { t: 'stats', dur: 7, kicker: 'A PROVA DO COLETOR', title: 'Como funciona a habilitação',
      stats: [{ v: '~15min', l: 'Duração do vídeo oficial de treinamento' },
              { v: '10', l: 'Questões na prova, liberada após o vídeo' },
              { v: '7', l: 'Acertos mínimos para aprovação' },
              { v: '1 ano', l: 'Validade do certificado' }] },
    { t: 'rule', dur: 8, tone: 'ok', label: 'GUARDE O CERTIFICADO', title: 'A Vigilância Sanitária pode pedir',
      items: ['O certificado pode ser solicitado ao emitir ou renovar o alvará do posto.',
              'Mantenha cópia física e digital de todos os certificados dos seus coletores.',
              'Solicite pelo e-mail treinamento@synvia.com, informando nome completo e CPF do coletor.'] },
    { t: 'lesson', dur: 3.2, n: '02', title: 'Aba de Usuários', sub: 'Todos os usuários vinculados ao CNPJ do posto.' },
    { t: 'bullets', dur: 6.5, kicker: 'FUNCIONALIDADES', title: 'O que você pode fazer na aba Usuários',
      items: ['Visualizar e editar dados cadastrais dos usuários.', 'Redefinir senhas de acesso.'] },
    { t: 'cards', dur: 10, kicker: 'DIFERENÇA IMPORTANTE', title: 'Coletor × Testemunha',
      cards: [
        { tag: 'CADASTRO FIXO', title: 'Coletor', hi: true, sub: 'Cadastrado na aba Coletores.',
          list: ['Realiza a coleta e opera o sistema.', 'Precisa de treinamento e certificado.', 'Vínculo empregatício obrigatório.'] },
        { tag: 'CADASTRO POR COLETA', title: 'Testemunha', sub: 'Cadastrada no momento de cada nova coleta.',
          list: ['Presente na sala durante toda a coleta.', 'Vínculo empregatício obrigatório.', 'Cadastro com RG, CPF e dados completos.'] },
      ] },
    { t: 'rule', dur: 8, tone: 'stop', title: 'A testemunha nunca pode ser familiar, amigo ou conhecido do doador',
      items: ['Ambos — coletor e testemunha — devem ter vínculo empregatício com o laboratório.',
              'A testemunha OBRIGATORIAMENTE deve estar presente na sala durante toda a coleta.'] },
    { t: 'closing', dur: 6, recap: ['Aba de Coletores', 'Certificado', 'Aba de Usuários', 'Coletor × Testemunha'], next: 'Módulo 04 · Dashboard' },
  ],
},
{
  n: '04', title: 'Dashboard de Acompanhamento', dur: '~1min', audience: 'Responsável do laboratório',
  sub: 'Visualize o volume de coletas do seu posto e planeje a operação.',
  topics: ['Acesso ao dashboard', 'Filtros por período', 'Leitura do gráfico', 'Planejamento da equipe'],
  beats: [
    { t: 'intro', dur: 6.5 },
    { t: 'screen', dur: 10, screen: 'dashboard',
      props: (lt) => ({ grow: Easing.easeOutCubic(clamp((lt - 1.6) / 1.4, 0, 1)) }),
      cursor: [{ t: 0, x: 1300, y: 720 }, { t: 1.0, x: 48, y: 484, click: true }, { t: 4.2, x: 900, y: 600 }, { t: 7, x: 1500, y: 500 }],
      caption: 'O menu de Acompanhamento de Coletas mostra toda a produção do seu posto.', captionAt: 1.4, captionY: 940 },
    { t: 'bullets', dur: 9, kicker: 'O QUE O DASHBOARD OFERECE', title: 'Visão gráfica e quantitativa',
      items: ['Filtros disponíveis: por ano, mês, semana ou dia.',
              'Gráfico de linha com o volume total de coletas no período selecionado.',
              'Visão consolidada — exemplo: 250 coletas realizadas em abril.',
              'Identifique picos de demanda e períodos de baixa movimentação.'] },
    { t: 'rule', dur: 8, tone: 'info', label: 'DICA DE USO', title: 'Consulte no início de cada semana',
      items: ['Use o dashboard para planejar a escala de coletores.',
              'Meses com maior volume exigem mais atenção ao estoque de kits e à disponibilidade da equipe.'] },
    { t: 'closing', dur: 6, recap: ['Acesso ao dashboard', 'Filtros por período', 'Planejamento'], next: 'Módulo 05 · Nova Coleta' },
  ],
},
{
  n: '05', title: 'Cadastro de Nova Coleta', dur: '~2min40', audience: 'Recepção e coletores',
  sub: 'Passo a passo completo — a etapa mais importante do processo.',
  topics: ['Informações gerais', 'Finalidade do exame', 'Dados do doador', 'Substância e medicamento', 'Material coletado', 'Testemunha'],
  beats: [
    { t: 'intro', dur: 7 },
    { t: 'quote', dur: 5, text: 'Cada informação incorreta pode causar atraso, recoleta ou invalidação do exame.',
      sub: 'Siga rigorosamente cada passo.' },
    { t: 'lesson', dur: 3.2, n: '01', title: 'Informações gerais da coleta', sub: 'A primeira tela do assistente de cadastro.' },
    { t: 'bullets', dur: 10, kicker: 'INFORMAÇÕES GERAIS', title: 'Confira antes de avançar',
      items: ['Laboratório: preenchido automaticamente com os dados do seu posto.',
              'Coletor: preenchido via login. Se for login de administrador, selecionar o coletor manualmente.',
              { t: 'Data e hora da coleta: SEMPRE verifique se estão corretos antes de avançar.', strong: true },
              'Responsável pelo atendimento: quem está realizando o cadastro no sistema.',
              'Voucher: perguntar ao doador se possui vale-exame.'] },
    { t: 'lesson', dur: 3.2, n: '02', title: 'Finalidade do exame', sub: 'Selecione conforme o objetivo do doador.' },
    { t: 'screen', dur: 13, screen: 'finalidade',
      props: (lt) => ({ resp: kitTyped('Patricia', lt, 1.4, 9),
                        typing: lt > 1.4 && lt < 4.2,
                        selected: lt > 7.4 ? 'CNH' : null }),
      cursor: [{ t: 0, x: 1500, y: 400 }, { t: 1.1, x: 1200, y: 421, click: true },
               { t: 5.0, x: 400, y: 560 }, { t: 7.4, x: 262, y: 679, click: true }, { t: 10.5, x: 262, y: 679 }],
      caption: 'Preencha o responsável pelo atendimento e escolha a finalidade correta.', captionAt: 1.6, captionY: 880, captionX: 1080, captionW: 720 },
    { t: 'cards', dur: 12, kicker: 'AS CINCO FINALIDADES', title: 'Escolha conforme o objetivo do doador',
      cards: [
        { tag: '01', title: 'CNH', sub: 'Categorias C, D ou E e primeira habilitação A e B.',
          list: ['Periódico, renovação', 'Mudança de categoria', 'Primeira habilitação'] },
        { tag: '02', title: 'CLT', sub: 'Motorista registrado em empresa. Quem paga é o empregador.',
          list: ['Admissão, demissão, periódico', 'Retorno ao trabalho', 'Preencher CNPJ, nome e telefone'] },
        { tag: '03', title: 'CLT + CNH', sub: 'Combinação das duas, sem custo adicional.',
          list: ['Não pode ser faturado pelo lab nem pela empresa', 'NF em nome do doador'] },
        { tag: '04 · 05', title: 'Outros e Concurso', sub: 'Investigação pessoal, ação judicial, menor de idade, RBAC 120.',
          list: ['Escopo 50+: R$ 89,90 · 5 dias úteis', 'Concurso: atenção máxima (Módulo 10)'] },
      ] },
    { t: 'lesson', dur: 3.2, n: '03', title: 'Dados do doador', sub: 'Digite o CPF e confira tudo.' },
    { t: 'rule', dur: 10, tone: 'crit', label: 'ATENÇÃO MÁXIMA', title: 'Dados errados = atraso no exame',
      items: ['CPF: confira dígito por dígito.',
              'Data de nascimento: um único dígito errado pode invalidar o exame — siga o que está na CNH.',
              'Nome completo: sem abreviações, exatamente como no documento.',
              'Telefone e e-mail: SEMPRE do doador — nunca do posto.'] },
    { t: 'lesson', dur: 3.2, n: '04', title: 'Uso de substância ou medicamento', sub: 'Pergunta obrigatória ao doador.' },
    { t: 'bullets', dur: 10, dark: true, kicker: 'SE A RESPOSTA FOR SIM', title: 'Qualquer medicamento exige receita',
      lead: 'Pressão, antibiótico, vitaminas — qualquer medicamento informado deve ter a receita.',
      items: [{ t: 'ANEXADA NO SISTEMA imediatamente — não enviar apenas fisicamente com a amostra.', strong: true },
              'Preencher: substância, período de utilização e frequência de uso.',
              'O médico revisor da Synvia precisará do documento no sistema para validar o laudo.'] },
    { t: 'lesson', dur: 3.2, n: '05', title: 'Material coletado', sub: 'Selecione a matriz e registre o material.' },
    { t: 'cards', dur: 12, kicker: 'REGRAS OBRIGATÓRIAS', title: 'Cabelo e pelo têm regras diferentes',
      cards: [
        { tag: 'MATRIZ A', title: 'Cabelo', hi: true,
          list: ['Retirar de local com menor impacto estético visível.',
                 'Espessura mínima: equivalente a 1 lápis.',
                 'Comprimento mínimo: 4 cm (janela de 90 dias).',
                 'Janela de até 180 dias: coletar mais de 7 cm.'] },
        { tag: 'MATRIZ B', title: 'Pelo',
          list: ['Permitidos: tórax, braço, perna, axila e púbis.',
                 'Tórax, perna e braço PODEM ser misturados — mistura homogênea, uma bola de algodão para cada amostra (A e B).',
                 'Púbis e axila NÃO podem ser misturados em nenhuma situação.',
                 'Janela de detecção: até 180 dias.'] },
      ] },
    { t: 'rule', dur: 8, tone: 'warn', label: 'NÚMERO DA COLETA — CRÍTICO', title: 'Sistema = FCC = etiquetas dos envelopes',
      items: ['O número inserido no sistema deve ser IDÊNTICO ao da FCC e ao das etiquetas dos envelopes.',
              'Qualquer divergência causa atraso no exame e pode gerar recoleta.',
              'Registre também cor do cabelo/pelo e se houve procedimento estético (luzes, progressiva) — sem interferência no resultado.'] },
    { t: 'steps', dur: 10, kicker: 'TESTEMUNHA', title: 'Cadastro obrigatório em toda coleta',
      steps: [{ t: 'Clique em "Coleta com Testemunha"' },
              { t: 'Pesquise na lupa se já está cadastrada' },
              { t: 'Se não estiver, cadastre com RG, CPF e dados completos' },
              { t: 'Confirme a presença física durante TODA a coleta', note: 'Vínculo empregatício obrigatório.' }] },
    { t: 'quote', dur: 5, text: 'O nosso cliente é o doador final.',
      sub: 'Cada erro no cadastro impacta diretamente a vida de uma pessoa. Quanto mais correta a primeira coleta, melhor para todos.' },
    { t: 'closing', dur: 6.5, recap: ['Informações gerais', 'Finalidade', 'Dados do doador', 'Medicamento', 'Material', 'Testemunha'], next: 'Módulo 06 · Receituário Médico' },
  ],
},
{
  n: '06', title: 'Receituário Médico', dur: '~1min', audience: 'Recepção e coletores',
  sub: 'Medicamentos declarados — como agir corretamente.',
  topics: ['Quando exigir a receita', 'O que preencher', 'Passo a passo do anexo'],
  beats: [
    { t: 'intro', dur: 6.5 },
    { t: 'bullets', dur: 10, kicker: 'MANEJO CORRETO', title: 'Todo medicamento precisa ser documentado',
      lead: 'Qualquer medicamento — de uso contínuo ou recente — deve ser informado e documentado.',
      items: ['O doador apresenta a receita: ANEXAR imediatamente no sistema.',
              'Preencher obrigatoriamente: nome da substância, período de uso e frequência.',
              'O médico revisor da Synvia analisa o receituário para validar o laudo corretamente.'] },
    { t: 'rule', dur: 9, tone: 'stop', title: 'Receita só física, sem registro no sistema',
      items: ['Se a receita chegar junto com a amostra mas não estiver no sistema, não conseguimos fazer o vínculo.',
              'Isso compromete a análise e pode invalidar o laudo.',
              'Sem o anexo digital no sistema, não há como prosseguir com segurança.'] },
    { t: 'steps', dur: 12, kicker: 'PASSO A PASSO DO RECEITUÁRIO', title: 'Seis passos, sempre nesta ordem',
      steps: ['Perguntar ao doador: faz uso de algum medicamento ou substância?',
              'Se SIM: solicitar a receita médica.',
              'Fotografar ou digitalizar a receita.',
              'Anexar no sistema via upload.',
              'Preencher: substância, período de uso, frequência.',
              'Confirmar o anexo antes de finalizar o cadastro.'] },
    { t: 'closing', dur: 6, recap: ['Quando exigir', 'O que preencher', 'Anexo no sistema'], next: 'Módulo 07 · Formas de Pagamento' },
  ],
},
{
  n: '07', title: 'Formas de Pagamento', dur: '~1min20', audience: 'Recepção e financeiro',
  sub: 'Cartão, boleto, PIX, dinheiro e faturamento — cada um com sua regra.',
  topics: ['Tela de pagamento', 'As cinco modalidades', 'Atenções por modalidade'],
  beats: [
    { t: 'intro', dur: 6.5 },
    { t: 'screen', dur: 11, screen: 'pagamento',
      props: (lt) => ({ selected: lt > 5.6 ? 'Pix' : null }),
      cursor: [{ t: 0, x: 1400, y: 780 }, { t: 1.4, x: 262, y: 645 }, { t: 3.2, x: 442, y: 645 },
               { t: 5.6, x: 802, y: 645, click: true }, { t: 8.5, x: 802, y: 645 }],
      caption: 'Após preencher os dados do cadastro, selecione a forma de pagamento.', captionAt: 1.2, captionY: 930 },
    { t: 'table', dur: 17, kicker: 'MODALIDADES', title: 'Como funciona cada forma de pagamento',
      cols: ['FORMA', 'COMO FUNCIONA', 'ATENÇÃO'], grid: '1fr 1.7fr 1.5fr',
      rows: [
        ['Cartão', 'Processado no momento da coleta. O sistema envia link por e-mail ou SMS.', 'Confirmar que o doador recebeu o link antes de finalizar.'],
        ['Boleto', 'Gerado pelo sistema. Vencimento em 3 dias úteis. Confirmação automática.', 'Após o vencimento não pode ser reemitido pelo posto — acionar a Synvia.'],
        ['PIX', 'Chave gerada na hora. Pagamento instantâneo e confirmação automática.', 'Aguardar a confirmação antes de liberar a coleta.'],
        ['Dinheiro', 'O posto recebe o valor total. Parte é repassada semanalmente via boleto.', 'Registrar corretamente no sistema. Ver Módulo 15.'],
        ['Faturamento', 'A empresa parceira paga diretamente ao PCL. Fechamento mensal.', 'Quem emite a NF e recebe é o PCL, e repassa à Synvia.'],
      ] },
    { t: 'closing', dur: 6, recap: ['Cartão', 'Boleto', 'PIX', 'Dinheiro', 'Faturamento'], next: 'Módulo 08 · Voucher CNH' },
  ],
},
{
  n: '08', title: 'Voucher CNH', dur: '~1min', audience: 'Recepção',
  sub: 'O vale-exame que cobre o custo da coleta — como validar e utilizar.',
  topics: ['O que é o voucher', 'Como validar', 'Quando perguntar'],
  beats: [
    { t: 'intro', dur: 6.5 },
    { t: 'bullets', dur: 9, kicker: 'O QUE É', title: 'Um vale-exame para cobrir o custo da coleta',
      lead: 'Algumas empresas ou órgãos disponibilizam o voucher ao doador. O processo de utilização deve ser feito no momento do cadastro.',
      items: ['Perguntar ao doador se possui voucher antes de iniciar o cadastro.',
              'No sistema, selecionar a opção "Possui Voucher" na tela de pagamento.'] },
    { t: 'steps', dur: 10, kicker: 'VALIDAÇÃO', title: 'Como validar e utilizar',
      steps: ['Informar o código do voucher no sistema',
              'Aguardar a validação automática',
              { t: 'Voucher válido', note: 'O valor é abatido automaticamente ou zerado conforme o tipo.' },
              { t: 'Voucher inválido ou expirado', note: 'Acionar o atendimento Synvia para regularização.' }] },
    { t: 'rule', dur: 9, tone: 'info', label: 'DICA IMPORTANTE', title: 'Pergunte ANTES de selecionar a forma de pagamento',
      items: ['Vouchers não têm validade; a preferência do cadastro é pelo código do voucher.',
              'Não é possível incluir o voucher após a finalização do cadastro.'] },
    { t: 'closing', dur: 6, recap: ['O que é o voucher', 'Validação', 'Pergunte antes'], next: 'Módulo 09 · Finalidades' },
  ],
},
{
  n: '09', title: 'Finalidades: CNH, CLT, Outros e Menor', dur: '~2min', audience: 'Recepção e coletores',
  sub: 'Especificidades, prazos e documentos por finalidade.',
  topics: ['Finalidade CNH', 'Finalidade CLT', 'CLT + CNH', 'Outros', 'Menor de idade'],
  beats: [
    { t: 'intro', dur: 7 },
    { t: 'bullets', dur: 10, kicker: 'FINALIDADE CNH', title: 'Prazos de inclusão no RENACH',
      lead: 'Exame para motoristas com CNH categorias C, D ou E e primeira habilitação A e B.',
      items: ['A Synvia tem 24h para incluir a coleta prévia no RENACH, a partir da data da coleta.',
              'E 30 dias para inserir o laudo final no RENACH.',
              'A inclusão é feita de forma automática no SENATRAN; as informações ficam disponíveis no laudo finalizado.'] },
    { t: 'bullets', dur: 12, dark: true, kicker: 'FINALIDADE CLT', title: 'Quem paga é sempre o empregador',
      items: ['Responsável pelo pagamento: SEMPRE o empregador — nunca o empregado.',
              'A nota fiscal PODE ser emitida em nome da empresa.',
              'Cadastrar nome completo e CNPJ da empresa. Se for parceira, cadastrá-la na aba Empresa.',
              'Sem inclusão automática em órgão — a empresa faz a inclusão no eSocial (Portaria MTE 612).',
              { t: 'Validade do laudo: 60 dias a partir da data da coleta.', strong: true }] },
    { t: 'cards', dur: 9, kicker: 'FINALIDADE DUPLA', title: 'CLT + CNH',
      cards: [
        { tag: 'MESMO VALOR', title: 'Sem custo adicional', hi: true,
          list: ['É feita a inclusão no RENACH.', 'O laudo sai com o nome da empresa solicitante.'] },
        { tag: 'FATURAMENTO', title: 'Não pode ser faturado',
          list: ['Nem pelo laboratório, nem pela empresa.', 'Como há CNH, a NF deve ser emitida em nome do doador.'] },
      ] },
    { t: 'bullets', dur: 11, kicker: 'FINALIDADE OUTROS', title: 'Investigação pessoal, judicial e RBAC 120',
      lead: 'Para casos sem órgão regulador específico.',
      items: ['Preencher a ficha de anamnese via sistema — obrigatório.',
              'Verificar a janela de detecção necessária e conferir o comprimento do cabelo.',
              'A ficha deve ser assinada pelo responsável técnico do laboratório E pelo doador.',
              'A via física da ficha vai junto com a amostra no envelope.',
              'Opção do escopo 50+ disponível para casos que exigem análise ampliada.'] },
    { t: 'lesson', dur: 3.5, n: '05', title: 'Menor de idade', sub: 'Toda a documentação é assinada pelo responsável legal.' },
    { t: 'bullets', dur: 9, kicker: 'O QUE O RESPONSÁVEL LEGAL ASSINA', title: 'O menor apenas cede o material',
      items: ['Ficha de anamnese', 'Ficha específica de menor de idade', 'FCC — Ficha de Cadeia de Custódia',
              { t: 'O menor não assina nada.', strong: true }] },
    { t: 'cards', dur: 10, kicker: 'RESPONSÁVEL LEGAL', title: 'Quem pode e quem não pode',
      cards: [
        { tag: 'PODE', title: 'Pai ou mãe', hi: true,
          list: ['Reconhecido(a) no documento de identidade do menor.',
                 'Pessoa com guarda judicial formalizada: alvará, documento de abrigo, tutela legal.'] },
        { tag: 'NÃO PODE', title: 'Avós, tios, padrastos',
          list: ['Madrastas, padrinhos — mesmo que tenham criado a criança.',
                 'Qualquer pessoa sem documentação legal de guarda.'] },
      ] },
    { t: 'rule', dur: 9, tone: 'crit', title: 'Sem documento legal, não é aceito',
      items: ['Mesmo que a pessoa diga "eu o criei desde bebê" — sem documento legal, não é aceito.',
              'Em caso de ação judicial, a Synvia E o posto serão penalizados pela irregularidade.',
              'Não abra exceções. Seja claro e firme desde o início.'] },
    { t: 'closing', dur: 6.5, recap: ['CNH', 'CLT', 'CLT + CNH', 'Outros', 'Menor de idade'], next: 'Módulo 10 · Concurso Público' },
  ],
},
{
  n: '10', title: 'Concurso Público', dur: '~1min50', audience: 'Todos',
  sub: 'Atenção máxima — erro aqui tem consequência milionária.',
  topics: ['Antes de aceitar', 'Checklist no ato da coleta', 'Laudo lacrado', 'Escopo de análise'],
  beats: [
    { t: 'intro', dur: 7 },
    { t: 'quote', dur: 5.5, text: 'Um erro pode gerar processo por "perda de chance".',
      sub: 'Com indenizações milionárias para o candidato, o posto e a Synvia.' },
    { t: 'steps', dur: 11, kicker: 'ANTES DE ACEITAR O CONCURSO', title: 'Quatro passos inegociáveis',
      steps: [{ t: 'Receber o edital do candidato', note: 'Com a data de apresentação à banca examinadora.' },
              { t: 'Enviar o edital à Synvia para análise', note: 'Resposta em até 24 horas.' },
              { t: 'A Synvia verifica tudo', note: 'Substâncias, órgão emissor, formato do laudo, prazo viável.' },
              { t: 'Só agendar após aprovação formal', note: 'Nunca antes.' }] },
    { t: 'rule', dur: 9, tone: 'warn', label: 'POR QUE ENVIAR O EDITAL ANTES?', title: 'Nem todo edital é viável',
      items: ['Editais diferentes podem solicitar substâncias que a Synvia não analisa.',
              'O prazo pode ser inviável dependendo da distância logística.',
              'O formato do laudo pode não ser compatível com o exigido pelo órgão.',
              'Uma coleta feita sem aprovação da Synvia pode ser completamente inválida para o concurso.'] },
    { t: 'bullets', dur: 12, dark: true, kicker: 'NO ATO DA COLETA', title: 'Checklist obrigatório',
      items: ['Buscar no sistema o nome EXATO do edital aprovado — pode haver diferença entre concursos parecidos.',
              'Imprimir e assinar o Termo de Ciência via sistema — obrigatório, sem exceção.',
              'O candidato lê, compreende e assina: aceita prazos, meios e resultado da Synvia.',
              { t: 'Sem Termo de Ciência assinado, NÃO é possível prosseguir com a análise.', strong: true },
              'Verificar quantidade de material — amostra insuficiente inviabiliza toda a análise.',
              'Conferir FCC, numeração, etiquetas e envelopes.'] },
    { t: 'cards', dur: 10, kicker: 'LAUDO E ESCOPO', title: 'Duas decisões que dependem do edital',
      cards: [
        { tag: 'SE O EDITAL EXIGIR', title: 'Laudo lacrado',
          list: ['Custo adicional de R$ 45,00 (frete de envio ao posto).',
                 'O laudo é enviado AO POSTO — não diretamente ao candidato.',
                 'O posto faz a entrega ao candidato.'] },
        { tag: 'ESCOPO DE ANÁLISE', title: 'Padrão ou 50+', hi: true,
          list: ['Padrão: substâncias regulamentadas pelo SENATRAN/DETRAN.',
                 'Escopo 50+: mais de 50 substâncias (PCP, benzodiazepínicos e outras) — R$ 89,90.',
                 'Consulte sempre o edital para identificar qual escopo é exigido.'] },
      ] },
    { t: 'rule', dur: 10, tone: 'crit', label: 'REGRA DE OURO', title: 'É a chance da vida do candidato',
      items: ['Erros aqui não têm conserto.',
              'Conferir TUDO: Termo de Ciência, FCC, numeração, envelopes, quantidade de material.',
              'Ser transparente sobre prazos — especialmente se houver risco de confirmatório.',
              'NUNCA garantir prazo sem consultar a Synvia antecipadamente.'] },
    { t: 'closing', dur: 6.5, recap: ['Edital antes', 'Termo de Ciência', 'Laudo lacrado', 'Escopo'], next: 'Módulo 11 · Logística' },
  ],
},
{
  n: '15', title: 'Módulo Financeiro', dur: '~1min40', audience: 'Responsável e financeiro',
  sub: 'Repasse semanal, repasse mensal e regras de inadimplência.',
  topics: ['Repasse semanal', 'Repasse mensal', 'Faturamento laboratório', 'Bloqueios'],
  beats: [
    { t: 'intro', dur: 6.5 },
    { t: 'cards', dur: 10, kicker: 'DOIS CICLOS', title: 'Como o financeiro funciona',
      cards: [
        { tag: 'SEMANAL', title: 'Dinheiro', hi: true, sub: 'Quando o doador paga em dinheiro no balcão.',
          list: ['Boleto gerado semanalmente, vencimento toda terça-feira.', 'Reúne todas as amostras pagas em dinheiro na semana.'] },
        { tag: 'MENSAL', title: 'Cartão, boleto, PIX e faturamento', sub: 'Fechamento no mês seguinte.',
          list: ['Relatório disponível até o 2º dia útil.', 'Repasse em 5 dias úteis após a nota fiscal.'] },
      ] },
    { t: 'bullets', dur: 9, kicker: 'REPASSE SEMANAL', title: 'Você recebe o valor total e repassa a parte da Synvia',
      items: ['Você repassa apenas o valor do exame — o restante é sua remuneração.',
              'No sistema: acesso ao boleto e relatório completo das amostras do período.'] },
    { t: 'steps', dur: 11, kicker: 'REPASSE MENSAL', title: 'Passo a passo do fechamento',
      steps: [{ t: 'Até o 2º dia útil do mês seguinte', note: 'O relatório está disponível no sistema.' },
              { t: 'Você confere', note: 'Todas as amostras, modalidades de pagamento e valores.' },
              { t: 'Emitir nota fiscal para a Synvia', note: 'E enviar via sistema.' },
              { t: 'A Synvia repassa em 5 dias úteis', note: 'Contados a partir do envio da nota.' }] },
    { t: 'rule', dur: 9, tone: 'info', label: 'QUANTO ANTES, MELHOR', title: 'Os 5 dias contam do envio da nota',
      items: ['Confira o relatório e envie a nota fiscal o mais rápido possível após o dia 2.',
              'O repasse só acontece depois que a nota é recebida pela Synvia e o PCL estiver adimplente.'] },
    { t: 'bullets', dur: 9, dark: true, kicker: 'FATURAMENTO LABORATÓRIO', title: 'Quando há empresa parceira',
      items: ['O posto negocia diretamente com a empresa o valor do exame.',
              'O posto emite nota fiscal para a empresa e repassa apenas o valor do exame à Synvia.',
              'Fechamento mensal — a Synvia NÃO emite nota nesta modalidade para o posto.',
              'Para habilitar esta função, solicitar liberação ao atendimento Synvia.'] },
    { t: 'rule', dur: 10, tone: 'warn', label: 'PAGAMENTOS EM DIA EVITAM BLOQUEIOS', title: 'O que acontece com boletos em aberto',
      items: ['Boletos semanais em aberto no fechamento mensal: repasse retido até regularização.',
              '2 boletos semanais consecutivos sem pagamento: a modalidade DINHEIRO é BLOQUEADA.',
              'Com o bloqueio, apenas o PIX fica disponível para novos cadastros.'] },
    { t: 'closing', dur: 6.5, recap: ['Repasse semanal', 'Repasse mensal', 'Faturamento', 'Bloqueios'], next: '' },
  ],
},
{
  n: '11', title: 'Logística — Criação de Lote', dur: '~1min40', audience: 'Recepção e coletores',
  sub: 'Sem o lote criado, a transportadora não passa.',
  topics: ['Criar o lote', 'Sem BAG disponível', 'Por que é obrigatório', 'Como funciona a retirada'],
  beats: [
    { t: 'intro', dur: 6.5 },
    { t: 'screen', dur: 10, screen: 'pacotes',
      props: (lt) => ({ highlightRow: lt > 5 ? 2 : -1 }),
      cursor: [{ t: 0, x: 1300, y: 760 }, { t: 1.0, x: 48, y: 424, click: true },
               { t: 3.4, x: 1790, y: 45, click: true }, { t: 6.5, x: 900, y: 600 }],
      caption: 'Ao final de cada dia é obrigatório criar um lote na aba Enviar Amostras.', captionAt: 1.4, captionY: 930 },
    { t: 'steps', dur: 12, kicker: 'CRIAÇÃO DO LOTE', title: 'Seis passos para enviar as amostras',
      steps: ['Acessar a aba "Enviar Amostras"', 'Clicar em "Novo Pacote (BAG)"', 'Selecionar "Incluir Pendente"',
              'Selecionar as amostras que serão inseridas na BAG do dia', 'Clicar em "Incluir"',
              'Inserir o número da BAG e clicar em "Concluir"'] },
    { t: 'rule', dur: 8, tone: 'info', label: 'SEM BAG DISPONÍVEL?', title: 'Use envelope reforçado',
      items: ['No momento de inserir a BAG, informar "sem BAG"; o sistema irá gerar um número.',
              'Esse número também deve ser informado no envelope.'] },
    { t: 'bullets', dur: 10, dark: true, kicker: 'POR QUE O LOTE É OBRIGATÓRIO', title: 'É uma exigência normativa',
      items: ['As normas e resoluções que a Synvia segue exigem rastreabilidade total das amostras.',
              'O lote garante saber exatamente quais amostras estão em trânsito, com qual transportadora e para qual destino.',
              { t: 'Sem rastreabilidade, qualquer amostra pode ser questionada em termos legais.', strong: true }] },
    { t: 'bullets', dur: 10, kicker: 'COMO FUNCIONA A RETIRADA', title: 'Agendamento e horários',
      items: ['Coletas realizadas até 17h: a logística programa automaticamente para o próximo dia útil.',
              'Retiradas de segunda a sexta, dentro do horário de funcionamento do posto.',
              'Informe à Synvia se o posto fecha para almoço — assim os motoristas são alocados corretamente.',
              'Dependendo da região: transportadora terrestre ou aérea — a Synvia gerencia tudo.'] },
    { t: 'rule', dur: 8, tone: 'warn', label: 'PROBLEMAS COM A LOGÍSTICA?', title: 'Fale sempre com a Synvia',
      items: ['Qualquer intercorrência (atraso, não retirada, dúvida): contate o atendimento Synvia.',
              'Não entre em contato diretamente com a transportadora — a Synvia faz a intermediação.',
              'Registre o problema pelo canal oficial para que tudo seja documentado.'] },
    { t: 'closing', dur: 6.5, recap: ['Criar o lote', 'Sem BAG', 'Rastreabilidade', 'Retirada'], next: 'Módulo 12 · Recoleta' },
  ],
},
{
  n: '12', title: 'Recoleta', dur: '~1min40', audience: 'Todos',
  sub: 'Quando acontece, como resolver e — principalmente — como evitar.',
  topics: ['Quando acontece', 'Como o posto é notificado', 'Como fazer no sistema', 'Como prevenir'],
  beats: [
    { t: 'intro', dur: 6.5 },
    { t: 'quote', dur: 5, text: 'A melhor recoleta é aquela que nunca precisa acontecer.',
      sub: 'É sempre o pior cenário para todos os envolvidos.' },
    { t: 'bullets', dur: 11, kicker: 'QUANDO ACONTECE', title: 'Cinco causas de recoleta',
      items: ['Erro na FCC — ficha de cadeia de custódia com dados incorretos ou ilegíveis.',
              'Divergência entre o número cadastrado no sistema e o número nos envelopes/FCC.',
              'Material insuficiente — quantidade abaixo do mínimo necessário.',
              'Dados do doador incorretos — CPF, data de nascimento ou nome errados.',
              'Receituário médico não anexado no sistema quando deveria.'] },
    { t: 'bullets', dur: 8, dark: true, kicker: 'COMO O POSTO É NOTIFICADO', title: 'Verifique o e-mail diariamente',
      items: ['A Synvia envia um e-mail informando qual amostra, qual o erro e o que precisa ser corrigido.',
              { t: 'Atraso na leitura = atraso no exame.', strong: true }] },
    { t: 'steps', dur: 11, kicker: 'NO SISTEMA', title: 'Como fazer a recoleta',
      steps: ['Acesse a aba Recoleta no menu principal', 'Insira o número da amostra com erro',
              { t: 'O sistema exibe os dados', note: 'E pergunta se deseja coletar novamente.' },
              { t: 'Confirme', note: 'Um novo kit é gerado com nova numeração. Sem custo para o doador nem para o posto.' }] },
    { t: 'rule', dur: 10, tone: 'crit', label: 'O IMPACTO DA RECOLETA', title: 'Por que evitar a todo custo',
      items: ['Ninguém quer tirar pelo ou cortar o cabelo de novo.',
              'O doador fica insatisfeito — independentemente de quem causou o erro.',
              'O exame atrasa — afeta CNH, emprego, concurso público, processo judicial.',
              'Posto, Synvia e doador perdem tempo, dinheiro e confiança.'] },
    { t: 'bullets', dur: 11, kicker: 'COMO PREVENIR', title: 'Cinco conferências antes de finalizar',
      items: ['Conferir todos os dados do doador antes de finalizar o cadastro.',
              'Número no sistema = número na FCC = número nas etiquetas dos envelopes.',
              'Receituário médico sempre anexado no sistema — nunca só físico.',
              'Material coletado em quantidade suficiente e armazenado corretamente.',
              'FCC preenchida com letra legível, sem rasuras, com todos os campos.'] },
    { t: 'closing', dur: 7, title: 'Você faz parte desta cadeia.',
      recap: ['Causas', 'Notificação', 'Processo', 'Prevenção'], next: 'Módulo 13 · Contraprova' },
  ],
},
{
  n: '14', title: 'Pontos Importantes e LGPD', dur: '~1min30', audience: 'Todos',
  sub: 'Boas práticas de alto padrão e proteção de dados do doador.',
  topics: ['Erro comum na CNH', 'Ordem correta do processo', 'LGPD', 'Normativos'],
  beats: [
    { t: 'intro', dur: 6.5 },
    { t: 'rule', dur: 10, tone: 'warn', label: 'ERRO MUITO COMUM — CNH', title: 'Toxicológico feito antes de iniciar o processo',
      items: ['O exame não aparece no BCA/SENATRAN.',
              'Não é possível incluir no RENACH.',
              'Gera retrabalho e insatisfação.',
              'SEMPRE pergunte: "Você já iniciou o processo da CNH?" e "Já fez biometria/exame médico?"'] },
    { t: 'steps', dur: 9, kicker: 'ORDEM CORRETA DO PROCESSO CNH', title: 'O toxicológico vem por último',
      steps: ['Início do processo CNH', 'Pagamento de taxas', 'Exames iniciais', 'Depois o toxicológico'] },
    { t: 'bullets', dur: 13, dark: true, kicker: 'LGPD — PROTEÇÃO DE DADOS', title: 'O laudo contém dados extremamente sensíveis',
      lead: 'Uso de substâncias e informações médicas do doador.',
      items: [{ t: 'PROIBIDO enviar laudo por WhatsApp ou entregar a pais, filhos, cônjuge, empresa ou terceiros.', strong: true },
              'PERMITIDO: enviar apenas para o DOADOR, via e-mail do titular ou pelo sistema.',
              'CLT — o empregador pode acessar apenas o laudo médico (positivo/negativo).',
              'O empregador NÃO pode acessar substâncias detectadas, quantidades ou laudo toxicológico completo.',
              'O PCL consegue visualizar laudo médico e laudo toxicológico diretamente no sistema.'] },
    { t: 'bullets', dur: 8, kicker: 'ATUALIZAÇÕES E NORMATIVOS', title: 'O que rege o exame toxicológico',
      items: ['Nova exigência: para primeira habilitação A e B.',
              'Resolução CONTRAN 923/2022 · NIT DICLA 069 · Portaria MTE 612/2024.'] },
    { t: 'rule', dur: 10, tone: 'ok', label: 'BOAS PRÁTICAS DE ALTO PADRÃO', title: 'Trate cada coleta como crítica',
      items: ['Sempre explique o processo ao doador com clareza.',
              'Nunca diga "é automático" — oriente o acompanhamento ativo.',
              'Revise o cadastro antes de finalizar.',
              'Ela impacta CNH, emprego e concurso.'] },
    { t: 'quote', dur: 6, text: 'Cada coleta bem-feita é um laudo entregue no prazo.',
      sub: 'Cada laudo no prazo é um cliente satisfeito. Cada cliente satisfeito é um posto de coleta de confiança.' },
    { t: 'closing', dur: 7, title: 'Treinamento CTox concluído.',
      recap: ['CNH', 'LGPD', 'Normativos', 'Boas práticas'], next: 'Dúvidas? Chat no CTOX · atendimento@synvia.com' },
  ],
},
];

// ── Timeline builder ───────────────────────────────────────────────────────
function buildTimeline(mod) {
  let t = 0;
  return mod.beats.map((b) => {
    const start = t; t += b.dur;
    return { ...b, start, end: t };
  });
}

const BEAT_RENDERERS = {
  intro: (b, mod) => <BeatModuleIntro mod={mod} />,
  lesson: (b) => <BeatLesson beat={b} />,
  bullets: (b) => <BeatBullets beat={b} />,
  rule: (b) => <BeatRule beat={b} />,
  table: (b) => <BeatTable beat={b} />,
  steps: (b) => <BeatSteps beat={b} />,
  cards: (b) => <BeatCards beat={b} />,
  stats: (b) => <BeatStats beat={b} />,
  quote: (b) => <BeatQuote beat={b} />,
  screen: (b) => <BeatScreen beat={b} />,
  closing: (b, mod) => <BeatClosing mod={mod} beat={b} />,
};

const DARK_BEATS = new Set(['intro', 'lesson', 'steps', 'cards', 'quote', 'closing', 'stats']);

function ModuleTimeline({ mod }) {
  const beats = React.useMemo(() => buildTimeline(mod), [mod]);
  const { time } = useTimeline();
  const active = beats.findIndex((b) => time >= b.start && time < b.end);
  const cur = beats[active] || beats[0];
  const isDark = cur && (DARK_BEATS.has(cur.t) || cur.dark || (cur.t === 'rule' && cur.tone === 'crit'));
  return (
    <React.Fragment>
      {beats.map((b, i) => (
        <Sprite key={i} start={b.start} end={b.end}>
          {BEAT_RENDERERS[b.t](b, mod)}
        </Sprite>
      ))}
      {cur && cur.t !== 'screen' && (
        <ModuleHUD mod={mod} beatIx={Math.max(1, active + 1)} beatCount={beats.length} dark={isDark} />
      )}
    </React.Fragment>
  );
}

const moduleDuration = (mod) => mod.beats.reduce((s, b) => s + b.dur, 0);

Object.assign(window, { MODULES, buildTimeline, ModuleTimeline, moduleDuration, BEAT_RENDERERS });
