import { detectarArquetipoNode } from '../plugins/index.js';
import { pontuarTodos } from '../scorers/index.js';
import { ARQUETIPOS } from '../strategists/index.js';
import { detectarArquetipoXML } from '../xml/detectors/index.js';
import { detectarContextoProjeto } from '../../shared/index.js';
void detectarContextoProjeto;
function criarResultadoDesconhecido(motivo) {
    const anomalias = motivo ? [{
            path: 'projeto',
            motivo,
            sugerido: 'Adicione mais arquivos ao projeto para melhor detecção'
        }] : [];
    return {
        nome: 'desconhecido',
        score: 0,
        confidence: 0,
        matchedRequired: [],
        missingRequired: [],
        matchedOptional: [],
        dependencyMatches: [],
        filePadraoMatches: [],
        forbiddenPresent: [],
        anomalias,
        sugestaoPadronizacao: '',
        explicacaoSimilaridade: '',
        descricao: 'Arquétipo não identificado'
    };
}
export function detectarArquetipo(arquivos) {
    if (arquivos.length < 5) {
        return criarResultadoDesconhecido('Projeto muito pequeno para análise de arquétipo');
    }
    const candidatos = [];
    const hasJS = arquivos.some(arquivo => arquivo.endsWith('.js') || arquivo.endsWith('.ts') || arquivo.endsWith('.jsx') || arquivo.endsWith('.tsx'));
    const hasXML = arquivos.some(arquivo => arquivo.endsWith('.xml'));
    const hasPackageJson = arquivos.some(arquivo => arquivo.endsWith('package.json'));
    if (hasJS || hasPackageJson) {
        candidatos.push(...detectarArquetipoNode(arquivos));
    }
    if (hasXML) {
        candidatos.push(...detectarArquetipoXML(arquivos));
    }
    let lista = candidatos;
    if (!lista.length) {
        lista = pontuarTodos(arquivos);
    }
    if (!lista.length) {
        return {
            nome: 'desconhecido',
            score: 0,
            confidence: 0,
            matchedRequired: [],
            missingRequired: [],
            matchedOptional: [],
            dependencyMatches: [],
            filePadraoMatches: [],
            forbiddenPresent: [],
            anomalias: [],
            sugestaoPadronizacao: '',
            explicacaoSimilaridade: '',
            descricao: 'Arquétipo não identificado'
        };
    }
    const apenasPenalidades = lista.filter(elem => {
        const pos = (elem.matchedRequired?.length || 0) + (elem.matchedOptional?.length || 0) + (elem.dependencyMatches?.length || 0) + (elem.filePadraoMatches?.length || 0);
        const forb = elem.forbiddenPresent?.length || 0;
        return forb > 0 && pos === 0;
    });
    if (apenasPenalidades.length > 0) {
        const filtrados = apenasPenalidades.filter(elem => {
            if (elem.nome === 'monorepo-packages') {
                const forb = elem.forbiddenPresent || [];
                if (forb.length === 1 && forb[0] === 'src')
                    return false;
            }
            return true;
        });
        if (filtrados.length === 0) {
        }
        else {
            filtrados.sort((arquivo, base) => {
                const forbA = arquivo.forbiddenPresent?.length || 0;
                const forbB = base.forbiddenPresent?.length || 0;
                const defA = ARQUETIPOS?.find((diretorio) => diretorio.nome === arquivo.nome);
                const defB = ARQUETIPOS?.find((diretorio) => diretorio.nome === base.nome);
                const totA = defA?.forbiddenDirs?.length || 0;
                const totB = defB?.forbiddenDirs?.length || 0;
                const ratioA = totA > 0 ? forbA / totA : 0;
                const ratioB = totB > 0 ? forbB / totB : 0;
                if (ratioB !== ratioA)
                    return ratioB - ratioA;
                if (forbB !== forbA)
                    return forbB - forbA;
                const miss = (base.missingRequired?.length || 0) - (arquivo.missingRequired?.length || 0);
                if (miss !== 0)
                    return miss;
                return arquivo.nome.localeCompare(base.nome);
            });
            return filtrados[0];
        }
    }
    lista.sort((arquivo, base) => {
        const mm = (arquivo.missingRequired?.length || 0) - (base.missingRequired?.length || 0);
        if (mm !== 0)
            return mm;
        if (base.score !== arquivo.score)
            return base.score - arquivo.score;
        const mr = (base.matchedRequired?.length || 0) - (arquivo.matchedRequired?.length || 0);
        if (mr !== 0)
            return mr;
        if (base.confidence !== arquivo.confidence)
            return base.confidence - arquivo.confidence;
        return arquivo.nome.localeCompare(base.nome);
    });
    const best = lista[0];
    const hasSignals = (best.matchedRequired?.length || 0) > 0 || (best.matchedOptional?.length || 0) > 0 || (best.dependencyMatches?.length || 0) > 0 || (best.filePadraoMatches?.length || 0) > 0 || (best.forbiddenPresent?.length || 0) > 0;
    if (!hasSignals) {
        return {
            nome: 'desconhecido',
            score: 0,
            confidence: 0,
            matchedRequired: [],
            missingRequired: [],
            matchedOptional: [],
            dependencyMatches: [],
            filePadraoMatches: [],
            forbiddenPresent: [],
            anomalias: [],
            sugestaoPadronizacao: '',
            explicacaoSimilaridade: '',
            descricao: 'Arquétipo não identificado'
        };
    }
    return best;
}
//# sourceMappingURL=orchestrator-archetypes.js.map