// Cliente HTTP da extensão pro ScaleReels API.
// Lida com token JWT (chrome.storage) e refresh automático.

import { API_BASE, STORAGE_KEYS } from './config.js';

async function getToken() {
  const stored = await chrome.storage.local.get(STORAGE_KEYS.AUTH_TOKEN);
  return stored[STORAGE_KEYS.AUTH_TOKEN] || null;
}

async function setToken(token) {
  await chrome.storage.local.set({ [STORAGE_KEYS.AUTH_TOKEN]: token });
}

async function clearAuth() {
  await chrome.storage.local.remove([STORAGE_KEYS.AUTH_TOKEN, STORAGE_KEYS.USER_INFO]);
}

/**
 * Auto-login: tenta importar a sessão do site scalereels.com.br se o user já
 * estiver logado lá. Lê o cookie `is_token` (gravado pelo backend no login)
 * via chrome.cookies API, valida com /auth/me e salva localmente.
 *
 * Retorna { ok: true, user } se conseguiu, { ok: false, reason } se falhou.
 * Não loga erros — é uma tentativa silenciosa.
 */
export async function trySSO() {
  if (!chrome.cookies?.get) return { ok: false, reason: 'no_cookie_api' };
  try {
    // Tenta tanto scalereels.com.br quanto www.scalereels.com.br
    const candidates = [
      { url: 'https://scalereels.com.br/', name: 'is_token' },
      { url: 'https://www.scalereels.com.br/', name: 'is_token' }
    ];
    let cookie = null;
    for (const c of candidates) {
      cookie = await chrome.cookies.get(c);
      if (cookie?.value) break;
    }
    if (!cookie?.value) return { ok: false, reason: 'no_cookie' };
    // Valida o token com /auth/me — se válido, é um session token ativo
    await setToken(cookie.value);
    const me = await request('/auth/me');
    if (!me.ok || !me.data) {
      await clearAuth();
      return { ok: false, reason: 'cookie_invalid' };
    }
    await chrome.storage.local.set({ [STORAGE_KEYS.USER_INFO]: me.data });
    return { ok: true, user: me.data };
  } catch (err) {
    return { ok: false, reason: err.message || 'sso_error' };
  }
}

async function request(path, { method = 'GET', body = null, auth = true, signal = null } = {}) {
  const headers = { 'Content-Type': 'application/json' };
  if (auth) {
    const token = await getToken();
    if (token) headers['Authorization'] = `Bearer ${token}`;
  }
  const opts = { method, headers, signal };
  if (body != null) opts.body = JSON.stringify(body);

  const r = await fetch(API_BASE + path, opts);
  let data;
  try { data = await r.json(); }
  catch (_) { data = null; }

  if (r.status === 401) {
    await clearAuth();
  }
  return { ok: r.ok, status: r.status, data };
}

// ── Auth ────────────────────────────────────────────────────────────────────
// Login no ScaleReels com email+senha. Se sucesso, salva token + user info.
export async function login(email, password) {
  const r = await request('/auth/login', { method: 'POST', body: { email, password }, auth: false });
  if (r.ok && r.data?.token) {
    await setToken(r.data.token);
    if (r.data.user) {
      await chrome.storage.local.set({ [STORAGE_KEYS.USER_INFO]: r.data.user });
    }
  }
  return r;
}

export async function logout() {
  await clearAuth();
}

export async function getMe() {
  // Pega info do user logado (inclui plan_status, plan, has_addon_tools, role).
  // Cacheado em chrome.storage pra uso offline rápido.
  const r = await request('/auth/me');
  if (r.ok && r.data) {
    await chrome.storage.local.set({ [STORAGE_KEYS.USER_INFO]: r.data });
  }
  return r;
}

export async function getCachedUser() {
  const stored = await chrome.storage.local.get(STORAGE_KEYS.USER_INFO);
  return stored[STORAGE_KEYS.USER_INFO] || null;
}

// ── Extensão-specific ──────────────────────────────────────────────────────

// Retorna quota atual: { tiktok: { used, limit }, instagram: { used, limit },
//                       unlimited: bool, plan: 'free'|'instascheduler'|'extension_only' }
export async function getQuota() {
  return request('/extension/quota');
}

// Avisa o backend que um vídeo vai ser baixado. Backend incrementa contador,
// rejeita com 429 se o user já bateu o limite free do dia.
// platform: 'tiktok' | 'instagram'
// source_url: URL pública do vídeo (pra dedup futuro)
export async function reserveDownload(platform, source_url, metadata = {}) {
  return request('/extension/reserve', {
    method: 'POST',
    body: { platform, source_url, metadata }
  });
}

// Notifica que um vídeo foi importado com sucesso no Drive do user.
// Backend pode usar isso pra disparar auto-agendamento se a conta destino tiver schedule ativo.
export async function notifyImported(payload) {
  return request('/extension/notify-imported', { method: 'POST', body: payload });
}

// Lista presets de moldura e watermark do user. Esses endpoints vivem no backend
// do TikTok Monitor (Python), e o ScaleReels proxia em /api/tiktokmon/*.
// Requer que o user tenha has_addon_tools=true (plano Pro, Anual, ou extension_only).
export async function listFramePresets() {
  return request('/tiktokmon/preferences/frames');
}

export async function listWatermarkPresets() {
  return request('/tiktokmon/preferences/watermarks');
}

// ── Checkout / Billing ─────────────────────────────────────────────────
// Cria uma cobrança PIX pro plano dado. Retorna { pix_code, identifier,
// subscription_id, amount, plan_name }. Backend deduz user pelo JWT.
export async function createCheckout(plan_id) {
  return request('/subscriptions/checkout', { method: 'POST', body: { plan_id, with_addon: false } });
}

// Polling: backend consulta SyncPay e devolve { status: 'pending'|'active'|'cancelled' }.
// Não exige auth (subscription_id já é UUID opaco, igual o painel web faz).
export async function getCheckoutStatus(subscription_id) {
  return request(`/subscriptions/status/${encodeURIComponent(subscription_id)}`, { auth: false });
}
