<?php
declare(strict_types=1);

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

$data = input_json();
$idMotorista = (int) ($data['id_motorista'] ?? ($_GET['id_motorista'] ?? 0));
$disponivel = trim((string) ($data['disponivel'] ?? ($_GET['disponivel'] ?? '')));

if ($idMotorista <= 0) {
    json_fail('Motorista nao informado.');
}

if (!in_array($disponivel, ['sim', 'nao'], true)) {
    json_fail('Valor de disponibilidade invalido.');
}

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

    $stmt = $pdo->prepare(
        'SELECT u.tipo, u.cnh_status, u.documento_veiculo_status, u.selfie_status,
                u.disponivel,
                EXISTS(SELECT 1 FROM veiculos v WHERE v.id_motorista = u.id AND v.status = "aprovado") AS tem_veiculo_aprovado
         FROM usuarios u
         WHERE u.id = ? LIMIT 1'
    );
    $stmt->execute([$idMotorista]);
    $motorista = $stmt->fetch();

    if (!$motorista || $motorista['tipo'] !== 'motorista') {
        json_fail('Motorista nao encontrado.', 404);
    }

    if (!motorista_pode_ficar_online($motorista) && $disponivel === 'sim') {
        json_fail('Motorista ainda nao tem todos os documentos aprovados para ficar disponivel.', 403, [
            'cnh_status' => $motorista['cnh_status'] ?? 'pendente',
            'documento_veiculo_status' => $motorista['documento_veiculo_status'] ?? 'pendente',
            'selfie_status' => $motorista['selfie_status'] ?? 'pendente',
            'tem_veiculo_aprovado' => (bool) ($motorista['tem_veiculo_aprovado'] ?? false),
        ]);
    }

    $pdo->beginTransaction();

    $statusAnterior = (string) ($motorista['disponivel'] ?? 'nao');

    if ($disponivel === 'sim' && $statusAnterior !== 'sim') {
        $abreSessao = $pdo->prepare(
            'INSERT INTO motorista_sessoes_online (id_motorista, inicio_em)
             SELECT ?, NOW()
             WHERE NOT EXISTS (
                SELECT 1
                FROM motorista_sessoes_online
                WHERE id_motorista = ? AND fim_em IS NULL
             )'
        );
        $abreSessao->execute([$idMotorista, $idMotorista]);
    }

    if ($disponivel === 'nao') {
        $fechaSessao = $pdo->prepare(
            'UPDATE motorista_sessoes_online
             SET fim_em = NOW(),
                 duracao_segundos = GREATEST(0, TIMESTAMPDIFF(SECOND, inicio_em, NOW()))
             WHERE id_motorista = ?
               AND fim_em IS NULL'
        );
        $fechaSessao->execute([$idMotorista]);
    }

    $up = $pdo->prepare('UPDATE usuarios SET disponivel = ? WHERE id = ?');
    $up->execute([$disponivel, $idMotorista]);

    motorista_atualizar_localizacao($idMotorista, $data + $_GET);

    $pdo->commit();

    json_ok([
        'disponivel' => $disponivel,
        'tipo_convertido_motorista' => $promocao['foi_promovido'],
        'indicador_removido' => $promocao['indicador_removido'],
    ]);
} catch (Throwable $e) {
    if (isset($pdo) && $pdo->inTransaction()) {
        $pdo->rollBack();
    }
    json_fail('Erro ao atualizar disponibilidade.', 500, ['error' => $e->getMessage()]);
}
