import { execFile as _execFile } from 'node:child_process';
import fs from 'node:fs/promises';
import path from 'node:path';
import { promisify } from 'node:util';
import { messages } from '../core/messages/index.js';
const execFile = promisify(_execFile);
function string(valor) {
    return valor == null ? '' : String(valor);
}
function nl(txt) {
    return txt.replace(/\r\n?|\n/g, '\n');
}
function header({ projectNome, license, ptBr }) {
    const now = new Date().toISOString();
    if (ptBr) {
        return ['AVISOS DE TERCEIROS', '====================', '', `${projectNome} - Licença do projeto: ${license}`, `Este arquivo lista componentes de terceiros incluídos (produção) e seus respectivos avisos/licenças.`, `Gerado em: ${now}`, '', 'Observações:', '- Este arquivo é gerado automaticamente; não edite manualmente.', '- Para atualizar, execute: npm run licenses:notice', '- Os textos de licença de terceiros são reproduzidos no idioma original para preservar validade jurídica.', ''].join('\n');
    }
    return ['THIRD PARTY NOTICES', '====================', '', `${projectNome} - Project license: ${license}`, `This file lists third-party components included (production) and their notices/licenses.`, `Generated at: ${now}`, '', 'Notes:', '- This file is generated automatically; do not edit manually.', '- To update, run: npm run licenses:notice', '- Third-party license texts are reproduced in their original language to preserve legal validity.', ''].join('\n');
}
async function renderPackageBlock(pkgId, meta) {
    const lines = [];
    lines.push('---');
    lines.push(`Pacote: ${pkgId}`);
    lines.push(`Licenças: ${string(meta.licenses)}`);
    if (meta.publisher)
        lines.push(`Publicador: ${string(meta.publisher)}`);
    if (meta.email)
        lines.push(`Contato: ${string(meta.email)}`);
    if (meta.repository)
        lines.push(`Repositório: ${string(meta.repository)}`);
    if (meta.licenseArquivo) {
        try {
            const content = await fs.readFile(meta.licenseArquivo, 'utf-8');
            const trimmed = nl(content).trim();
            if (trimmed) {
                lines.push('');
                lines.push('--- Início do texto de licença ---');
                lines.push(trimmed);
                lines.push('--- Fim do texto de licença ---');
            }
        }
        catch (err) {
            lines.push('');
            const errMsg = err instanceof Error ? err.message : String(err);
            lines.push(`(Aviso) Não foi possível ler o arquivo de licença: ${meta.licenseArquivo} - ${errMsg}`);
        }
    }
    const pkgDir = meta.path;
    if (pkgDir) {
        const candidates = ['NOTICE', 'NOTICE.txt', 'NOTICE.md', 'Notice', 'notice', 'notice.txt'];
        for (const arquivo of candidates) {
            try {
                const noticeCaminho = path.join(pkgDir, arquivo);
                const ncontent = nl(await fs.readFile(noticeCaminho, 'utf-8')).trim();
                if (ncontent) {
                    lines.push('');
                    lines.push('--- Início do NOTICE ---');
                    lines.push(ncontent);
                    lines.push('--- Fim do NOTICE ---');
                }
                break;
            }
            catch { }
        }
    }
    lines.push('');
    return lines.join('\n');
}
export async function generateNotices({ root = process.cwd(), ptBr = false, output } = {}) {
    const pkg = JSON.parse(await fs.readFile(path.join(root, 'package.json'), 'utf-8'));
    const projectNome = `${pkg.name}@${pkg.version}`;
    const projectLicenca = pkg.license || 'UNSPECIFIED';
    let results = null;
    const cacheCaminho = path.join(root, '.tutanus', 'licenses.json');
    try {
        const buf = await fs.readFile(cacheCaminho, 'utf-8');
        results = JSON.parse(buf);
    }
    catch { }
    if (!results) {
        try {
            const { createRequire } = await import('node:module');
            const require = createRequire(import.meta.url);
            const licenseChecker = require('license-checker-rseidelsohn');
            results = await new Promise((resolve, reject) => {
                licenseChecker.init({
                    start: root,
                    production: true,
                    direct: false,
                    relativeLicensePath: true,
                    json: true
                }, (err, json) => {
                    if (err)
                        reject(err);
                    else
                        resolve(json);
                });
            });
        }
        catch {
        }
    }
    if (!results) {
        try {
            const { stdout } = await execFile('npx', ['--yes', 'license-checker-rseidelsohn', '--production', '--json'], {
                cwd: root,
                maxBuffer: 10 * 1024 * 1024
            });
            results = JSON.parse(stdout);
        }
        catch {
            throw new Error(messages.LicensasMensagens.erroObterLicenca);
        }
    }
    try {
        const dir = path.join(root, '.tutanus');
        await fs.mkdir(dir, {
            recursive: true
        });
        await fs.writeFile(path.join(dir, 'licenses.json'), JSON.stringify(results, null, 2), 'utf-8');
    }
    catch { }
    const entries = Object.entries(results || {}).filter(([id]) => !id.startsWith(`${pkg.name}@`)).sort((arquivo, base) => arquivo[0].localeCompare(base[0]));
    const parts = [header({
            projectNome,
            license: projectLicenca,
            ptBr
        })];
    for (const [id, meta] of entries) {
        parts.push(await renderPackageBlock(id, meta));
    }
    const finalTxt = parts.join('\n');
    const out = output ? path.resolve(root, output) : path.join(root, ptBr ? 'AVISOS-DE-TERCEIROS.pt-BR.txt' : 'THIRD-PARTY-NOTICES.txt');
    await fs.writeFile(out, finalTxt, 'utf-8');
    return {
        output: out,
        packages: entries.length
    };
}
//# sourceMappingURL=generate-notices.js.map