/**
 * datadome.js – Solver de DataDome vía 2Captcha (DataDomeSliderTask).
 *
 * Flujo: el 403 de PagoStore trae una captchaUrl (geo.captcha-delivery.com).
 * Se envía a 2Captcha, se espera la solución y se devuelve el valor de la
 * cookie `datadome` nueva. El proxy es OPCIONAL: si no está configurado la
 * tarea se envía sin él (modo prueba contra la IP del worker de 2Captcha).
 */

import fs from 'fs';
import {
  TWOCAPTCHA_API_KEY,
  GARENA,
  USER_AGENT,
  DATADOME_PROXY,
  DATADOME_PROXY_CONFIGURED,
} from '../config.js';

const API = 'https://api.2captcha.com';
const POLL_INTERVAL_MS = 5000;
const POLL_MAX_ATTEMPTS = 18; // ~90s techo

export function isSolverReady() {
  return Boolean(TWOCAPTCHA_API_KEY);
}

/** Extrae la captchaUrl del body JSON/texto de una respuesta 403 de DataDome. */
export function extractCaptchaUrl(bodyText) {
  if (!bodyText) return null;
  try {
    const json = JSON.parse(bodyText);
    if (json?.url && /captcha-delivery\.com/.test(json.url)) return json.url;
  } catch (_e) {
    // No era JSON; seguimos con regex.
  }
  const m = String(bodyText).match(/https:\/\/geo\.captcha-delivery\.com\/captcha\/\?[^"'\\\s]+/);
  return m ? m[0] : null;
}

async function apiCall(endpoint, payload, timeoutMs = 30000) {
  const ctrl = new AbortController();
  const timer = setTimeout(() => ctrl.abort(), timeoutMs);
  try {
    const res = await fetch(`${API}${endpoint}`, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify(payload),
      signal: ctrl.signal,
    });
    return await res.json();
  } finally {
    clearTimeout(timer);
  }
}

/**
 * Resuelve el desafío. Devuelve { ok:true, value } con la cookie nueva o
 * { ok:false, reason } con causa tipada (nunca lanza).
 */
export async function solveDataDome(captchaUrl) {
  if (!isSolverReady()) return { ok: false, reason: 'not_configured' };
  if (!captchaUrl) return { ok: false, reason: 'no_captcha_url' };

  const task = {
    type: 'DataDomeSliderTask',
    websiteURL: GARENA.baseUrl,
    captchaUrl,
    userAgent: USER_AGENT,
  };
  if (DATADOME_PROXY_CONFIGURED) {
    task.proxyType = DATADOME_PROXY.type;
    task.proxyAddress = DATADOME_PROXY.host;
    task.proxyPort = String(DATADOME_PROXY.port);
    if (DATADOME_PROXY.login) task.proxyLogin = DATADOME_PROXY.login;
    if (DATADOME_PROXY.password) task.proxyPassword = DATADOME_PROXY.password;
  }

  let created;
  try {
    created = await apiCall('/createTask', { clientKey: TWOCAPTCHA_API_KEY, task });
  } catch (_e) {
    return { ok: false, reason: 'network' };
  }
  if (created?.errorId !== 0 || !created?.taskId) {
    return { ok: false, reason: created?.errorCode || 'create_failed' };
  }

  for (let attempt = 0; attempt < POLL_MAX_ATTEMPTS; attempt++) {
    await new Promise((r) => setTimeout(r, POLL_INTERVAL_MS));
    let poll;
    try {
      poll = await apiCall('/getTaskResult', { clientKey: TWOCAPTCHA_API_KEY, taskId: created.taskId });
    } catch (_e) {
      continue; // error transitorio de red: siguiente intento de polling
    }
    if (poll?.errorId !== 0) return { ok: false, reason: poll?.errorCode || 'poll_failed' };
    if (poll.status === 'ready') {
      const raw = poll.solution?.cookie || '';
      // Formato esperado: "datadome=VALOR; Path=/; Secure; SameSite=Lax"
      const value = raw.split(';')[0].split('=').slice(1).join('=').trim();
      if (!value) return { ok: false, reason: 'empty_solution' };
      return { ok: true, value };
    }
  }
  return { ok: false, reason: 'timeout' };
}

/** Reemplaza (o agrega) la cookie datadome en full-cookies.json de forma persistente. */
