<?php
/**
 * modules/turnero/api/save_ex_tipo.php
 * GET  ?id=X   → devuelve datos de un tipo de examen (incluyendo form_ids[])
 * POST {codigo, nombre, categoria, form_ids:[], activo}       → crear
 * POST {id, codigo, nombre, categoria, form_ids:[], activo}   → actualizar
 * POST {id, _delete: true}                                    → eliminar
 */
require_once __DIR__ . '/_helpers.php';

requireTurnero();

// ── GET: devolver datos de un tipo de examen ─────────────────
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
    $id = (int)($_GET['id'] ?? 0);
    if (!$id) jsonError('ID requerido');

    $stmt = db()->prepare('SELECT * FROM exam_tipos WHERE id = ?');
    $stmt->execute([$id]);
    $data = $stmt->fetch(PDO::FETCH_ASSOC);
    if (!$data) jsonError('Examen no encontrado', 404);

    $fStmt = db()->prepare('SELECT formulario_id FROM exam_tipo_consentimientos WHERE exam_tipo_id = ?');
    $fStmt->execute([$id]);
    $data['form_ids'] = $fStmt->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 ítems en solicitudes activas
    $stmt = db()->prepare(
        'SELECT COUNT(*) FROM turnero_examen_items WHERE exam_tipo_id = ?'
    );
    $stmt->execute([$id]);
    if ($stmt->fetchColumn() > 0) {
        jsonError('No se puede eliminar: hay solicitudes que incluyen este examen. Desactívelo en su lugar.');
    }
    // Eliminar relación de consentimiento primero (FK)
    db()->prepare('DELETE FROM exam_tipo_consentimientos WHERE exam_tipo_id = ?')->execute([$id]);
    db()->prepare('DELETE FROM exam_tipos WHERE id = ?')->execute([$id]);
    jsonOk([], 'Examen eliminado');
}

// ── CREAR / ACTUALIZAR ───────────────────────────────────────
$codigo    = strtoupper(trim($input['codigo']   ?? ''));
$nombre    = trim($input['nombre']              ?? '');
$categoria = trim($input['categoria']           ?? '');
$formIds   = array_values(array_unique(array_filter(array_map('intval', (array)($input['form_ids'] ?? [])))));
$activo    = (int)($input['activo']             ?? 1);

if ($codigo === '') jsonError('El código es requerido');
if ($nombre === '') jsonError('El nombre es requerido');
if (strlen($codigo) > 20) jsonError('El código no puede tener más de 20 caracteres');

$pdo = db();
$pdo->beginTransaction();

try {
    if ($id) {
        $stmt = $pdo->prepare(
            'UPDATE exam_tipos SET codigo=?, nombre=?, categoria=?, activo=? WHERE id=?'
        );
        $stmt->execute([$codigo, $nombre, $categoria ?: null, $activo, $id]);
        $examId = $id;
    } else {
        $stmt = $pdo->prepare(
            'INSERT INTO exam_tipos (codigo, nombre, categoria, activo) VALUES (?, ?, ?, ?)'
        );
        $stmt->execute([$codigo, $nombre, $categoria ?: null, $activo]);
        $examId = (int)$pdo->lastInsertId();
    }

    // Actualizar relaciones formulario ↔ examen (muchos a muchos)
    $pdo->prepare('DELETE FROM exam_tipo_consentimientos WHERE exam_tipo_id = ?')->execute([$examId]);
    $ins = $pdo->prepare('INSERT INTO exam_tipo_consentimientos (exam_tipo_id, formulario_id) VALUES (?, ?)');
    foreach ($formIds as $fid) {
        $ins->execute([$examId, $fid]);
    }

    $pdo->commit();
    jsonOk(['id' => $examId], $id ? 'Examen actualizado' : 'Examen creado');
} catch (\Throwable $e) {
    $pdo->rollBack();
    // Código SQLSTATE 23000 = violación de unicidad
    if ($e->getCode() === '23000') {
        jsonError('Ya existe un examen con ese código');
    }
    jsonError('Error interno: ' . $e->getMessage(), 500);
}
