<?php
declare(strict_types=1);

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

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

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

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

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

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

$data = input_json();
$idMotorista = (int) ($data['id_motorista'] ?? ($_POST['id_motorista'] ?? 0));
$tipo = trim((string) ($data['tipo_documento'] ?? ($_POST['tipo_documento'] ?? '')));

if ($idMotorista <= 0 || !in_array($tipo, ['cnh', 'selfie'], true)) {
    doc_pessoal_fail('Dados invalidos.');
}

try {
    $pdo = db();
    $promocao = usuario_garantir_motorista($idMotorista, $pdo);

    $campoUrl = $tipo === 'cnh' ? 'cnh_url' : 'selfie_url';
    $campoStatus = $tipo === 'cnh' ? 'cnh_status' : 'selfie_status';
    $campoObs = $tipo === 'cnh' ? 'cnh_observacao' : 'selfie_observacao';
    $prefixo = $tipo;

    if (!isset($_FILES['arquivo']) || !is_uploaded_file($_FILES['arquivo']['tmp_name'])) {
        doc_pessoal_fail('Envie o arquivo.');
    }

    $arquivo = salvar_doc_pessoal_upload('arquivo', $prefixo, $idMotorista);

    $sql = "UPDATE usuarios
            SET {$campoUrl} = ?, {$campoStatus} = 'pendente', {$campoObs} = NULL";
    if ($tipo === 'cnh') {
        $sql .= ', cnh_aprovado_por = NULL, cnh_aprovado_em = NULL, cnh_vencimento = NULL';
    } else {
        $sql .= ', foto_url = ?, selfie_aprovado_por = NULL, selfie_aprovado_em = NULL';
    }
    $sql .= ', status_verificacao = "pendente", observacao_verificacao = "Aguardando revisao dos documentos.", disponivel = "nao" WHERE id = ? AND tipo = "motorista"';

    $up = $pdo->prepare($sql);
    $params = $tipo === 'selfie' ? [$arquivo, $arquivo, $idMotorista] : [$arquivo, $idMotorista];
    $up->execute($params);

    json_ok([
        'arquivo' => $arquivo,
        'tipo_convertido_motorista' => $promocao['foi_promovido'],
        'indicador_removido' => $promocao['indicador_removido'],
        'message' => 'Documento atualizado com sucesso.',
    ]);
} catch (Throwable $e) {
    doc_pessoal_fail('Erro ao atualizar documento.', 500, ['error' => $e->getMessage()]);
}
