<?php
/**
 * api/device/login.php — POST /api/device/login
 *
 * Registro por credenciales (modelo reseller). El PANEL NO verifica las
 * credenciales: la app pide la lista de DNS (GET /api/device/dns) y prueba
 * user/pass contra el Xtream (player_api.php) de cada uno hasta que uno
 * autentica (auth=1). Con ese DNS resuelto, la app llama aquí enviando el "url"
 * del DNS que autenticó; el panel solo REGISTRA el dispositivo + la playlist
 * (mac, user, pass, dns) y devuelve la config COMPLETA. El usuario nunca ve/teclea
 * una URL (el "url" es interno, viene de la propia lista que dio el panel).
 *
 * Request:  { "mac", "device_id", "model", "app_version", "username", "password", "url" }
 * Response (ok):        config completa (misma forma que /api/device/config).
 * Response (sin dns):   { "registered": false, "playlists": [], "error": "no_dns" } (HTTP 200).
 */

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();

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

// Credenciales obligatorias.
$username = trim((string) ($body['username'] ?? ''));
$password = trim((string) ($body['password'] ?? ''));
if ($username === '' || $password === '') {
    json_out(['registered' => false, 'playlists' => [], 'error' => 'invalid_credentials'], 200);
}

// Metadatos opcionales.
$deviceId   = login_clean_str($body['device_id']  ?? null, 191);
$model      = login_clean_str($body['model']       ?? null, 191);
$appVersion = login_clean_str($body['app_version'] ?? null, 32);

try {
    $pdo = db();

    // 1. Upsert del dispositivo por MAC (igual que config.php).
    $device = device_find_by_mac($mac);
    if ($device === null) {
        $device = device_create($mac, $deviceId, $model, $appVersion);
    } else {
        device_touch((int) $device['id'], $model, $deviceId, $appVersion);
        $device = device_find_by_mac($mac) ?? $device;
    }
    $deviceRowId = (int) $device['id'];

    // 2. El panel NO verifica credenciales: la app ya autenticó contra el Xtream
    //    del DNS que le dio dns.php y nos manda ese DNS en "url". Solo validamos
    //    que sea un DNS gestionado por el admin (no que las credenciales sirvan).
    $dnsUrl = trim((string) ($body['url'] ?? ''));
    if ($dnsUrl === '') {
        json_out(['registered' => false, 'playlists' => [], 'error' => 'no_dns'], 200);
    }
    $dnsOk = $pdo->prepare('SELECT 1 FROM dns WHERE url = ? LIMIT 1');
    $dnsOk->execute([$dnsUrl]);
    if ($dnsOk->fetchColumn() === false) {
        json_out(['registered' => false, 'playlists' => [], 'error' => 'no_dns'], 200);
    }

    // 3. Registrar dispositivo + vincular la playlist Xtream (dns url + credenciales
    //    que el usuario tecleó). Sin verificación de credenciales.
    $pdo->beginTransaction();

    bind_credential_to_device($deviceRowId, [
        'name'      => 'Mi Lista',
        'url'       => $dnsUrl,
        'username'  => $username,
        'password'  => $password,
        'protected' => false,
    ]);

    $upd = $pdo->prepare('UPDATE devices SET registered = 1, sub_trial = 0, locked = 0 WHERE id = ?');
    $upd->execute([$deviceRowId]);

    $pdo->commit();

    // 4. Recargar y devolver la config completa (incluye playlists[] y tmdb_key).
    $device = device_find_by_mac($mac) ?? $device;
    json_out(build_device_config($device), 200);
} catch (Throwable $ex) {
    if (isset($pdo) && $pdo->inTransaction()) {
        $pdo->rollBack();
    }
    error_log('[api/device/login] ' . $ex->getMessage());
    json_out(['error' => 'server_error'], 500);
}

/**
 * Sanea un valor a string recortado (o null si vacío).
 *
 * @param mixed $value
 */
function login_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);
}
