<?php
/**
 * POST /modules/turnero/api/crear_envio_presencial.php
 *
 * Crea (o recupera) un registro lab_form_envios vinculado a un turnero_consentimientos
 * para que el paciente pueda firmar presencialmente via form_cliente.php?t=TOKEN.
 *
 * Body JSON:
 *   consent_token  string  UUID del turnero_consentimientos (requerido)
 */

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

$datos        = inputJson();
$consentToken = trim($datos['consent_token'] ?? '');

if (!preg_match('/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i', $consentToken)) {
    jsonError('consent_token inválido.');
}

$pdo = db();

// ── 1. Cargar el consentimiento con datos del turno y paciente ────────
$stmt = $pdo->prepare(
    "SELECT tc.id           AS tc_id,
            tc.formulario_id,
            tc.token        AS tc_token,
            tc.estado,
            tc.lab_form_envio_id,
            ts.paciente_id,
            t.sesion_id,
            p.nombre_completo, p.tipo_documento, p.numero_documento,
            p.fecha_nacimiento, p.telefono, p.eps,
            med.nombres AS medico_nombres, med.apellidos AS medico_apellidos
       FROM turnero_consentimientos tc
       JOIN turnero_turnos          t  ON t.id  = tc.turno_id
       LEFT JOIN turnero_solicitudes ts ON ts.turno_id = tc.turno_id
       LEFT JOIN lab_pacientes      p  ON p.id  = ts.paciente_id
       LEFT JOIN medicos            med ON med.id = ts.medico_id
      WHERE tc.token = ?
      LIMIT 1"
);
$stmt->execute([$consentToken]);
$tc = $stmt->fetch(PDO::FETCH_ASSOC);

if (!$tc) jsonError('Consentimiento no encontrado.', 404);

// ── Si ya fue firmado o tiene envío vinculado, devolver ese token ────
if ($tc['lab_form_envio_id']) {
    $stEnv = $pdo->prepare("SELECT token, estado FROM lab_form_envios WHERE id = ?");
    $stEnv->execute([(int)$tc['lab_form_envio_id']]);
    $envio = $stEnv->fetch(PDO::FETCH_ASSOC);
    if ($envio) {
        // Si el envio no fue completado todavía, reutilizarlo
        if (!in_array($envio['estado'], ['completado', 'firmado'])) {
            jsonOk(['form_token' => $envio['token']]);
        }
        // Si ya completado, devolver igualmente el token para que el operador lo vea
        jsonOk(['form_token' => $envio['token'], 'ya_firmado' => true]);
    }
}

if ($tc['estado'] === 'firmado') {
    jsonError('Este consentimiento ya fue firmado.', 409);
}

// ── 3. Crear nuevo lab_form_envios ────────────────────────────────────
$formToken = bin2hex(random_bytes(32)); // 64 chars hex

$prefilled = [];
if ($tc['nombre_completo'])   $prefilled['__paciente']['nombre_completo']  = $tc['nombre_completo'];
if ($tc['tipo_documento'])    $prefilled['__paciente']['tipo_documento']   = $tc['tipo_documento'];
if ($tc['numero_documento'])  $prefilled['__paciente']['numero_documento'] = $tc['numero_documento'];
if ($tc['fecha_nacimiento'])  $prefilled['__paciente']['fecha_nacimiento'] = $tc['fecha_nacimiento'];
if ($tc['telefono'])          $prefilled['__paciente']['telefono']         = $tc['telefono'];
if ($tc['eps'])               $prefilled['__paciente']['eps']              = $tc['eps'];
$medicoNombre = trim(($tc['medico_nombres'] ?? '') . ' ' . ($tc['medico_apellidos'] ?? ''));
if ($medicoNombre)            $prefilled['__paciente']['medico_nombre']    = $medicoNombre;

$userId = (int)($_SESSION['admin_user']['id'] ?? 0) ?: null;

$ins = $pdo->prepare(
    "INSERT INTO lab_form_envios
        (formulario_id, paciente_id, token, datos_prefilled, estado, enviado_por, enviado_via, turnero_consentimiento_id)
     VALUES (?, ?, ?, ?, 'pendiente', ?, 'link', ?)"
);
$ins->execute([
    (int)$tc['formulario_id'],
    $tc['paciente_id'] ?: null,
    $formToken,
    json_encode($prefilled, JSON_UNESCAPED_UNICODE),
    $userId,
    (int)$tc['tc_id'],
]);

$formEnvioId = (int)$pdo->lastInsertId();

// ── 4. Guardar el vínculo en turnero_consentimientos ─────────────────
$pdo->prepare("UPDATE turnero_consentimientos SET lab_form_envio_id = ? WHERE id = ?")
    ->execute([$formEnvioId, (int)$tc['tc_id']]);

jsonOk(['form_token' => $formToken]);
