'use strict';

// ── Telemetría visual ──────────────────────────────────────────────────────────
// Captura el viewport de una página Playwright y la sube al servidor como JPEG base64.
// Lo usan dos lugares:
//   - scriptTaskHandler  → capturas automáticas en eventos críticos (challenge/baneo/fallo)
//   - workerRuntime      → captura on-demand pedida por el admin (vía heartbeat)
//
// Fire-and-forget por diseño: una captura nunca debe romper ni demorar una tarea real.

/**
 * Captura el viewport visible de `page` y lo sube al servidor.
 * @param {import('playwright').Page} page
 * @param {object} opts
 * @param {string} opts.reason    — 'on_demand' | 'challenge' | 'ban' | 'failure' | 'manual'
 * @param {string} opts.workerId
 * @param {string} [opts.taskId]
 * @param {string} [opts.note]
 * @param {string} [opts.serverUrl]
 * @returns {Promise<{ok:boolean, url?:string, error?:string}>}
 */
async function captureAndUpload(page, opts = {}) {
    if (!page || typeof page.screenshot !== 'function') return { ok: false, error: 'sin página activa' };
    let buf;
    try {
        // Viewport visible (no fullPage): es lo que ve el usuario y pesa mucho menos.
        // JPEG q60 → ~80-180KB en 1280-1920px de ancho.
        buf = await page.screenshot({ type: 'jpeg', quality: 60 });
    } catch (e) {
        return { ok: false, error: `screenshot falló: ${e.message}` };
    }
    return uploadBuffer(buf, { target: 'chrome', ...opts });
}

/**
 * Sube un JPEG ya capturado (buffer) al servidor. Lo usa main-worker con el JPEG
 * de `capturePage()` de la ventana Electron (target 'panel'), y captureAndUpload
 * con el screenshot de Playwright (target 'chrome').
 * @param {Buffer} buf  JPEG
 * @param {object} opts { reason, target, workerId, taskId, note, serverUrl }
 */
async function uploadBuffer(buf, opts = {}) {
    const reason    = opts.reason || 'on_demand';
    const target    = opts.target === 'panel' ? 'panel' : 'chrome';
    const workerId  = opts.workerId || process.env.WORKER_ID || 'unknown';
    const serverUrl = (opts.serverUrl || process.env.TASK_SERVER_URL || '').replace(/\/$/, '');
    if (!buf || !buf.length) return { ok: false, error: 'buffer vacío' };
    if (!serverUrl) return { ok: false, error: 'sin TASK_SERVER_URL' };

    try {
        const controller = new AbortController();
        const timer = setTimeout(() => controller.abort(), 20000);
        const res = await fetch(`${serverUrl}/api/workers/${encodeURIComponent(workerId)}/screenshot`, {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({
                image:  buf.toString('base64'),
                reason,
                target,
                taskId: opts.taskId || null,
                note:   opts.note || null,
            }),
            signal: controller.signal,
        });
        clearTimeout(timer);
        if (!res.ok) return { ok: false, error: `HTTP ${res.status}` };
        const data = await res.json().catch(() => ({}));
        return { ok: true, url: data.url };
    } catch (e) {
        return { ok: false, error: e.message };
    }
}

module.exports = { captureAndUpload, uploadBuffer };
