import path from 'node:path';
import { messages } from '../core/messages/index.js';
import { lerArquivoTexto, salvarEstado } from '../shared/persistence/index.js';
const { RelatorioMensagens, log } = messages;
export async function exportarRelatorioArquetiposMarkdown(destino, candidatos, contexto, detalhado = false) {
    const linhas = [];
    linhas.push(`# ${RelatorioMensagens.arquetipos.titulo}`);
    if (contexto?.origem)
        linhas.push(`*Origem: ${contexto.origem}*`);
    linhas.push('');
    const cols = RelatorioMensagens.arquetipos.secoes.candidatos;
    linhas.push(`| ${cols.nome} | ${cols.confianca} | ${cols.score} | Explicação | Sugestão |`);
    linhas.push('|---|---|---|---|---|');
    for (const elem of candidatos) {
        if (!detalhado) {
            const missing = elem.missingRequired?.slice(0, 3) || [];
            const forbidden = elem.forbiddenPresent?.slice(0, 3) || [];
            const dependFalt = elem.dependencyMatches?.length === 0 && elem.dependencyMatches !== undefined ? elem.dependencyMatches : [];
            let resumo = '';
            if (missing.length)
                resumo += `Faltam pastas: ${missing.join(', ')}. `;
            if (forbidden.length)
                resumo += `Estruturas proibidas: ${forbidden.join(', ')}. `;
            if (dependFalt.length)
                resumo += `Dependências ausentes: ${dependFalt.join(', ')}. `;
            if (elem.sugestaoPadronizacao)
                resumo += elem.sugestaoPadronizacao.replace(/\n/g, ' ');
            if (!resumo)
                resumo = 'Estrutura próxima do ideal.';
            const explicacao = (elem.explicacaoSimilaridade || '').split('\n').slice(0, 2).join(' ');
            linhas.push(`| ${elem.nome} | ${elem.confidence} | ${elem.score} | ${explicacao} | ${resumo} |`);
        }
        else {
            await escreverSecaoDetalhadaArquetipo(linhas, elem);
        }
    }
    linhas.push('');
    linhas.push('---');
    linhas.push('**Como o diagnóstico foi feito:**');
    linhas.push(`A pontuação de cada arquétipo considera presença de pastas obrigatórias, opcionais, padrões de arquivos, dependências e penalidades por estruturas proibidas. O campo "Explicação" detalha os fatores que levaram à sugestão.`);
    await salvarEstado(destino, linhas.join('\n'));
}
async function escreverSecaoDetalhadaArquetipo(linhas, elem) {
    linhas.push(`\n## ${elem.nome}`);
    linhas.push(`Confiança: ${elem.confidence} | Score: ${elem.score}`);
    linhas.push(`Explicação: ${elem.explicacaoSimilaridade?.replace(/\n/g, ' ')}`);
    linhas.push(`Sugestão: ${elem.sugestaoPadronizacao?.replace(/\n/g, ' ')}`);
    if (elem.missingRequired?.length)
        linhas.push(`Pastas faltantes (gravidade: crítico): ${elem.missingRequired.map(caminho => `${caminho} [mkdir ${caminho}]`).join(', ')}`);
    if (elem.forbiddenPresent?.length)
        linhas.push(`Estruturas proibidas (gravidade: risco): ${elem.forbiddenPresent.join(', ')}`);
    if (elem.dependencyMatches?.length)
        linhas.push(`Dependências detectadas: ${elem.dependencyMatches.join(', ')}`);
    if (elem.filePadraoMatches?.length)
        linhas.push(`Padrões de arquivos: ${elem.filePadraoMatches.join(', ')}`);
    if (elem.anomalias?.length)
        linhas.push(`Anomalias: ${elem.anomalias.map(arquivo => `${arquivo.path} (${arquivo.motivo})`).join(', ')}`);
    if (elem.missingRequired?.length) {
        linhas.push('Sugestão de comandos:');
        elem.missingRequired.forEach(caminho => linhas.push(`  mkdir ${caminho}`));
    }
    if (elem.dependencyMatches && Array.isArray(elem.dependencyMatches)) {
        const ausentes = elem.dependencyMatches.length === 0 && elem.dependencyMatches !== undefined ? elem.dependencyMatches : [];
        if (ausentes.length) {
            linhas.push('Sugestão de comandos para dependências:');
            ausentes.forEach(dep => linhas.push(`  npm install ${dep}`));
        }
    }
    if (elem.nome) {
        const docLinks = {
            'api-rest-express': 'https://expressjs.com/pt-br/',
            fullstack: 'https://nextjs.org/docs',
            monorepo: 'https://turborepo.org/docs',
            cli: 'https://nodejs.org/api/cli.html',
            lib: 'https://www.typescriptlang.org/docs/'
        };
        if (docLinks[elem.nome])
            linhas.push(`Documentação oficial: ${docLinks[elem.nome]}`);
    }
    if (elem.dependencyMatches?.length) {
        const fwLinks = {
            express: 'https://expressjs.com/pt-br/',
            react: 'https://react.dev/',
            next: 'https://nextjs.org/docs',
            electron: 'https://www.electronjs.org/docs',
            'discord.js': 'https://discord.js.org/#/docs',
            telegraf: 'https://telegraf.js.org/'
        };
        elem.dependencyMatches.forEach(dep => {
            if (fwLinks[dep])
                linhas.push(`Doc ${dep}: ${fwLinks[dep]}`);
        });
    }
    if (elem.explicacaoSimilaridade && /função longa|require dinâmico|import misto|eval/.test(elem.explicacaoSimilaridade)) {
        linhas.push(`Práticas inseguras detectadas: ${elem.explicacaoSimilaridade}`);
    }
    await analisarDependenciasPackageJson(linhas);
    await executarNpmAudit(linhas);
    linhas.push('---');
}
async function analisarDependenciasPackageJson(linhas) {
    try {
        const pkgCaminho = path.resolve(process.cwd(), 'package.json');
        const raw = await lerArquivoTexto(pkgCaminho);
        if (!raw)
            return;
        const pkg = JSON.parse(raw);
        if (!pkg || typeof pkg !== 'object' || !pkg.dependencies)
            return;
        const deps = pkg.dependencies;
        for (const dep in deps) {
            if (/^0\./.test(deps[dep]) || /^\^0\./.test(deps[dep])) {
                linhas.push(`Dependência potencialmente desatualizada/vulnerável: ${dep} (${deps[dep]}) [grave]`);
                linhas.push(`Sugestão: npm update ${dep}`);
            }
        }
    }
    catch (err) {
        log.debug(`Erro ao processar package.json: ${err instanceof Error ? err.message : String(err)}`);
    }
}
async function executarNpmAudit(linhas) {
    try {
        const { execSync } = await import('node:child_process');
        const auditRaw = execSync('npm audit --json', { encoding: 'utf-8' });
        const audit = JSON.parse(auditRaw);
        const total = audit.metadata?.vulnerabilities?.total ?? 0;
        if (total > 0) {
            linhas.push('Vulnerabilidades detectadas pelo npm audit:');
            for (const [sev, qtd] of Object.entries(audit.metadata?.vulnerabilities ?? {})) {
                if (typeof qtd === 'number' && qtd > 0 && sev !== 'total') {
                    linhas.push(`  ${sev}: ${qtd}`);
                }
            }
            linhas.push('Sugestão: npm audit fix');
        }
        else {
            linhas.push('Nenhuma vulnerabilidade encontrada pelo npm audit.');
        }
    }
    catch (err) {
        log.debug(`Erro ao executar npm audit: ${err instanceof Error ? err.message : String(err)}`);
    }
}
export async function exportarRelatorioArquetiposJson(destino, candidatos, contexto, detalhado = false) {
    const { criarRelatorioComVersao } = await import('../core/schema/index.js');
    const relatorio = {
        origem: contexto?.origem ?? null,
        candidatos: candidatos.map(elem => {
            if (!detalhado) {
                const missing = elem.missingRequired?.slice(0, 3) || [];
                const forbidden = elem.forbiddenPresent?.slice(0, 3) || [];
                const dependFalt = elem.dependencyMatches?.length === 0 && elem.dependencyMatches !== undefined ? elem.dependencyMatches : [];
                let resumo = '';
                if (missing.length)
                    resumo += `Faltam pastas: ${missing.join(', ')}. `;
                if (forbidden.length)
                    resumo += `Estruturas proibidas: ${forbidden.join(', ')}. `;
                if (dependFalt.length)
                    resumo += `Dependências ausentes: ${dependFalt.join(', ')}. `;
                if (elem.sugestaoPadronizacao)
                    resumo += elem.sugestaoPadronizacao.replace(/\n/g, ' ');
                if (!resumo)
                    resumo = 'Estrutura próxima do ideal.';
                const explicacao = (elem.explicacaoSimilaridade || '').split('\n').slice(0, 2).join(' ');
                return {
                    nome: elem.nome,
                    confidence: elem.confidence,
                    score: elem.score,
                    explicacao,
                    resumo,
                    matchedRequired: elem.matchedRequired?.slice(0, 3) || [],
                    missingRequired: missing,
                    forbiddenPresent: forbidden,
                    descricao: elem.descricao
                };
            }
            else {
                return {
                    nome: elem.nome,
                    confidence: elem.confidence,
                    score: elem.score,
                    explicacao: elem.explicacaoSimilaridade,
                    sugestao: elem.sugestaoPadronizacao,
                    matchedRequired: elem.matchedRequired,
                    missingRequired: elem.missingRequired,
                    matchedOptional: elem.matchedOptional,
                    dependencyMatches: elem.dependencyMatches,
                    filePadraoMatches: elem.filePadraoMatches,
                    forbiddenPresent: elem.forbiddenPresent,
                    anomalias: elem.anomalias,
                    descricao: elem.descricao
                };
            }
        })
    };
    const relatorioVersionado = criarRelatorioComVersao(relatorio, undefined, 'Relatório de detecção de arquétipos estruturais');
    await salvarEstado(destino, relatorioVersionado);
}
//# sourceMappingURL=report-archetypes.js.map