<?php
declare(strict_types=1);

require_once __DIR__ . '/_bootstrap.php';
admin_require_login();

function admin_normalizar_placa_veiculo(string $placa): string
{
    return strtoupper((string) preg_replace('/[^A-Za-z0-9]/', '', $placa));
}

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    header('Location: pendentes_documentos.php');
    exit;
}

$id = (int) ($_POST['id_veiculo'] ?? 0);
$acao = trim((string) ($_POST['acao'] ?? ''));
$obs = trim((string) ($_POST['observacao'] ?? ''));
$marca = trim((string) ($_POST['marca'] ?? ''));
$modelo = trim((string) ($_POST['modelo'] ?? ''));
$anoFabricacao = (int) ($_POST['ano_fabricacao'] ?? 0);
$anoModelo = (int) ($_POST['ano_modelo'] ?? 0);
$cor = trim((string) ($_POST['cor'] ?? ''));
$placa = admin_normalizar_placa_veiculo((string) ($_POST['placa'] ?? ''));
$vencimento = trim((string) ($_POST['vencimento'] ?? ''));

if ($id <= 0 || ($acao !== 'aprovar' && $acao !== 'reprovar')) {
    admin_flash('Dados inválidos para revisão do veículo.', 'error');
    header('Location: pendentes_documentos.php');
    exit;
}

$veiculo = admin_buscar_veiculo_por_id($id);
if (!$veiculo) {
    admin_flash('Veículo não encontrado.', 'error');
    header('Location: pendentes_documentos.php');
    exit;
}

if ($acao === 'reprovar' && $obs === '') {
    admin_flash('Informe observação para reprovar.', 'error');
    header('Location: pendentes_documentos.php');
    exit;
}

$anoAtual = (int) date('Y');
if ($acao === 'aprovar') {
    if ($marca === '' || $modelo === '' || $anoFabricacao <= 0 || $anoModelo <= 0 || $cor === '' || $placa === '' || $vencimento === '') {
        admin_flash('Preencha marca, modelo, anos, cor, placa e vencimento ao aprovar.', 'error');
        header('Location: pendentes_documentos.php');
        exit;
    }

    if (!preg_match('/^[A-Z]{3}[0-9][A-Z0-9][0-9]{2}$/', $placa)) {
        admin_flash('Informe uma placa valida.', 'error');
        header('Location: pendentes_documentos.php');
        exit;
    }

    if ($anoFabricacao < ($anoAtual - 12) || $anoFabricacao > $anoAtual) {
        admin_flash('Veículo precisa ter no máximo 12 anos de fabricação.', 'error');
        header('Location: pendentes_documentos.php');
        exit;
    }

    $placaStmt = db()->prepare('SELECT id FROM veiculos WHERE placa = ? AND id <> ? LIMIT 1');
    $placaStmt->execute([$placa, $id]);
    if ($placaStmt->fetch()) {
        admin_flash('Já existe um veículo cadastrado com esta placa.', 'error');
        header('Location: pendentes_documentos.php');
        exit;
    }
}

try {
    $stmt = db()->prepare(
        'UPDATE veiculos
         SET marca = ?, modelo = ?, ano_fabricacao = ?, ano_modelo = ?, cor = ?, placa = ?, status = ?, observacao_revisao = ?, documento_vencimento = ?, aprovado_por = ?, aprovado_em = ?
         WHERE id = ?'
    );
    $stmt->execute([
        $acao === 'aprovar' ? $marca : ($veiculo['marca'] ?? null),
        $acao === 'aprovar' ? $modelo : ($veiculo['modelo'] ?? null),
        $acao === 'aprovar' ? $anoFabricacao : ($veiculo['ano_fabricacao'] ?? null),
        $acao === 'aprovar' ? $anoModelo : ($veiculo['ano_modelo'] ?? null),
        $acao === 'aprovar' ? $cor : ($veiculo['cor'] ?? null),
        $acao === 'aprovar' ? $placa : ($veiculo['placa'] ?? null),
        $acao === 'aprovar' ? 'aprovado' : 'reprovado',
        $acao === 'reprovar' ? $obs : null,
        $acao === 'aprovar' ? $vencimento : null,
        $acao === 'aprovar' ? admin_current_user() : null,
        $acao === 'aprovar' ? date('Y-m-d H:i:s') : null,
        $id,
    ]);

    $motorista = admin_buscar_motorista_por_id((int) $veiculo['id_motorista']);
    if ($motorista) {
        $veiculosStmt = db()->prepare(
            'SELECT COUNT(*) AS total, SUM(CASE WHEN status = "aprovado" THEN 1 ELSE 0 END) AS aprovados
             FROM veiculos
             WHERE id_motorista = ?'
        );
        $veiculosStmt->execute([(int) $veiculo['id_motorista']]);
        $veiculosInfo = $veiculosStmt->fetch() ?: ['aprovados' => 0];
        $temVeiculoAprovado = (int) ($veiculosInfo['aprovados'] ?? 0) > 0;

        $statusOperacional = motorista_status_operacional($motorista, $temVeiculoAprovado);
        $obsOperacional = $statusOperacional === 'aprovado'
            ? null
            : ($statusOperacional === 'reprovado'
                ? 'Um ou mais documentos foram reprovados.'
                : 'Aguardando revisao dos documentos.');

        $up = db()->prepare(
            'UPDATE usuarios
             SET documento_veiculo_status = ?, documento_veiculo_observacao = ?, documento_veiculo_vencimento = ?, documento_veiculo_aprovado_por = ?, documento_veiculo_aprovado_em = ?,
                 status_verificacao = ?, observacao_verificacao = ?, disponivel = CASE WHEN ? = "aprovado" THEN disponivel ELSE "nao" END
             WHERE id = ? AND tipo = "motorista"'
        );
        $up->execute([
            $acao === 'aprovar' ? 'aprovado' : 'reprovado',
            $acao === 'reprovar' ? $obs : null,
            $acao === 'aprovar' ? $vencimento : null,
            $acao === 'aprovar' ? admin_current_user() : null,
            $acao === 'aprovar' ? date('Y-m-d H:i:s') : null,
            $statusOperacional,
            $obsOperacional,
            $statusOperacional,
            (int) $veiculo['id_motorista'],
        ]);
    }

    admin_flash('Veículo revisado com sucesso.');
} catch (Throwable $e) {
    admin_flash('Erro ao revisar veículo.', 'error');
}

header('Location: pendentes_documentos.php');
exit;
