<?php
declare(strict_types=1);

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

$data = input_json();
$idUsuario = (int) ($data['id_usuario'] ?? 0);
$tipoUsuario = push_tipo_usuario((string) ($data['tipo_usuario'] ?? $data['tipo'] ?? ''));
$token = trim((string) ($data['token'] ?? ''));
$plataforma = push_plataforma((string) ($data['plataforma'] ?? 'android'));
$app = trim((string) ($data['app'] ?? ''));

if ($idUsuario <= 0) {
    json_fail('Usuario invalido.');
}

if ($token === '') {
    json_fail('Token de notificacao ausente.');
}

try {
    push_usuario_existe(db(), $idUsuario, $tipoUsuario);

    $stmt = db()->prepare(
        'INSERT INTO push_tokens (id_usuario, tipo_usuario, token, plataforma, app, ativo)
         VALUES (?, ?, ?, ?, ?, 1)
         ON DUPLICATE KEY UPDATE
            id_usuario = VALUES(id_usuario),
            tipo_usuario = VALUES(tipo_usuario),
            plataforma = VALUES(plataforma),
            app = VALUES(app),
            ativo = 1,
            atualizado_em = CURRENT_TIMESTAMP'
    );
    $stmt->execute([
        $idUsuario,
        $tipoUsuario,
        $token,
        $plataforma,
        $app !== '' ? $app : null,
    ]);

    json_ok(['message' => 'Token registrado.']);
} catch (Throwable $e) {
    json_fail('Erro ao registrar token de notificacao.', 500, ['error' => $e->getMessage()]);
}

function push_tipo_usuario(string $tipo): string
{
    return $tipo === 'passageiro' ? 'passageiro' : 'motorista';
}

function push_plataforma(string $plataforma): string
{
    return in_array($plataforma, ['android', 'ios', 'web'], true) ? $plataforma : 'android';
}

function push_usuario_existe(PDO $pdo, int $idUsuario, string $tipoUsuario): void
{
    $stmt = $pdo->prepare('SELECT id FROM usuarios WHERE id = ? AND tipo = ? LIMIT 1');
    $stmt->execute([$idUsuario, $tipoUsuario]);

    if (!$stmt->fetch()) {
        json_fail('Usuario nao encontrado para este tipo de app.', 404);
    }
}
