const SOC2_TRUST_PRINCIPLES = [
    {
        id: 'CC1.1',
        nome: 'Controle de Acesso Lógico',
        descricao: 'Restringir acesso a sistemas e dados',
        categoria: 'seguranca',
        padraoCorrespondente: ['controle-acesso', 'access-control', 'autenticacao', 'CORS', 'cors'],
    },
    {
        id: 'CC2.1',
        nome: 'Prevenção contra Ameaças Externas',
        descricao: 'Proteger contra ameaças externas como malware',
        categoria: 'seguranca',
        padraoCorrespondente: ['vulnerabilidade', 'injection', 'XSS', 'SQL_INJECTION', 'COMMAND_INJECTION'],
    },
    {
        id: 'CC3.1',
        nome: 'Monitoramento de Disponibilidade',
        descricao: 'Monitorar e garantir disponibilidade do sistema',
        categoria: 'disponibilidade',
        padraoCorrespondente: ['monitoramento', 'health-check', 'timeout', 'resource-exhaustion'],
    },
    {
        id: 'CC3.2',
        nome: 'Tratamento de Erros',
        descricao: 'Implementar tratamento adequado de erros e exceções',
        categoria: 'disponibilidade',
        padraoCorrespondente: ['unhandled-async', 'erro-nao-tratado', 'uncaught-exception'],
    },
    {
        id: 'CC4.1',
        nome: 'Integridade de Dados',
        descricao: 'Proteger integridade dos dados armazenados e transmitidos',
        categoria: 'integridade',
        padraoCorrespondente: ['integracao-dados', 'data-integrity', 'hash', 'checksum', 'criptografia'],
    },
    {
        id: 'CC4.2',
        nome: 'Validação de Entrada',
        descricao: 'Validar entrada de dados para prevenir corrupção',
        categoria: 'integridade',
        padraoCorrespondente: ['validacao-entrada', 'input-validation', 'tipo-inseguro', 'SANITIZE'],
    },
    {
        id: 'CC5.1',
        nome: 'Criptografia de Dados',
        descricao: 'Criptografar dados sensíveis em repouso e em trânsito',
        categoria: 'confidencialidade',
        padraoCorrespondente: ['criptografia', 'encryption', 'weak-crypto', 'MD5', 'SHA1', 'dados-sensiveis'],
    },
    {
        id: 'CC5.2',
        nome: 'Proteção de Credenciais',
        descricao: 'Proteger credenciais e secrets',
        categoria: 'confidencialidade',
        padraoCorrespondente: ['PASSWORD_HARDCODED', 'API_KEY_HARDCODED', 'TOKEN_EXPOSTO', 'segredo-hardcoded'],
    },
    {
        id: 'CC6.1',
        nome: 'Mineração de Dados Pessoais',
        descricao: 'Identificar e proteger dados pessoais',
        categoria: 'privacidade',
        padraoCorrespondente: ['dados-pessoais', 'privacy', 'LGPD', 'GDPR', 'dados-sensiveis', 'PII'],
    },
    {
        id: 'CC6.2',
        nome: 'Logs de Auditoria',
        descricao: 'Manter logs detalhados de acesso e alterações',
        categoria: 'privacidade',
        padraoCorrespondente: ['logging', 'log-sensitivo', 'auditoria', 'rastreabilidade'],
    },
    {
        id: 'A1.1',
        nome: 'Senhas e Autenticação',
        descricao: 'Políticas de senhas e autenticação multifator',
        categoria: 'seguranca',
        padraoCorrespondente: ['senha-fraca', 'PASSWORD_HARDCODED', 'autenticacao-forte'],
    },
    {
        id: 'A1.2',
        nome: 'Dependências Seguras',
        descricao: 'Usar dependências atualizadas e seguras',
        categoria: 'seguranca',
        padraoCorrespondente: ['dependencia-vulneravel', 'dependencia-externa', 'DEPRECATED_API'],
    },
];
function mapearOcorrenciaParaPrincipio(ocorrencia) {
    const tipo = (ocorrencia.tipo || '').toLowerCase();
    const mensagem = (ocorrencia.mensagem || '').toLowerCase();
    const textoCompleto = `${tipo} ${mensagem}`;
    return SOC2_TRUST_PRINCIPLES
        .filter(p => p.padraoCorrespondente.some(padrao => textoCompleto.includes(padrao.toLowerCase())))
        .map(p => p.id);
}
export const gerarRelatorioSOC2 = (ocorrencias, metadados) => {
    const controlesEncontrados = new Map();
    for (const ocorrencia of ocorrencias) {
        const ids = mapearOcorrenciaParaPrincipio(ocorrencia);
        for (const id of ids) {
            if (!controlesEncontrados.has(id)) {
                controlesEncontrados.set(id, []);
            }
            controlesEncontrados.get(id)?.push(ocorrencia);
        }
    }
    const secoes = new Map();
    for (const principio of SOC2_TRUST_PRINCIPLES) {
        const evidencias = controlesEncontrados.get(principio.id)?.map(o => `${o.relPath}:${o.linha ?? ''} - ${o.mensagem}`) ?? [];
        const conformidade = evidencias.length === 0 ? 'conforme' : evidencias.length > 3 ? 'nao-conforme' : 'parcial';
        const risco = conformidade === 'conforme' ? 'baixo' : evidencias.length > 5 ? 'critico' : 'medio';
        if (!secoes.has(principio.categoria)) {
            secoes.set(principio.categoria, []);
        }
        secoes.get(principio.categoria)?.push({
            id: principio.id,
            framework: 'soc2',
            nome: principio.nome,
            descricao: principio.descricao,
            categoria: principio.categoria,
            conformidade,
            risco,
            evidencias,
            recomendacao: evidencias.length > 0 ? `Revisar ${evidencias.length} evidência(s) encontrada(s) no código` : undefined,
        });
    }
    const secoesRelatorio = Array.from(secoes.entries()).map(([nome, controles]) => {
        const conformes = controles.filter(c => c.conformidade === 'conforme').length;
        return {
            id: nome.toLowerCase().replace(/\s+/g, '-'),
            framework: 'soc2',
            nome: nome.charAt(0).toUpperCase() + nome.slice(1),
            descricao: `Princípios de confiança SOC 2 - ${nome}`,
            controles,
            pontuacao: Math.round((conformes / controles.length) * 100),
            totalControles: controles.length,
            controlesConformes: conformes,
        };
    });
    const todosControles = secoesRelatorio.flatMap(s => s.controles);
    const conformes = todosControles.filter(c => c.conformidade === 'conforme').length;
    const parciais = todosControles.filter(c => c.conformidade === 'parcial').length;
    const naoConformes = todosControles.filter(c => c.conformidade === 'nao-conforme').length;
    const pontuacaoGeral = todosControles.length > 0 ? Math.round((conformes / todosControles.length) * 100) : 0;
    const riscosCriticos = todosControles.filter(c => c.risco === 'critico').length;
    const riscosAltos = todosControles.filter(c => c.risco === 'alto').length;
    const recomendacoes = [];
    if (riscosCriticos > 0)
        recomendacoes.push(`Corrigir ${riscosCriticos} risco(s) crítico(s) nos princípios de confiança SOC 2`);
    if (riscosAltos > 0)
        recomendacoes.push(`Tratar ${riscosAltos} risco(s) alto(s) para conformidade SOC 2`);
    if (naoConformes > 0)
        recomendacoes.push(`${naoConformes} controle(s) não conforme(s) - ação corretiva necessária`);
    if (parciais > 0)
        recomendacoes.push(`${parciais} controle(s) parcial - melhoria contínua recomendada`);
    if (conformes === todosControles.length)
        recomendacoes.push('Todos os princípios de confiança SOC 2 estão conformes');
    const relatorio = {
        metadata: {
            framework: 'soc2',
            versaoFramework: 'SOC 2 (AICPA 2023)',
            timestamp: new Date().toISOString(),
            nomeProjeto: metadados.nomeProjeto,
            duracaoAnalise: metadados.duracao,
        },
        resumo: {
            pontuacaoGeral,
            totalControles: todosControles.length,
            controlesConformes: conformes,
            controlesParciais: parciais,
            controlesNaoConformes: naoConformes,
            riscosCriticos,
            riscosAltos,
            conformidadeGeral: pontuacaoGeral >= 80 ? 'conforme' : pontuacaoGeral >= 40 ? 'parcial' : 'nao-conforme',
        },
        secoes: secoesRelatorio,
        recomendacoes,
        riscosIdentificados: todosControles
            .filter(c => c.risco === 'critico' || c.risco === 'alto')
            .map(c => ({
            id: c.id,
            descricao: `${c.nome}: ${c.evidencias.length} evidência(s) de não conformidade`,
            severidade: c.risco,
            acaoRecomendada: c.recomendacao ?? 'Revisar e corrigir',
        })),
    };
    return relatorio;
};
//# sourceMappingURL=soc2-mapping.js.map