import { promises as fs } from 'node:fs';
import path from 'node:path';
import { ARQUETIPOS } from '../strategists/index.js';
import { getMessages } from '../../core/messages/index.js';
import { TUTANUS_ARQUIVOS } from '../../core/registry/index.js';
import { lerEstado, salvarEstado } from '../../shared/persistence/index.js';
const { log, ArquetiposExtraMensagens } = getMessages();
const ARQUETIPO_PERSONALIZADO_FILENAME = 'tutanus.repo.arquetipo.json';
export async function carregarArquetipoPersonalizado(baseDir = process.cwd()) {
    const novoCaminho = TUTANUS_ARQUIVOS.ESTRUTURA_ARQUETIPO;
    const caminhoLegado = path.join(baseDir, ARQUETIPO_PERSONALIZADO_FILENAME);
    try {
        const arquetipo = await lerEstado(novoCaminho, null);
        if (arquetipo && arquetipo.nome && arquetipo.arquetipoOficial) {
            return arquetipo;
        }
        const arquetipoLegado = await lerEstado(caminhoLegado, null);
        if (!arquetipoLegado || !arquetipoLegado.nome || !arquetipoLegado.arquetipoOficial) {
            const isTest = (process.env.VITEST ?? '') !== '';
            const isVerbose = log.verbose || false;
            if (!isTest && isVerbose) {
                log.aviso(ArquetiposExtraMensagens.naoEncontrado.replace('{novo}', novoCaminho).replace('{legado}', caminhoLegado));
            }
            return null;
        }
        return arquetipoLegado;
    }
    catch {
        return null;
    }
}
export async function salvarArquetipoPersonalizado(arquetipo, _baseDir = process.cwd()) {
    const arquetipoCompleto = {
        ...arquetipo,
        metadata: {
            criadoEm: new Date().toISOString(),
            versao: '1.0.0',
            notasUsuario: undefined
        }
    };
    const novoCaminho = TUTANUS_ARQUIVOS.ESTRUTURA_ARQUETIPO;
    const tutanusDir = path.dirname(novoCaminho);
    try {
        await fs.mkdir(tutanusDir, {
            recursive: true
        });
    }
    catch {
    }
    await salvarEstado(novoCaminho, arquetipoCompleto);
    log.sucesso(ArquetiposExtraMensagens.salvo.replace('{caminho}', novoCaminho));
}
export async function existeArquetipoPersonalizado(baseDir = process.cwd()) {
    try {
        await fs.stat(TUTANUS_ARQUIVOS.ESTRUTURA_ARQUETIPO);
        return true;
    }
    catch {
        const arquivoArquetipo = path.join(baseDir, ARQUETIPO_PERSONALIZADO_FILENAME);
        try {
            await fs.stat(arquivoArquetipo);
            return true;
        }
        catch {
            return false;
        }
    }
}
export function obterArquetipoOficial(arquetipoPersonalizado) {
    const nomeOficial = arquetipoPersonalizado.arquetipoOficial ?? '';
    const encontrado = ARQUETIPOS?.find((arq) => arq.nome === nomeOficial);
    return encontrado ?? null;
}
export function gerarSugestaoArquetipoPersonalizado(projetoDesconhecido) {
    const sugestao = `
${ArquetiposExtraMensagens.projetoPersonalizado.replace('{nome}', projetoDesconhecido.nome)}

${ArquetiposExtraMensagens.descricaoPersonalizado}

${ArquetiposExtraMensagens.estruturaDetectada}
${projetoDesconhecido.estruturaDetectada.map(dir => `  • ${dir}`).join('\n')}

${ArquetiposExtraMensagens.arquivosRaiz}
${projetoDesconhecido.arquivosRaiz.slice(0, 5).map(file => `  • ${file}`).join('\n')}
${projetoDesconhecido.arquivosRaiz.length > 5 ? `  • ... e mais ${projetoDesconhecido.arquivosRaiz.length - 5} arquivos` : ''}

${ArquetiposExtraMensagens.dicaCriar}
${ArquetiposExtraMensagens.comandoCriar}

${ArquetiposExtraMensagens.explicacaoCriar}
`;
    return sugestao;
}
export function criarTemplateArquetipoPersonalizado(nomeProjeto, estruturaDetectada, arquivosRaiz, arquetipoSugerido = 'generico') {
    let arquetipoOficial = arquetipoSugerido;
    if (arquetipoOficial === 'generico' || !arquetipoOficial) {
        const temBin = estruturaDetectada.some(dir => dir === 'bin' || dir.startsWith('bin/'));
        const temCli = estruturaDetectada.some(dir => dir.includes('/cli') || dir === 'cli');
        const temCommands = estruturaDetectada.some(dir => dir.includes('/commands') || dir === 'commands');
        if (temBin && (temCli || temCommands)) {
            arquetipoOficial = 'cli-modular';
        }
        else if (estruturaDetectada.some(dir => dir === 'src/bot' || dir.startsWith('src/bot/')) && estruturaDetectada.some(dir => dir.includes('events') || dir.includes('scenes'))) {
            arquetipoOficial = 'bot';
        }
        else if (estruturaDetectada.some(dir => dir.includes('controllers')) && estruturaDetectada.some(dir => dir.includes('routes'))) {
            arquetipoOficial = 'api-rest-express';
        }
        else if (estruturaDetectada.some(dir => dir.includes('pages')) && estruturaDetectada.some(dir => dir.includes('api'))) {
            arquetipoOficial = 'fullstack';
        }
        else if (estruturaDetectada.some(dir => dir === 'src' || dir.startsWith('src/'))) {
            arquetipoOficial = 'lib-tsc';
        }
    }
    const diretoriosPrincipais = estruturaDetectada.filter(dir => !dir.includes('/') || dir.split('/').length <= 2).filter(dir => !dir.startsWith('node_modules') && !dir.startsWith('.git'));
    const arquivosChave = arquivosRaiz.filter(file => ['package.json', 'tsconfig.json', 'README.md', '.env.example'].includes(file) || file.endsWith('.ts') || file.endsWith('.js')).slice(0, 5);
    return {
        nome: nomeProjeto,
        descricao: `Projeto personalizado: ${nomeProjeto}`,
        arquetipoOficial,
        estruturaPersonalizada: {
            diretorios: diretoriosPrincipais,
            arquivosChave,
            padroesNomenclatura: {
                ...(estruturaDetectada.some(diretorio => diretorio.includes('components')) && {
                    components: '*-component.*'
                }),
                ...(estruturaDetectada.some(diretorio => diretorio.includes('utils')) && {
                    utils: '*-util.*'
                }),
                ...(estruturaDetectada.some(diretorio => diretorio.includes('test')) && {
                    tests: '*.test.*'
                })
            }
        },
        melhoresPraticas: {
            recomendado: ['src/', 'tests/', 'docs/', 'README.md', '.env.example'],
            evitar: ['temp/', 'cache/', '*.log'],
            notas: ['Mantenha código fonte organizado em src/', 'Separe testes em pasta dedicada', 'Documente APIs e funcionalidades importantes']
        }
    };
}
export function validarArquetipoPersonalizado(arquetipo) {
    const erros = [];
    if (!arquetipo.nome || typeof arquetipo.nome !== 'string') {
        erros.push(ArquetiposExtraMensagens.validacao.nomeObrigatorio);
    }
    if (!arquetipo.arquetipoOficial || typeof arquetipo.arquetipoOficial !== 'string') {
        erros.push(ArquetiposExtraMensagens.validacao.arquetipoObrigatorio);
    }
    else {
        const arquetipoOficial = ARQUETIPOS?.find((arq) => arq.nome === arquetipo.arquetipoOficial);
        if (!arquetipoOficial) {
            erros.push(ArquetiposExtraMensagens.validacao.arquetipoNaoEncontrado.replace('{arquetipo}', arquetipo.arquetipoOficial).replace('{disponiveis}', (ARQUETIPOS ?? []).map(arquivo => arquivo.nome).join(', ')));
        }
    }
    if (!arquetipo.estruturaPersonalizada) {
        erros.push(ArquetiposExtraMensagens.validacao.estruturaObrigatoria);
    }
    else {
        if (!Array.isArray(arquetipo.estruturaPersonalizada.diretorios)) {
            erros.push(ArquetiposExtraMensagens.validacao.diretoriosArray);
        }
        if (!Array.isArray(arquetipo.estruturaPersonalizada.arquivosChave)) {
            erros.push(ArquetiposExtraMensagens.validacao.arquivosChaveArray);
        }
    }
    return {
        valido: erros.length === 0,
        erros
    };
}
export function listarArquetiposOficiais() {
    return ARQUETIPOS;
}
export function integrarArquetipos(personalizado, oficial) {
    return {
        ...oficial,
        nome: personalizado.nome,
        descricao: personalizado.descricao || oficial.descricao,
        requiredDirs: personalizado.estruturaPersonalizada.diretorios,
        optionalDirs: oficial.optionalDirs,
        rootFilesAllowed: personalizado.estruturaPersonalizada.arquivosChave,
        forbiddenDirs: oficial.forbiddenDirs,
        dependencyHints: oficial.dependencyHints,
        filePresencePatterns: oficial.filePresencePatterns,
        pesoBase: oficial.pesoBase
    };
}
//# sourceMappingURL=archetypes-custom.js.map