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.');