const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());
const fs = require('fs');

class AffiliateGenerator {
    async converterLista(produtosBrutos) {
        console.log('\nIniciando conversão para links de afiliado (Modo Docker/Invisível)...');

        const browser = await puppeteer.launch({ 
            headless: false, 
            args: [
                '--no-sandbox', 
                '--disable-setuid-sandbox',
                '--disable-dev-shm-usage',
                '--disable-blink-features=AutomationControlled',
                '--disable-gpu',
                '--window-size=1920,1080'
            ] 
        });
        const page = await browser.newPage();

        // 1. Aquecimento: Acessa a home primeiro para gerar tokens de sessão naturais
        await page.goto('https://www.mercadolivre.com.br', { waitUntil: 'domcontentloaded' });

        // 2. Injeta os cookies de autorização
        if (fs.existsSync('./cookies.json')) {
            const cookies = JSON.parse(fs.readFileSync('./cookies.json', 'utf8'));
            await page.setCookie(...cookies);
        }

        // 3. Acessa o gerador com a sessão já "aquecida"
        await page.goto('https://www.mercadolivre.com.br/afiliados/gerador', { waitUntil: 'networkidle2' });

        try {
            await page.waitForSelector('textarea#url-0', { timeout: 15000 });
        } catch (erro) {
            console.log('\n❌ ERRO CRÍTICO: Bloqueio detectado ou cookies inválidos.');
            await browser.close();
            return []; // Retorna array vazio para não quebrar a API com Erro 500
        }

        const produtosConvertidos = [];

        for (const produto of produtosBrutos) {
            try {
                await page.evaluate(() => { document.querySelector('textarea#url-0').value = ''; });
                await page.type('textarea#url-0', produto.linkProduto);

                await page.evaluate(() => {
                    const spans = Array.from(document.querySelectorAll('span.andes-button__content'));
                    const btnGerar = spans.find(s => s.textContent.trim() === 'Gerar');
                    if (btnGerar && btnGerar.parentElement) btnGerar.parentElement.click();
                });

                await new Promise(r => setTimeout(r, 2000)); // Tempo extra para o ML processar

                const linkAfiliado = await page.evaluate(() => {
                    const textareas = document.querySelectorAll('textarea[id^="textfield-copyLink"]');
                    return textareas.length > 0 ? textareas[textareas.length - 1].value : null;
                });

                if (linkAfiliado && linkAfiliado.includes('meli.la')) {
                    produto.linkProduto = linkAfiliado;
                    produtosConvertidos.push(produto); // Só adiciona se a conversão foi um sucesso
                    console.log(`✅ Convertido: ${produto.nomeProduto.substring(0, 30)}...`);
                } else {
                    throw new Error("Link inválido ou não gerado.");
                }
            } catch (error) {
                console.log(`⚠️ Descartado (Falha na conversão): ${produto.nomeProduto.substring(0, 30)}...`);
            }
        }

        await browser.close();
        return produtosConvertidos;
    }
}

module.exports = AffiliateGenerator;