<?php
/**
 * POST /modules/turnero/api/update_muestra_estado.php
 * Marca una muestra como recibida o rechazada.
 * Solo accesible desde estaciones tipo "muestras".
 *
 * Body JSON:
 *   muestra_id     int     requerido
 *   estado         string  requerido   'recibida' | 'rechazada' | 'pendiente'
 *   motivo_rechazo string  opcional    requerido si estado = 'rechazada'
 *   turno_id       int     opcional    turno activo desde el que se recibe (para trazabilidad
 *                                      cuando la muestra es de una visita anterior)
 */

require_once __DIR__ . '/_helpers.php';
requireMethod('POST');
requireTurnero();

$datos     = inputJson();
$muestraId = isset($datos['muestra_id']) ? (int)$datos['muestra_id'] : 0;
$estado    = trim($datos['estado'] ?? '');
$motivo    = isset($datos['motivo_rechazo']) ? trim($datos['motivo_rechazo']) : null;
$turnoId   = isset($datos['turno_id']) ? (int)$datos['turno_id'] : 0;

if ($muestraId <= 0) jsonError('muestra_id inválido.');
if (!in_array($estado, ['recibida', 'rechazada', 'pendiente'], true)) {
    jsonError('estado debe ser recibida, rechazada o pendiente.');
}
if ($motivo === '') $motivo = null;

$pdo = db();

// Verificar que la muestra existe
$stmt = $pdo->prepare(
    "SELECT tm.id, tm.solicitud_id, tm.estado, ts.turno_id AS turno_origen_id
       FROM turnero_muestras tm
       JOIN turnero_solicitudes ts ON ts.id = tm.solicitud_id
      WHERE tm.id = ?"
);
$stmt->execute([$muestraId]);
$muestra = $stmt->fetch(PDO::FETCH_ASSOC);

if (!$muestra) jsonError('Muestra no encontrada.', 404);

// Solo registrar "recibida en otro turno" cuando de verdad es una visita distinta
// a la que generó la muestra (no tocar la solicitud/turno original).
$recibidaEnTurno = ($turnoId && $turnoId !== (int)$muestra['turno_origen_id']) ? $turnoId : null;

// Construir campos a actualizar
$ahora  = date('Y-m-d H:i:s');
$adminI = adminId();

if ($estado === 'recibida') {
    $pdo->prepare(
        "UPDATE turnero_muestras
            SET estado = 'recibida', recibida_por = ?, recibida_at = ?,
                recibida_en_turno_id = ?, motivo_rechazo = NULL
          WHERE id = ?"
    )->execute([$adminI, $ahora, $recibidaEnTurno, $muestraId]);
} elseif ($estado === 'rechazada') {
    $pdo->prepare(
        "UPDATE turnero_muestras
            SET estado = 'rechazada', recibida_por = ?, recibida_at = ?,
                motivo_rechazo = ?
          WHERE id = ?"
    )->execute([$adminI, $ahora, $motivo, $muestraId]);
} else {
    // Revertir a pendiente
    $pdo->prepare(
        "UPDATE turnero_muestras
            SET estado = 'pendiente', recibida_por = NULL,
                recibida_at = NULL, recibida_en_turno_id = NULL, motivo_rechazo = NULL
          WHERE id = ?"
    )->execute([$muestraId]);
}

jsonOk(['muestra_id' => $muestraId, 'estado' => $estado], 'Muestra actualizada');
