<?php
/**
 * modules/turnero/api/save_lugar.php
 * GET  ?id=X   → devuelve datos de un lugar
 * POST {nombre, descripcion, sort_order, activo}       → crear
 * POST {id, nombre, descripcion, sort_order, activo}   → actualizar
 * POST {id, _delete: true}                             → eliminar
 */
require_once __DIR__ . '/_helpers.php';
require_once __DIR__ . '/../../../classes/lab/ActividadAdmin.php';

requireTurnero();

// ── GET: devolver datos de un lugar ──────────────────────────
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
    $id = (int)($_GET['id'] ?? 0);
    if (!$id) jsonError('ID requerido');
    $row = db()->prepare('SELECT * FROM turnero_lugares WHERE id = ?');
    $row->execute([$id]);
    $data = $row->fetch(PDO::FETCH_ASSOC);
    if (!$data) jsonError('Lugar no encontrado', 404);
    // Incluir formularios de consentimiento vinculados
    $stmtFc = db()->prepare('SELECT formulario_id FROM turnero_lugar_consentimientos WHERE lugar_id = ?');
    $stmtFc->execute([$id]);
    $data['formulario_ids'] = $stmtFc->fetchAll(PDO::FETCH_COLUMN);
    jsonOk(['data' => $data]);
}

requireMethod('POST');
$input = inputJson();

$id      = (int)($input['id'] ?? 0);
$delete  = !empty($input['_delete']);

// ── ELIMINAR ─────────────────────────────────────────────────
if ($delete) {
    if (!$id) jsonError('ID requerido');
    // Bloquear si tiene turnos asignados
    $stmt = db()->prepare('SELECT COUNT(*) FROM turnero_turnos WHERE lugar_destino_id = ?');
    $stmt->execute([$id]);
    if ($stmt->fetchColumn() > 0) {
        jsonError('No se puede eliminar: tiene turnos asignados. Desactívelo en su lugar.');
    }
    $stmt = db()->prepare('DELETE FROM turnero_lugares WHERE id = ?');
    $stmt->execute([$id]);
    (new ActividadAdmin())->registrar(adminId(), 'turnero_config', 'eliminar_lugar', $id, ['lugar_id' => $id]);
    jsonOk([], 'Lugar eliminado');
}

// ── CREAR / ACTUALIZAR ───────────────────────────────────────
$nombre    = trim($input['nombre']      ?? '');
$desc      = trim($input['descripcion'] ?? '');
$sortOrder = (int)($input['sort_order'] ?? 99);
$activo    = (int)($input['activo']     ?? 1);
$tipo      = in_array($input['tipo'] ?? '', ['recepcion', 'muestras'], true)
             ? $input['tipo'] : 'muestras';
$formModo  = in_array($input['formulario_modo'] ?? '', ['link', 'embebido'], true)
             ? $input['formulario_modo'] : 'link';
$formularioIds = isset($input['formulario_ids']) && is_array($input['formulario_ids'])
             ? array_filter(array_map('intval', $input['formulario_ids']), fn($v) => $v > 0)
             : [];

if ($nombre === '') jsonError('El nombre es requerido');
if ($sortOrder < 1) jsonError('El orden debe ser mayor a 0');

$pdo = db();
$pdo->beginTransaction();
try {
    if ($id) {
        $stmt = $pdo->prepare(
            'UPDATE turnero_lugares SET nombre=?, tipo=?, descripcion=?, sort_order=?, activo=?, formulario_modo=? WHERE id=?'
        );
        $stmt->execute([$nombre, $tipo, $desc ?: null, $sortOrder, $activo, $formModo, $id]);
        $lugarId = $id;
    } else {
        $stmt = $pdo->prepare(
            'INSERT INTO turnero_lugares (nombre, tipo, descripcion, sort_order, activo, formulario_modo) VALUES (?, ?, ?, ?, ?, ?)'
        );
        $stmt->execute([$nombre, $tipo, $desc ?: null, $sortOrder, $activo, $formModo]);
        $lugarId = (int) $pdo->lastInsertId();
    }

    // Sincronizar formularios de consentimiento
    $pdo->prepare('DELETE FROM turnero_lugar_consentimientos WHERE lugar_id = ?')->execute([$lugarId]);
    if (!empty($formularioIds)) {
        $stmtIns = $pdo->prepare(
            'INSERT IGNORE INTO turnero_lugar_consentimientos (lugar_id, formulario_id) VALUES (?, ?)'
        );
        foreach ($formularioIds as $fid) {
            $stmtIns->execute([$lugarId, $fid]);
        }
    }

    $pdo->commit();

    // Auditoría: registrar quién guardó el lugar y con qué formularios
    try {
        $fNombres = [];
        if (!empty($formularioIds)) {
            $ph = implode(',', array_fill(0, count($formularioIds), '?'));
            $fNombres = db()->prepare("SELECT id, nombre FROM lab_formularios WHERE id IN ($ph)");
            $fNombres->execute(array_values($formularioIds));
            $fNombres = $fNombres->fetchAll(PDO::FETCH_KEY_PAIR);
        }
        (new ActividadAdmin())->registrar(
            adminId(),
            'turnero_config',
            $id ? 'editar_lugar' : 'crear_lugar',
            $lugarId,
            ['nombre' => $nombre, 'tipo' => $tipo, 'activo' => $activo, 'formularios' => $fNombres]
        );
    } catch (\Throwable $_) {}

    jsonOk(['id' => $lugarId], $id ? 'Lugar actualizado' : 'Lugar creado');
} catch (\Throwable $e) {
    $pdo->rollBack();
    jsonError('Error al guardar lugar: ' . $e->getMessage(), 500);
}
