<?php
declare(strict_types=1);

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

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

$id = (int) ($_POST['id_motorista'] ?? 0);
$acao = trim((string) ($_POST['acao'] ?? ''));
$campo = trim((string) ($_POST['campo'] ?? ''));
$obs = trim((string) ($_POST['observacao'] ?? ''));
$vencimento = trim((string) ($_POST['vencimento'] ?? ''));

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

if ($campo === '') {
    admin_flash('Documento não informado.', 'error');
    header('Location: pendentes_documentos.php');
    exit;
}

$mapa = [
    'cnh_status' => ['obs' => 'cnh_observacao', 'aprovado_por' => 'cnh_aprovado_por', 'aprovado_em' => 'cnh_aprovado_em', 'vencimento' => 'cnh_vencimento', 'label' => 'CNH'],
    'selfie_status' => ['obs' => 'selfie_observacao', 'aprovado_por' => 'selfie_aprovado_por', 'aprovado_em' => 'selfie_aprovado_em', 'vencimento' => null, 'label' => 'Foto de rosto'],
];

if (!isset($mapa[$campo])) {
    admin_flash('Documento inválido.', '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;
}

if ($campo === 'cnh_status' && $acao === 'aprovar' && $vencimento === '') {
    admin_flash('Informe a data de vencimento da CNH ao aprovar.', 'error');
    header('Location: pendentes_documentos.php');
    exit;
}

$status = $acao === 'aprovar' ? 'aprovado' : 'reprovado';
$campoObs = $mapa[$campo]['obs'];
$campoAprovadoPor = $mapa[$campo]['aprovado_por'];
$campoAprovadoEm = $mapa[$campo]['aprovado_em'];
$campoVencimento = $mapa[$campo]['vencimento'];

try {
    $set = "{$campo} = ?, {$campoObs} = ?";
    $params = [$status, $acao === 'reprovar' ? $obs : null];
    if ($campoAprovadoPor !== null && $campoAprovadoEm !== null) {
        if ($acao === 'aprovar') {
            $set .= ", {$campoAprovadoPor} = ?, {$campoAprovadoEm} = NOW()";
            $params[] = admin_current_user();
            if ($campoVencimento !== null) {
                $set .= ", {$campoVencimento} = ?";
                $params[] = $vencimento;
            }
        } else {
            $set .= ", {$campoAprovadoPor} = NULL, {$campoAprovadoEm} = NULL";
            if ($campoVencimento !== null) {
                $set .= ", {$campoVencimento} = NULL";
            }
        }
    }

    $stmt = db()->prepare(
        "UPDATE usuarios
         SET {$set}
         WHERE id = ? AND tipo = \"motorista\""
    );
    $params[] = $id;
    $stmt->execute($params);

    $motorista = admin_buscar_motorista_por_id($id);
    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([$id]);
        $veiculosInfo = $veiculosStmt->fetch() ?: ['aprovados' => 0];
        $statusGeral = motorista_status_operacional($motorista, (int) ($veiculosInfo['aprovados'] ?? 0) > 0);
        $obsGeral = $statusGeral === 'aprovado'
            ? null
            : ($statusGeral === 'reprovado'
                ? 'Um ou mais documentos foram reprovados.'
                : 'Aguardando revisao dos documentos.');

        $up = db()->prepare(
            'UPDATE usuarios
             SET status_verificacao = ?, observacao_verificacao = ?, disponivel = CASE WHEN ? = "aprovado" THEN disponivel ELSE "nao" END
             WHERE id = ? AND tipo = "motorista"'
        );
        $up->execute([$statusGeral, $obsGeral, $statusGeral, $id]);
    }

    admin_flash('Revisao atualizada com sucesso.');
} catch (Throwable $e) {
    admin_flash('Erro ao atualizar revisao.', 'error');
}

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