/**
 * Mobile-side pornxp.ph resolver.
 *
 * pornxp.ph serwuje fluidPlayer z bezpośrednimi `<source>` mp4 (360/720/1080p) na CDN
 * `st.pornxp.sh`. CDN token w ścieżce jest IP-bound do tego KTO POBRAŁ STRONĘ (potwierdzone
 * 2026-06-07: VPS-resolved URL → 403 cross-IP z hosta). Dlatego backend NIE może tego
 * zresolwować (związałby token z IP VPS → telefon 403), a WebView fallback dawał czarny
 * ekran (bug-report 2026-06-07, scena fd06cd86).
 *
 * Fix: telefon sam pobiera stronę (phone IP) → tokeny bound do IP telefonu → natywne
 * multi-quality playback bez WebView/reklam. Ten sam wzorzec co getfileResolver.ts /
 * doodstream.ts (resolve od strony, na urządzeniu).
 */
import type { StreamLink } from '../types';

const UA =
  'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36';

const _SOURCE_RE = /<source\b[^>]*\bsrc=['"]([^'"]+\.mp4[^'"]*)['"]/gi;

/** True dla page_url pornxp.ph (origin tube:pornxpph). */
export function isPornxpUrl(url: string | null | undefined): boolean {
  return !!url && /(?:^|\/\/|\.)pornxp\.ph\//i.test(url);
}

function qualityFromUrl(u: string): string {
  const m = u.match(/\/(\d{3,4})\.mp4/);
  return m ? `${m[1]}p` : 'auto';
}

/**
 * Pobiera pornxp.ph stronę NA TELEFONIE i wyciąga `<source>` mp4 jako StreamLink-i
 * (direct_url == stream_url == finalny CDN mp4; Referer w headers). Token jest
 * phone-IP-bound, więc gra direct bez proxy. Sort malejąco po jakości. Zwraca [] gdy
 * nic nie znaleziono (caller spada na backend/WebView).
 */
export async function resolvePornxpPage(pageUrl: string): Promise<StreamLink[]> {
  let html: string;
  try {
    const r = await fetch(pageUrl, { headers: { 'User-Agent': UA, Accept: 'text/html' } });
    if (!r.ok) return [];
    html = await r.text();
  } catch {
    return [];
  }
  const referer = (() => {
    try {
      return new URL(pageUrl).origin + '/';
    } catch {
      return 'https://pornxp.ph/';
    }
  })();
  const seen = new Set<string>();
  const links: StreamLink[] = [];
  let m: RegExpExecArray | null;
  _SOURCE_RE.lastIndex = 0;
  while ((m = _SOURCE_RE.exec(html)) !== null) {
    let u = m[1];
    if (u.startsWith('//')) u = 'https:' + u;
    if (seen.has(u)) continue;
    seen.add(u);
    links.push({
      // oba pola na ten sam CDN mp4: stream_url → przejście przez quality-picker
      // (filtr `!!stream_url`), direct_url → openAsVideo gra direct z Refererem.
      stream_url: u,
      direct_url: u,
      headers: { Referer: referer, 'User-Agent': UA },
      quality: qualityFromUrl(u),
      type: 'mp4',
    });
  }
  links.sort((a, b) => (parseInt(b.quality || '0', 10) || 0) - (parseInt(a.quality || '0', 10) || 0));
  return links;
}
