<?php
require_once __DIR__ . '/../../_bootstrap.php';
require_once ROOT_PATH . '/includes/match_functions.php';
require_once ROOT_PATH . '/includes/viral_functions.php';
if ($_SERVER['REQUEST_METHOD'] !== 'POST') jsonResponse(['ok'=>false,'erro'=>'Método não permitido.'],405);
afValidarCsrfApi();
$d = requestJson();
$controlledEventId=max(0,(int)($d['controlled_event_id']??0));
$u = afApiOuSessaoUsuario($pdo,$controlledEventId>0?'controlled_event_farm':'farm',$controlledEventId>0?['controlled_event_id'=>$controlledEventId]:[]);
try {
    $batalhaId = max(0,(int)($d['batalha_id'] ?? 0));
    $competicaoId = max(0,(int)($d['competicao_id'] ?? 0));
    $modo = sanitize((string)($d['modo'] ?? 'individual'));
    if($controlledEventId>0){$batalhaId=0;$competicaoId=0;$modo='evento';}
    $viralToken = strtolower(preg_replace('/[^a-f0-9]/','',(string)($d['viral_token'] ?? '')));
    if ($controlledEventId>0 && $viralToken!=='') throw new RuntimeException('Desafios virais não são permitidos em eventos infantis.');
    if ($viralToken !== '') {
        $desafio = afBuscarDesafioViral($pdo,$viralToken);
        if (!$desafio || $desafio['status'] !== 'aceito' || (int)($desafio['convidado_id'] ?? 0) !== (int)$u['id']) throw new RuntimeException('Desafio viral inválido ou indisponível para sua conta.');
        if (!empty($desafio['partida_resposta_id'])) throw new RuntimeException('Este desafio já está vinculado a uma partida.');
    }
    $p = afIniciarPartida($pdo,(int)$u['id'],(int)$u['dispositivo_id'],sanitize((string)($d['fingerprint']??'')),$batalhaId,$competicaoId,$modo,$controlledEventId);
    if (strlen($viralToken) === 20) {
        afVincularDesafioViralPartida($pdo,$viralToken,(int)$u['id'],(int)$p['id']);
        $st=$pdo->prepare('SELECT * FROM af_partidas WHERE id=?');$st->execute([(int)$p['id']]);$p=$st->fetch()?:$p;
    }
    jsonResponse(['ok'=>true,'partida'=>afPartidaPublica($p,$pdo)]);
} catch (Throwable $e) { jsonResponse(['ok'=>false,'erro'=>$e->getMessage()],422); }
