<?php
/**
 * Usage:
 *   php c:\Projets\cron\scan_cdn_cards_batch.php --sets OGN --from 1 --to 30 --chunk 5 --extra "llm=1&printAI=1"
 *
 * Conseils:
 *   - Adapter --chunk pour que chaque sous-plage finisse sans time-out (ex: 5).
 *   - Planifier via cron/Task Scheduler. Ex: * /10 * * * * php -d max_execution_time=0 c:\Projets\cron\scan_cdn_cards_batch.php --sets OGN --from 1 --to 120 --chunk 10 --extra "llm=1&printAI=1"
 */

set_time_limit(0);
ini_set('default_socket_timeout', '60');

function args(): array {
	$out = [];
	foreach (array_slice($_SERVER['argv'] ?? [], 1) as $a) {
		if (preg_match('/^--([^=]+)=(.*)$/', $a, $m)) {
			$out[$m[1]] = $m[2];
		} elseif (strpos($a, '--') === 0) {
			$out[substr($a, 2)] = true;
		}
	}
	return $out;
}

$opt = args();
$baseUrl = 'https://riftcollect.yannickruault.fr/cron/scan_cdn_cards.php';

$sets  = $opt['sets']  ?? null;
$from  = isset($opt['from']) ? (int)$opt['from'] : null;
$to    = isset($opt['to'])   ? (int)$opt['to']   : null;
$chunk = isset($opt['chunk'])? max(1,(int)$opt['chunk']) : 5;
$extra = $opt['extra'] ?? ''; // ex: "llm=1&printAI=1"

if (!$sets || $from === null || $to === null || $from > $to) {
	fwrite(STDERR, "Params manquants ou invalides. Ex: --sets OGN --from 1 --to 30 --chunk 5 --extra \"llm=1&printAI=1\"\n");
	exit(2);
}

function callUrl(string $url, int $timeout = 120, int $retries = 2): bool {
	$attempt = 0;
	do {
		$attempt++;
		$ch = curl_init($url);
		curl_setopt_array($ch, [
			CURLOPT_RETURNTRANSFER => true,
			CURLOPT_FOLLOWLOCATION => true,
			CURLOPT_CONNECTTIMEOUT => 10,
			CURLOPT_TIMEOUT => $timeout,
			CURLOPT_USERAGENT => 'scan-batch-runner/1.0',
			CURLOPT_HTTPHEADER => ['Accept: text/plain, */*'],
		]);
		$body = curl_exec($ch);
		$err  = curl_error($ch);
		$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
		curl_close($ch);

		if ($err) {
			fwrite(STDERR, "[WARN] cURL error: $err (attempt $attempt)\n");
		} elseif ($code >= 200 && $code < 300) {
			if ($body !== false) {
				echo rtrim(substr($body, 0, 4000))."\n";
			}
			return true;
		} else {
			fwrite(STDERR, "[WARN] HTTP $code (attempt $attempt)\n");
		}

		if ($attempt <= $retries) {
			sleep(min(5 * $attempt, 15)); // backoff
		}
	} while ($attempt <= $retries);

	return false;
}

$okAll = true;
for ($start = $from; $start <= $to; $start += $chunk) {
	$end = min($to, $start + $chunk - 1);
	$query = http_build_query([
		'sets'  => $sets,
		'range' => "{$start}-{$end}",
	]) . ($extra ? "&{$extra}" : '');
	$url = "{$baseUrl}?{$query}";

	echo "[INFO] Appel: $url\n";
	$ok = callUrl($url);
	if (!$ok) {
		$okAll = false;
		fwrite(STDERR, "[ERROR] Echec sur la sous-plage {$start}-{$end}\n");
		// On continue pour traiter un max de sous-plages
	}
	// Petite pause pour soulager le serveur/CDN
	usleep(300000); // 300ms
}

exit($okAll ? 0 : 1);