<?php
/**
 * POST /modules/turnero/api/cancelar_toma_pendiente.php
 * Marca una toma progresiva en_progreso como rechazada (paciente no quiere continuar).
 * Body: { consentimiento_id }
 */
require_once __DIR__ . '/_helpers.php';
require_once __DIR__ . '/../../../classes/lab/ActividadAdmin.php';
requireMethod('POST');
requireTurnero();

$body      = inputJson();
$consentId = (int)($body['consentimiento_id'] ?? 0);
$turnoId   = (int)($body['turno_id']          ?? 0);
if (!$consentId) jsonError('consentimiento_id requerido.');
if (!$turnoId)   jsonError('turno_id requerido.');

$pdo = db();

// Verificar que el consentimiento pertenece al mismo paciente que el turno activo.
// Previene que un turnero cancele tomas de pacientes que no tiene abiertos (IDOR).
$stmt = $pdo->prepare(
    "UPDATE turnero_consentimientos tc
       JOIN turnero_turnos t_old ON t_old.id = tc.turno_id
       JOIN turnero_turnos t_cur ON t_cur.id = ? AND t_cur.paciente_id IS NOT NULL
                                                  AND t_cur.paciente_id = t_old.paciente_id
        SET tc.estado = 'rechazado'
      WHERE tc.id = ? AND tc.estado = 'en_progreso'"
);
$stmt->execute([$turnoId, $consentId]);

if ($stmt->rowCount() === 0) jsonError('Toma no encontrada o el paciente no coincide.', 404);

// Cancelar una toma pendiente cierra un protocolo que quedó a medias en otra
// visita: conviene saber quién lo dio por terminado.
try {
    $inf = $pdo->prepare(
        "SELECT tc.turno_id, t.codigo, f.nombre AS formulario
           FROM turnero_consentimientos tc
           JOIN turnero_turnos t  ON t.id = tc.turno_id
           JOIN lab_formularios f ON f.id = tc.formulario_id
          WHERE tc.id = ? LIMIT 1"
    );
    $inf->execute([$consentId]);
    $d = $inf->fetch(PDO::FETCH_ASSOC) ?: [];

    (new ActividadAdmin())->registrar(
        adminId(),
        'turnero',
        'cancelar_toma_pendiente',
        $consentId,
        [
            // Se registra bajo el turno donde se hizo la cancelación, que es
            // donde alguien la va a buscar en el historial.
            'turno_id'          => $turnoId,
            'turno_origen_id'   => isset($d['turno_id']) ? (int)$d['turno_id'] : null,
            'turno_origen'      => $d['codigo'] ?? null,
            'formulario_nombre' => $d['formulario'] ?? null,
        ]
    );
} catch (\Throwable $e) {
    error_log('[cancelar_toma_pendiente] auditoría: ' . $e->getMessage());
}

jsonOk(['cancelado' => true]);
