<?php
require_once __DIR__ . '/../config/bootstrap.php';
require_method('POST');

$pdo = db();
$data = get_json_body();
$token = trim((string)($data['token'] ?? ''));
$nome = trim((string)($data['nome'] ?? ''));
$img64 = (string)($data['imagem_base64'] ?? '');

if ($token === '' || $nome === '' || $img64 === '') {
  json_response(['ok'=>false,'error'=>'Dados incompletos.'], 422);
}

// evento publicado
$st = $pdo->prepare("SELECT * FROM eventos WHERE token_publico=? AND status='published' LIMIT 1");
$st->execute([$token]);
$ev = $st->fetch();
if (!$ev) json_response(['ok'=>false,'error'=>'Evento não encontrado ou não publicado.'], 404);

$cfg = json_decode($ev['config_json'], true);
$maxChars = (int)(($cfg['constraints']['nome_max_chars'] ?? 26));
if (mb_strlen($nome) > $maxChars) {
  json_response(['ok'=>false,'error'=>'Nome acima do limite.'], 422);
}

// client id por cookie
$cookieName = 'fb_client_key';
$clientKey = $_COOKIE[$cookieName] ?? '';
if (!is_string($clientKey) || $clientKey === '' || strlen($clientKey) < 8) {
  $clientKey = bin2hex(random_bytes(16));
  setcookie($cookieName, $clientKey, time() + 60*60*24*365, '/', '', (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off'), true);
}

// upsert cliente
$stC = $pdo->prepare('SELECT id FROM clientes WHERE client_key=? LIMIT 1');
$stC->execute([$clientKey]);
$rowC = $stC->fetch();
if (!$rowC) {
  $stI = $pdo->prepare('INSERT INTO clientes (client_key, nome, created_at, updated_at) VALUES (?,?,NOW(),NOW())');
  $stI->execute([$clientKey, $nome]);
  $clienteId = (int)$pdo->lastInsertId();
} else {
  $clienteId = (int)$rowC['id'];
  $stU = $pdo->prepare('UPDATE clientes SET nome=?, updated_at=NOW() WHERE id=?');
  $stU->execute([$nome, $clienteId]);
}

// extrair base64
if (strpos($img64, 'data:image/png;base64,') === 0) {
  $img64 = substr($img64, strlen('data:image/png;base64,'));
} elseif (strpos($img64, 'data:image/') === 0) {
  // aceita mas convertemos somente se for png base64
  $pos = strpos($img64, 'base64,');
  if ($pos !== false) $img64 = substr($img64, $pos + 7);
}

$bin = base64_decode($img64, true);
if ($bin === false) {
  json_response(['ok'=>false,'error'=>'Imagem inválida.'], 422);
}

$ym = date('Ym');
$dirRel = '/storage/frames/' . $ym;
$dirAbs = __DIR__ . '/..' . $dirRel;
ensure_dir($dirAbs);

$fname = 'frame-' . (int)$ev['id'] . '-' . $clienteId . '-' . date('YmdHis') . '-' . uuid16() . '.png';
$relPath = $dirRel . '/' . $fname;
$absPath = __DIR__ . '/..' . $relPath;

$written = @file_put_contents($absPath, $bin);
if ($written === false) {
  json_response(['ok'=>false,'error'=>'Falha ao salvar a imagem no servidor (permissão/pasta).'], 500);
}

if ($written === false) {
  json_response(['ok'=>false,'error'=>'Falha ao salvar a imagem no servidor (permissão/pasta).'], 500);
}

// upsert frame (1 por evento/cliente)
$stF = $pdo->prepare('SELECT id, arquivo FROM frames WHERE evento_id=? AND cliente_id=? LIMIT 1');
$stF->execute([(int)$ev['id'], $clienteId]);
$rowF = $stF->fetch();

if (!$rowF) {
  $stI = $pdo->prepare('INSERT INTO frames (evento_id, cliente_id, arquivo, created_at) VALUES (?,?,?,NOW())');
  $stI->execute([(int)$ev['id'], $clienteId, $relPath]);
} else {
  // substitui
  $stU = $pdo->prepare('UPDATE frames SET arquivo=?, created_at=NOW() WHERE id=?');
  $stU->execute([$relPath, (int)$rowF['id']]);
  $old = (string)$rowF['arquivo'];
  if ($old && file_exists(__DIR__ . '/..' . $old)) {
    @unlink(__DIR__ . '/..' . $old);
  }
}

json_response([
  'ok' => true,
  'arquivo_rel' => $relPath,
  // URL já corrigida para subpasta (ex.: /frameBuilder/v2-1-fix/storage/frames/...)
  'arquivo_url' => build_url_path($relPath),
]);
