const ISO_27001_CONTROLS = [
    {
        id: 'A.5.1.1',
        nome: 'Políticas de Segurança',
        descricao: 'Documentar e revisar políticas de segurança da informação',
        categoria: 'Políticas de Segurança',
        padraoCorrespondente: ['politica-seguranca', 'security-policy', 'ACCESS_CONTROL'],
    },
    {
        id: 'A.6.1.2',
        nome: 'Segregação de Funções',
        descricao: 'Separar responsabilidades para reduzir riscos',
        categoria: 'Organização da Segurança',
        padraoCorrespondente: ['segregacao-funcoes', 'privilegio-minimo'],
    },
    {
        id: 'A.8.2.1',
        nome: 'Classificação da Informação',
        descricao: 'Classificar informações quanto ao nível de sensibilidade',
        categoria: 'Gestão de Ativos',
        padraoCorrespondente: ['classificacao-dados', 'data-classification', 'dados-sensiveis'],
    },
    {
        id: 'A.9.1.2',
        nome: 'Controle de Acesso a Redes',
        descricao: 'Restringir acesso a redes e serviços',
        categoria: 'Controle de Acesso',
        padraoCorrespondente: ['controle-acesso', 'access-control', 'CORS', 'cors', 'autenticacao'],
    },
    {
        id: 'A.9.4.2',
        nome: 'Autenticação Segura',
        descricao: 'Implementar métodos seguros de autenticação',
        categoria: 'Controle de Acesso',
        padraoCorrespondente: ['autenticacao-forte', 'senha-fraca', 'weak-crypto', 'PASSWORD_HARDCODED'],
    },
    {
        id: 'A.10.1.1',
        nome: 'Criptografia',
        descricao: 'Políticas e controles de criptografia',
        categoria: 'Criptografia',
        padraoCorrespondente: ['criptografia', 'encryption', 'weak-crypto', 'MD5', 'SHA1'],
    },
    {
        id: 'A.12.1.2',
        nome: 'Proteção contra Malware',
        descricao: 'Proteger contra código malicioso',
        categoria: 'Segurança Operacional',
        padraoCorrespondente: ['vulnerabilidade', 'injection', 'XSS', 'SQL_INJECTION', 'COMMAND_INJECTION'],
    },
    {
        id: 'A.12.6.1',
        nome: 'Gestão de Vulnerabilidades',
        descricao: 'Identificar e tratar vulnerabilidades técnicas',
        categoria: 'Segurança Operacional',
        padraoCorrespondente: ['vulnerabilidade', 'dependencia-vulneravel', 'DEPRECATED_API'],
    },
    {
        id: 'A.14.2.1',
        nome: 'Desenvolvimento Seguro',
        descricao: 'Regras de desenvolvimento seguro de software',
        categoria: 'Desenvolvimento Seguro',
        padraoCorrespondente: ['tipo-inseguro', 'funcao-perigosa', 'unhandled-async', 'UNSAFE_FUNCTION'],
    },
    {
        id: 'A.14.2.5',
        nome: 'Testes de Segurança',
        descricao: 'Realizar testes de segurança em sistemas',
        categoria: 'Desenvolvimento Seguro',
        padraoCorrespondente: ['teste-seguranca', 'security-test', 'cobertura-testes'],
    },
    {
        id: 'A.18.1.4',
        nome: 'Privacidade e Proteção de Dados',
        descricao: 'Garantir proteção de dados pessoais',
        categoria: 'Conformidade',
        padraoCorrespondente: ['dados-pessoais', 'privacy', 'LGPD', 'GDPR', 'dados-sensiveis'],
    },
    {
        id: 'A.12.4.1',
        nome: 'Registro de Eventos',
        descricao: 'Manter logs de auditoria e monitoramento',
        categoria: 'Segurança Operacional',
        padraoCorrespondente: ['logging', 'log-sensitivo', 'auditoria', 'rastreabilidade'],
    },
    {
        id: 'A.12.4.3',
        nome: 'Proteção de Logs',
        descricao: 'Proteger logs contra adulteração e acesso não autorizado',
        categoria: 'Segurança Operacional',
        padraoCorrespondente: ['log-sensitivo', 'informacao-sensivel-em-log'],
    },
    {
        id: 'A.9.2.3',
        nome: 'Gerenciamento de Privilégios',
        descricao: 'Controlar e revisar direitos de acesso',
        categoria: 'Controle de Acesso',
        padraoCorrespondente: ['privilegio-excessivo', 'acesso-nao-autorizado', 'PERMISSION_EXCESS'],
    },
    {
        id: 'A.12.5.1',
        nome: 'Instalação de Software',
        descricao: 'Controlar instalação de software em sistemas operacionais',
        categoria: 'Segurança Operacional',
        padraoCorrespondente: ['dependencia-externa', 'dependencia-nao-oficial'],
    },
];
function mapearOcorrenciaParaControle(ocorrencia) {
    const tipo = (ocorrencia.tipo || '').toLowerCase();
    const mensagem = (ocorrencia.mensagem || '').toLowerCase();
    const textoCompleto = `${tipo} ${mensagem}`;
    return ISO_27001_CONTROLS
        .filter(controle => controle.padraoCorrespondente.some(padrao => textoCompleto.includes(padrao.toLowerCase())))
        .map(c => c.id);
}
function avaliarConformidade(totalEvidencias) {
    if (totalEvidencias === 0)
        return { conformidade: 'conforme', risco: 'baixo' };
    if (totalEvidencias <= 3)
        return { conformidade: 'parcial', risco: 'medio' };
    if (totalEvidencias <= 5)
        return { conformidade: 'nao-conforme', risco: 'alto' };
    return { conformidade: 'nao-conforme', risco: 'critico' };
}
export const gerarRelatorioISO27001 = (ocorrencias, metadados) => {
    const controlesEncontrados = new Map();
    for (const ocorrencia of ocorrencias) {
        const ids = mapearOcorrenciaParaControle(ocorrencia);
        for (const id of ids) {
            if (!controlesEncontrados.has(id)) {
                controlesEncontrados.set(id, []);
            }
            controlesEncontrados.get(id)?.push(ocorrencia);
        }
    }
    const secoes = new Map();
    for (const controle of ISO_27001_CONTROLS) {
        const evidencias = controlesEncontrados.get(controle.id)?.map(o => `${o.relPath}:${o.linha ?? ''} - ${o.mensagem}`) ?? [];
        const { conformidade, risco } = avaliarConformidade(evidencias.length);
        if (!secoes.has(controle.categoria)) {
            secoes.set(controle.categoria, []);
        }
        secoes.get(controle.categoria)?.push({
            id: controle.id,
            framework: 'iso-27001',
            nome: controle.nome,
            descricao: controle.descricao,
            categoria: controle.categoria,
            conformidade,
            risco,
            evidencias,
            recomendacao: evidencias.length > 0 ? `Revisar ${evidencias.length} evidência(s) encontrada(s)` : 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: 'iso-27001',
            nome,
            descricao: `Controles da categoria ${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) de segurança imediatamente`);
    if (riscosAltos > 0)
        recomendacoes.push(`Tratar ${riscosAltos} risco(s) alto(s) como prioritário`);
    if (naoConformes > 0)
        recomendacoes.push(`${naoConformes} controle(s) não conforme(s) precisam de ação corretiva`);
    if (parciais > 0)
        recomendacoes.push(`${parciais} controle(s) parcialmente conforme(s) precisam de melhoria contínua`);
    if (conformes === todosControles.length)
        recomendacoes.push('Todos os controles estão conformes');
    const relatorio = {
        metadata: {
            framework: 'iso-27001',
            versaoFramework: 'ISO/IEC 27001:2022',
            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)`,
            severidade: c.risco,
            acaoRecomendada: c.recomendacao ?? 'Revisar e corrigir não conformidades',
        })),
    };
    return relatorio;
};
//# sourceMappingURL=iso-mapping.js.map