<?php
// public/api/upload.php
require_once __DIR__ . '/../../app/config.php';
require_once __DIR__ . '/../../app/db.php';
require_once __DIR__ . '/../../app/helpers.php';

// Tenta carregar app/storage.php (caminho esperado) e, se não existir, app/app/storage.php
$storageMain = __DIR__ . '/../../app/storage.php';
$storageAlt  = __DIR__ . '/../../app/app/storage.php';
if (file_exists($storageMain)) {
  require_once $storageMain;
} elseif (file_exists($storageAlt)) {
  require_once $storageAlt;
} else {
  http_response_code(500);
  echo json_encode(['ok'=>false,'error'=>'storage.php não encontrado']); exit;
}

header('Content-Type: application/json; charset=utf-8');

function jexit(array $p, int $s=200){ http_response_code($s); echo json_encode($p); exit; }

if (empty($_SESSION['user']['id']) || empty($_SESSION['user']['email'])) {
  jexit(['ok'=>false,'error'=>'Não autenticado'], 401);
}

$pdo = db();

/** Igual padrão dos outros endpoints: garante users.id (UUID) a partir da sessão */
function getOrCreateUsersId(PDO $pdo, string $sessionId, string $email, ?string $name = null): string {
  $q = $pdo->prepare('SELECT id FROM users WHERE email = :e LIMIT 1');
  $q->execute([':e'=>$email]);
  $id = $q->fetchColumn();
  if ($id) return $id;

  $ins = $pdo->prepare('INSERT INTO users (id,email,name) VALUES (:id,:e,:n) ON CONFLICT (email) DO NOTHING');
  $ins->execute([':id'=>$sessionId, ':e'=>$email, ':n'=>$name]);

  $q->execute([':e'=>$email]);
  $id = $q->fetchColumn();
  if (!$id) throw new RuntimeException('Falha ao sincronizar usuário em `users`.');
  return $id;
}

$authId    = $_SESSION['user']['id'];
$authEmail = $_SESSION['user']['email'];
$authName  = $_SESSION['user']['name'] ?? null;
$userId    = getOrCreateUsersId($pdo, $authId, $authEmail, $authName);

// kind: imagem | audio | pdf | video | file (fallback)
$kind = $_POST['kind'] ?? 'file';
$accept = [
  'imagem' => ['image/jpeg','image/png','image/webp','image/gif'],
  'audio'  => ['audio/mpeg','audio/ogg','audio/wav','audio/x-wav','audio/mp4','audio/aac'],
  'pdf'    => ['application/pdf'],
  'video'  => ['video/mp4','video/webm','video/ogg'],
  'file'   => ['*/*'],
];

// valida upload
if (empty($_FILES['file']) || $_FILES['file']['error'] !== UPLOAD_ERR_OK) {
  jexit(['ok'=>false,'error'=>'Arquivo não enviado'], 422);
}

// limites
$maxBytes = 50 * 1024 * 1024; // 50MB
if (($_FILES['file']['size'] ?? 0) > $maxBytes) {
  jexit(['ok'=>false,'error'=>'Arquivo muito grande (máx 50MB)'], 413);
}

// detecta mime real
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mime  = $finfo->file($_FILES['file']['tmp_name']) ?: ($_FILES['file']['type'] ?? 'application/octet-stream');

// confere se é permitido
$allowed = $accept[$kind] ?? $accept['file'];
if ($allowed[0] !== '*/*' && !in_array($mime, $allowed, true)) {
  jexit(['ok'=>false,'error'=>'Tipo de arquivo não permitido: '.$mime], 415);
}

// monta path no bucket: USER_ID/YYYY/MM/uniq-slug.ext
$orig = $_FILES['file']['name'] ?? 'file.bin';
$ext  = strtolower(pathinfo($orig, PATHINFO_EXTENSION));
$slug = preg_replace('~[^a-z0-9]+~i','-', pathinfo($orig, PATHINFO_FILENAME));
$slug = trim($slug, '-') ?: 'arquivo';
$uniq = bin2hex(random_bytes(4));
$path = $userId . '/' . date('Y/m/') . $uniq . '-' . $slug . ($ext ? '.'.$ext : '');

// envia ao Storage (upsert)
$up = supa_storage_upload(SUPABASE_BUCKET_FUNIL, $path, $_FILES['file']['tmp_name'], $mime);
if (!$up['ok']) {
  jexit(['ok'=>false,'error'=>'Falha ao enviar','details'=>$up], 500);
}

// Se o bucket for PUBLIC, esta URL já funciona.
// Se for PRIVATE, você pode ignorar a public_url e usar `signed_url` abaixo.
$publicUrl = supa_storage_public_url(SUPABASE_BUCKET_FUNIL, $path);

// Tenta também gerar URL assinada (útil se bucket for PRIVATE)
$signed = supa_storage_sign_url(SUPABASE_BUCKET_FUNIL, $path, 3600);
$signedUrl = $signed['ok'] ? $signed['url'] : null;

jexit([
  'ok'         => true,
  'path'       => $path,       // guarde isto no banco se quiser assinar depois
  'mime'       => $mime,
  'public_url' => $publicUrl,  // funciona se bucket PUBLIC
  'signed_url' => $signedUrl   // útil se bucket PRIVATE (TTL 1h)
]);
