<?php
/**
 * /api/lab/ciudades.php
 * GET  ?action=list [solo_activas=1]  → lista ciudades
 * POST {action:save, id?, nombre}     → crear / renombrar
 * POST {action:toggle, id}            → activar / desactivar
 * POST {action:delete, id}            → eliminar (solo si no hay pacientes)
 */
require_once __DIR__ . '/_helpers.php';

$pdo = db();

if ($_SERVER['REQUEST_METHOD'] === 'GET') {
    $soloActivas = isset($_GET['solo_activas']) && $_GET['solo_activas'] == '1';
    $sql  = 'SELECT id, nombre, activa, orden FROM lab_ciudades' . ($soloActivas ? ' WHERE activa = 1' : '') . ' ORDER BY nombre';
    $rows = $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC);
    jsonOk(['ciudades' => $rows]);
}

requireMethod('POST');
requireAdmin();

$body   = inputJson();
$action = trim($body['action'] ?? '');

if ($action === 'save') {
    $nombre = trim($body['nombre'] ?? '');
    $id     = (int)($body['id'] ?? 0);
    if (!$nombre) jsonError('nombre requerido.');
    if (strlen($nombre) > 100) jsonError('nombre demasiado largo (máx 100).');

    if ($id) {
        $pdo->prepare('UPDATE lab_ciudades SET nombre = ? WHERE id = ?')->execute([$nombre, $id]);
        jsonOk(['id' => $id], 'Ciudad actualizada.');
    } else {
        $st = $pdo->prepare('INSERT INTO lab_ciudades (nombre) VALUES (?)');
        try {
            $st->execute([$nombre]);
        } catch (\PDOException $e) {
            if ($e->getCode() == 23000) jsonError('Ya existe una ciudad con ese nombre.');
            throw $e;
        }
        jsonOk(['id' => (int)$pdo->lastInsertId()], 'Ciudad creada.');
    }
}

if ($action === 'toggle') {
    $id = (int)($body['id'] ?? 0);
    if (!$id) jsonError('id requerido.');
    $pdo->prepare('UPDATE lab_ciudades SET activa = NOT activa WHERE id = ?')->execute([$id]);
    jsonOk([], 'Estado actualizado.');
}

if ($action === 'delete') {
    $id = (int)($body['id'] ?? 0);
    if (!$id) jsonError('id requerido.');
    $uso = $pdo->prepare('SELECT COUNT(*) FROM lab_pacientes WHERE ciudad = (SELECT nombre FROM lab_ciudades WHERE id = ?)');
    $uso->execute([$id]);
    if ((int)$uso->fetchColumn() > 0) jsonError('No se puede eliminar: hay pacientes con esta ciudad. Desactívela en su lugar.');
    $pdo->prepare('DELETE FROM lab_ciudades WHERE id = ?')->execute([$id]);
    jsonOk([], 'Ciudad eliminada.');
}

jsonError('action inválida.');
