<?php
declare(strict_types=1);

require_once __DIR__ . '/../auth/guard.php';
require_once __DIR__ . '/../conexion.php';
require_once __DIR__ . '/../_helpers.php';

$u = require_login();
require_module_access($u, "instrumentos");

$cod = trim((string)($_GET['cod'] ?? $_GET['codigo_familia'] ?? ''));
if ($cod === '') json_response(['ok'=>false,'message'=>'Código de familia requerido'], 400);

try {
  // 1) familia + nombres sector/sectorizacion
  $stF = $pdo->prepare("
    SELECT
      f.*,
      sz.nombre_sectorizacion,
      s.nombre_sector
    FROM familias f
    LEFT JOIN sectorizacion sz ON sz.id = f.sectorizacion
    LEFT JOIN sectores s ON s.id = f.sector
    WHERE f.codigo_familia = :cod
    LIMIT 1
  ");
  $stF->execute([':cod'=>$cod]);
  $familia = $stF->fetch(PDO::FETCH_ASSOC);
  if (!$familia) json_response(['ok'=>false,'message'=>'Familia no encontrada'], 404);

  // 2) integrantes con datos
  $stI = $pdo->prepare("
    SELECT
      rut, nombres, apellidos, parentezco,
      CASE
        WHEN (edad IS NULL OR edad = 0)
          AND NULLIF(fecha_nacimiento,'0000-00-00') IS NOT NULL
          AND fecha_nacimiento >= '1900-01-01'
          AND fecha_nacimiento <= CURDATE()
        THEN TIMESTAMPDIFF(YEAR, fecha_nacimiento, CURDATE())
        ELSE edad
      END AS edad,
      genero
    FROM usuarios
    WHERE familia = :cod
    ORDER BY apellidos ASC, nombres ASC
  ");
  $stI->execute([':cod'=>$cod]);
  $integrantes = $stI->fetchAll(PDO::FETCH_ASSOC);

  // helpers "último id"
  $lastId = function(string $table) use ($pdo, $cod): ?int {
    $st = $pdo->prepare("SELECT id FROM {$table} WHERE codigo_familia=:cod ORDER BY id DESC LIMIT 1");
    $st->execute([':cod'=>$cod]);
    $v = $st->fetchColumn();
    return $v ? (int)$v : null;
  };

  $lastApgarId = $lastId('instrumentos_apgar');
  $lastCvId    = $lastId('instrumentos_ciclo_vida');
  $lastLtId    = $lastId('instrumentos_linea');
  $lastGenId   = $lastId('instrumentos_genograma');

  // APGAR
  $apgar = null;
  if ($lastApgarId) {
    $st = $pdo->prepare("SELECT * FROM instrumentos_apgar WHERE id=:id LIMIT 1");
    $st->execute([':id'=>$lastApgarId]);
    $apgar = $st->fetch(PDO::FETCH_ASSOC) ?: null;
  }

  // Ciclo vida
  $ciclo = null;
  if ($lastCvId) {
    $st = $pdo->prepare("SELECT * FROM instrumentos_ciclo_vida WHERE id=:id LIMIT 1");
    $st->execute([':id'=>$lastCvId]);
    $ciclo = $st->fetch(PDO::FETCH_ASSOC) ?: null;
  }

  // Linea tiempo (eventos)
  $linea = null;
  if ($lastLtId) {
    $st = $pdo->prepare("SELECT id, creado_en FROM instrumentos_linea WHERE id=:id LIMIT 1");
    $st->execute([':id'=>$lastLtId]);
    $head = $st->fetch(PDO::FETCH_ASSOC);
    if ($head) {
      $stE = $pdo->prepare("SELECT * FROM instrumentos_linea_eventos WHERE linea_id=:id ORDER BY fecha ASC, id ASC");
      $stE->execute([':id'=>$lastLtId]);
      $linea = [
        'id' => (int)$lastLtId,
        'creado_en' => $head['creado_en'],
        'eventos' => $stE->fetchAll(PDO::FETCH_ASSOC),
      ];
    }
  }

  // Genograma (rels)
  $genograma = null;
  if ($lastGenId) {
    $st = $pdo->prepare("SELECT id, creado_en FROM instrumentos_genograma WHERE id=:id LIMIT 1");
    $st->execute([':id'=>$lastGenId]);
    $head = $st->fetch(PDO::FETCH_ASSOC);
    if ($head) {
      $stR = $pdo->prepare("SELECT rut_a, rut_b, tipo FROM instrumentos_genograma_rel WHERE genograma_id=:id ORDER BY id ASC");
      $stR->execute([':id'=>$lastGenId]);
      $genograma = [
        'id' => (int)$lastGenId,
        'creado_en' => $head['creado_en'],
        'relaciones' => $stR->fetchAll(PDO::FETCH_ASSOC),
      ];
    }
  }

  // Historial
  $stH = $pdo->prepare("
    SELECT
      h.id, h.fecha, h.instrumento, h.puntaje, h.resultado,
      h.registrado_por,
      CONCAT_WS(' ', f.nombre, f.apellido_paterno) AS registrado_nombre,
      h.ref_id, h.creado_en
    FROM instrumentos_historial h
    LEFT JOIN funcionario f ON f.rut = h.registrado_por
    WHERE h.codigo_familia = :cod
    ORDER BY h.id DESC
    LIMIT 100
  ");
  $stH->execute([':cod'=>$cod]);
  $historial = $stH->fetchAll(PDO::FETCH_ASSOC);

  json_response([
    'ok'=>true,
    'familia'=>$familia,
    'integrantes'=>$integrantes,
    'latest'=>[
      'apgar'=>$apgar,
      'ciclo'=>$ciclo,
      'linea'=>$linea,
      'genograma'=>$genograma
    ],
    'historial'=>$historial
  ]);

} catch (Throwable $e) {
  error_log("INSTR CONTEXT ERROR: ".$e->getMessage());
  json_response(['ok'=>false,'message'=>'Error cargando contexto.'], 500);
}
