<?php
/**
 * api/device/config.php — POST /api/device/config
 *
 * Llamada de arranque de la app. Hace upsert del dispositivo por MAC y
 * devuelve la config COMPLETA según el contrato.
 *
 * Request:  { "mac", "device_id", "model", "app_version" }
 * Response: ver API_CONTRACT.md §"/api/device/config".
 */

declare(strict_types=1);

require_once __DIR__ . '/../../lib/helpers.php';
require_once __DIR__ . '/../../lib/device.php';

// Solo POST.
if (($_SERVER['REQUEST_METHOD'] ?? 'GET') !== 'POST') {
    json_out(['error' => 'method_not_allowed'], 405);
}

$body = read_json_body();

// Validación de la MAC (identidad obligatoria).
$mac = normalize_mac(isset($body['mac']) ? (string) $body['mac'] : null);
if ($mac === null) {
    json_out(['error' => 'mac_invalid'], 400);
}

// Campos opcionales (saneados a string corto).
$deviceId   = clean_str($body['device_id']  ?? null, 191);
$model      = clean_str($body['model']       ?? null, 191);
$appVersion = clean_str($body['app_version'] ?? null, 32);

try {
    $device = device_find_by_mac($mac);

    if ($device === null) {
        // Primer contacto: crear con device_key generado y defaults.
        $device = device_create($mac, $deviceId, $model, $appVersion);
    } else {
        // Contacto posterior: actualizar metadatos.
        device_touch((int) $device['id'], $model, $deviceId, $appVersion);
        // Recargar para reflejar los cambios.
        $device = device_find_by_mac($mac) ?? $device;
    }

    json_out(build_device_config($device), 200);
} catch (Throwable $ex) {
    // Nunca filtrar el detalle SQL al cliente.
    error_log('[api/device/config] ' . $ex->getMessage());
    json_out(['error' => 'server_error'], 500);
}

/**
 * Sanea un valor a string recortado (o null si vacío).
 *
 * @param mixed $value
 */
function clean_str($value, int $max): ?string
{
    if ($value === null) {
        return null;
    }
    $s = trim((string) $value);
    if ($s === '') {
        return null;
    }
    return mb_substr($s, 0, $max);
}
