<?php
declare(strict_types=1);

require_once __DIR__ . '/../config/helpers.php';

function passageiro_doc_fail(string $message, int $status = 400, array $payload = []): void
{
    json_fail($message, $status, $payload);
}

function passageiro_doc_upload(string $field, string $prefix, int $idPassageiro): string
{
    if (!isset($_FILES[$field]) || !is_uploaded_file($_FILES[$field]['tmp_name'])) {
        passageiro_doc_fail('Arquivo nao informado.');
    }

    $uploadDir = public_upload_path('passageiros');
    $original = basename((string) $_FILES[$field]['name']);
    $safeName = preg_replace('/[^a-zA-Z0-9._-]/', '_', $original);
    $filename = $prefix . '_' . $idPassageiro . '_' . time() . '_' . $safeName;
    $target = $uploadDir . '/' . $filename;

    if (!move_uploaded_file($_FILES[$field]['tmp_name'], $target)) {
        passageiro_doc_fail('Falha ao salvar arquivo.', 500);
    }

    return 'uploads/passageiros/' . $filename;
}

function passageiro_doc_payload(array $usuario): array
{
    $status = (string) ($usuario['passageiro_documento_status'] ?? 'nao_enviado');
    return [
        'status' => $status,
        'verificado' => $status === 'aprovado',
        'documento_url' => $usuario['passageiro_documento_url'] ?? null,
        'selfie_url' => $usuario['passageiro_documento_selfie_url'] ?? null,
        'observacao' => $usuario['passageiro_documento_observacao'] ?? null,
        'aprovado_por' => $usuario['passageiro_documento_aprovado_por'] ?? null,
        'aprovado_em' => $usuario['passageiro_documento_aprovado_em'] ?? null,
    ];
}

$method = $_SERVER['REQUEST_METHOD'] ?? 'GET';
$data = $method === 'POST' ? $_POST : $_GET;
$idPassageiro = (int) ($data['id_passageiro'] ?? $data['id_usuario'] ?? 0);

if ($idPassageiro <= 0) {
    passageiro_doc_fail('Passageiro nao informado.');
}

try {
    $pdo = db();
    $stmt = $pdo->prepare(
        'SELECT id, tipo, passageiro_documento_url, passageiro_documento_selfie_url,
                passageiro_documento_status, passageiro_documento_observacao,
                passageiro_documento_aprovado_por, passageiro_documento_aprovado_em
         FROM usuarios
         WHERE id = ?
         LIMIT 1'
    );
    $stmt->execute([$idPassageiro]);
    $usuario = $stmt->fetch();
    if (!$usuario) {
        passageiro_doc_fail('Passageiro nao encontrado.', 404);
    }

    if ($method !== 'POST') {
        json_ok(['documentos' => passageiro_doc_payload($usuario)]);
    }

    $tipo = trim((string) ($_POST['tipo_documento'] ?? ''));
    if (!in_array($tipo, ['documento', 'selfie'], true)) {
        passageiro_doc_fail('Tipo de documento invalido.');
    }

    $arquivo = passageiro_doc_upload('arquivo', $tipo, $idPassageiro);
    $campo = $tipo === 'documento' ? 'passageiro_documento_url' : 'passageiro_documento_selfie_url';

    $up = $pdo->prepare(
        "UPDATE usuarios
         SET {$campo} = ?,
             passageiro_documento_status = 'pendente',
             passageiro_documento_observacao = NULL,
             passageiro_documento_aprovado_por = NULL,
             passageiro_documento_aprovado_em = NULL
         WHERE id = ?"
    );
    $up->execute([$arquivo, $idPassageiro]);

    $stmt->execute([$idPassageiro]);
    $atualizado = $stmt->fetch();

    json_ok([
        'arquivo' => $arquivo,
        'documentos' => passageiro_doc_payload($atualizado),
        'message' => 'Documento enviado para revisao.',
    ]);
} catch (Throwable $e) {
    passageiro_doc_fail('Erro ao processar documentos.', 500, ['error' => $e->getMessage()]);
}
