<?php

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: Content-Type, Authorization");
header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");
header("Content-Type: application/json; charset=utf-8");

// 🔥 RESPONDER PREFLIGHT Y MORIR AQUÍ
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    http_response_code(200);
    exit;
}

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

require_once(__DIR__ . '/../config.php');
require_once(__DIR__ . '/../auth_guard.php');

// ===================== HELPERS =====================
function cleanText($v) {
  $v = trim((string)$v);
  return $v === "" ? null : $v;
}

function jsonInput(): array {
  $raw = file_get_contents("php://input");
  $data = json_decode($raw, true);
  return is_array($data) ? $data : [];
}

function respond($arr, int $code = 200) {
  http_response_code($code);
  echo json_encode($arr);
  exit;
}

// ===================== AUTH =====================
$authUser = requireAuth($JWT_KEY);
$activeUser = requireActiveUser($mysqli, $authUser);

// (Opcional) Solo admin:
// if ((int)$activeUser["TIPO_USUARIO"] !== 1) respond(["success"=>false,"message"=>"No autorizado"], 403);

// ===================== ROUTER =====================
$method = $_SERVER['REQUEST_METHOD'];

try {

  // -------- GET (listar u obtener uno) --------
  if ($method === 'GET') {
    $id = isset($_GET["id"]) ? (int)$_GET["id"] : 0;

    if ($id > 0) {
      $sql = "SELECT *
              FROM MATRIZ_GENERAL
              WHERE ID_MATRIZ_GENERAL = ?
              LIMIT 1";
      $stmt = $mysqli->prepare($sql);
      $stmt->bind_param("i", $id);
      $stmt->execute();
      $row = $stmt->get_result()->fetch_assoc();

      if (!$row) respond(["success"=>false,"message"=>"No encontrado"], 404);
      respond(["success"=>true,"data"=>$row]);
    }

    $sql = "SELECT *
            FROM MATRIZ_GENERAL
            ORDER BY ID_MATRIZ_GENERAL DESC";
    $res = $mysqli->query($sql);

    $rows = [];
    while ($r = $res->fetch_assoc()) $rows[] = $r;

    respond(["success"=>true, "total"=>count($rows), "data"=>$rows]);
  }

  // -------- POST (crear) --------
  if ($method === 'POST') {
    $b = jsonInput();

    $COMPETENCIA = cleanText($b["COMPETENCIA"] ?? "");
    $DESTREZA    = cleanText($b["DESTREZA"] ?? "");
    $DEFINICION  = cleanText($b["DEFINICION"] ?? "");

    // mínimos recomendados (ajústalos si quieres obligar más)
    if (!$COMPETENCIA || !$DESTREZA) {
      respond(["success"=>false,"message"=>"COMPETENCIA y DESTREZA son obligatorios"], 400);
    }

    $CALIFICACION_1 = cleanText($b["CALIFICACION_1"] ?? null);
    $CALIFICACION_2 = cleanText($b["CALIFICACION_2"] ?? null);
    $CALIFICACION_3 = cleanText($b["CALIFICACION_3"] ?? null);
    $CALIFICACION_4 = cleanText($b["CALIFICACION_4"] ?? null);

    $BANCO_DE_PREGUNTAS = cleanText($b["BANCO_DE_PREGUNTAS"] ?? null);
    $CANT_PREGUNTAS     = cleanText($b["CANT_PREGUNTAS"] ?? null);
    $NUMERO_DE_PREGUNTAS= cleanText($b["NUMERO_DE_PREGUNTAS"] ?? null);

    $ARTICULACION_CC_SABER_PRO = cleanText($b["ARTICULACION_CC_SABER_PRO"] ?? null);

    $VALOR_PREGUNTA_1 = cleanText($b["VALOR_PREGUNTA_1"] ?? null);
    $VALOR_PREGUNTA_2 = cleanText($b["VALOR_PREGUNTA_2"] ?? null);
    $VALOR_PREGUNTA_3 = cleanText($b["VALOR_PREGUNTA_3"] ?? null);
    $VALOR_PREGUNTA_4 = cleanText($b["VALOR_PREGUNTA_4"] ?? null);

    // ✅ FECHA_INGRESO tiene default current_timestamp() en la tabla
    $sql = "INSERT INTO MATRIZ_GENERAL
            (COMPETENCIA, DESTREZA, DEFINICION,
             CALIFICACION_1, CALIFICACION_2, CALIFICACION_3, CALIFICACION_4,
             BANCO_DE_PREGUNTAS, CANT_PREGUNTAS, NUMERO_DE_PREGUNTAS,
             ARTICULACION_CC_SABER_PRO,
             VALOR_PREGUNTA_1, VALOR_PREGUNTA_2, VALOR_PREGUNTA_3, VALOR_PREGUNTA_4)
            VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";

    $stmt = $mysqli->prepare($sql);
    $stmt->bind_param(
      "sssssssssssssss",
      $COMPETENCIA,
      $DESTREZA,
      $DEFINICION,
      $CALIFICACION_1,
      $CALIFICACION_2,
      $CALIFICACION_3,
      $CALIFICACION_4,
      $BANCO_DE_PREGUNTAS,
      $CANT_PREGUNTAS,
      $NUMERO_DE_PREGUNTAS,
      $ARTICULACION_CC_SABER_PRO,
      $VALOR_PREGUNTA_1,
      $VALOR_PREGUNTA_2,
      $VALOR_PREGUNTA_3,
      $VALOR_PREGUNTA_4
    );

    $stmt->execute();

    respond(["success"=>true,"id"=>$mysqli->insert_id,"message"=>"Matriz creada"]);
  }

  // -------- PUT (actualizar) --------
  if ($method === 'PUT') {
    $b = jsonInput();

    $ID_MATRIZ_GENERAL = (int)($b["ID_MATRIZ_GENERAL"] ?? 0);
    if ($ID_MATRIZ_GENERAL <= 0) {
      respond(["success"=>false,"message"=>"ID_MATRIZ_GENERAL requerido"], 400);
    }

    $COMPETENCIA = cleanText($b["COMPETENCIA"] ?? "");
    $DESTREZA    = cleanText($b["DESTREZA"] ?? "");
    $DEFINICION  = cleanText($b["DEFINICION"] ?? "");

    if (!$COMPETENCIA || !$DESTREZA) {
      respond(["success"=>false,"message"=>"COMPETENCIA y DESTREZA son obligatorios"], 400);
    }

    $CALIFICACION_1 = cleanText($b["CALIFICACION_1"] ?? null);
    $CALIFICACION_2 = cleanText($b["CALIFICACION_2"] ?? null);
    $CALIFICACION_3 = cleanText($b["CALIFICACION_3"] ?? null);
    $CALIFICACION_4 = cleanText($b["CALIFICACION_4"] ?? null);

    $BANCO_DE_PREGUNTAS = cleanText($b["BANCO_DE_PREGUNTAS"] ?? null);
    $CANT_PREGUNTAS     = cleanText($b["CANT_PREGUNTAS"] ?? null);
    $NUMERO_DE_PREGUNTAS= cleanText($b["NUMERO_DE_PREGUNTAS"] ?? null);

    $ARTICULACION_CC_SABER_PRO = cleanText($b["ARTICULACION_CC_SABER_PRO"] ?? null);

    $VALOR_PREGUNTA_1 = cleanText($b["VALOR_PREGUNTA_1"] ?? null);
    $VALOR_PREGUNTA_2 = cleanText($b["VALOR_PREGUNTA_2"] ?? null);
    $VALOR_PREGUNTA_3 = cleanText($b["VALOR_PREGUNTA_3"] ?? null);
    $VALOR_PREGUNTA_4 = cleanText($b["VALOR_PREGUNTA_4"] ?? null);

    $sql = "UPDATE MATRIZ_GENERAL SET
              COMPETENCIA=?,
              DESTREZA=?,
              DEFINICION=?,
              CALIFICACION_1=?,
              CALIFICACION_2=?,
              CALIFICACION_3=?,
              CALIFICACION_4=?,
              BANCO_DE_PREGUNTAS=?,
              CANT_PREGUNTAS=?,
              NUMERO_DE_PREGUNTAS=?,
              ARTICULACION_CC_SABER_PRO=?,
              VALOR_PREGUNTA_1=?,
              VALOR_PREGUNTA_2=?,
              VALOR_PREGUNTA_3=?,
              VALOR_PREGUNTA_4=?
            WHERE ID_MATRIZ_GENERAL=?";

    $stmt = $mysqli->prepare($sql);
    $stmt->bind_param(
      "sssssssssssssssi",
      $COMPETENCIA,
      $DESTREZA,
      $DEFINICION,
      $CALIFICACION_1,
      $CALIFICACION_2,
      $CALIFICACION_3,
      $CALIFICACION_4,
      $BANCO_DE_PREGUNTAS,
      $CANT_PREGUNTAS,
      $NUMERO_DE_PREGUNTAS,
      $ARTICULACION_CC_SABER_PRO,
      $VALOR_PREGUNTA_1,
      $VALOR_PREGUNTA_2,
      $VALOR_PREGUNTA_3,
      $VALOR_PREGUNTA_4,
      $ID_MATRIZ_GENERAL
    );

    $stmt->execute();

    respond(["success"=>true,"message"=>"Matriz actualizada"]);
  }

  // -------- DELETE (soft delete) --------
  // OJO: tu tabla no tiene ESTADO. Para mantener misma estructura,
  // te dejo el soft delete listo, pero requiere que agregues un campo ESTADO_REGISTRO o ESTADO.
  // Si NO quieres cambiar la tabla, dime y lo hago DELETE real.
  if ($method === 'DELETE') {
    $id = isset($_GET["id"]) ? (int)$_GET["id"] : 0;
    if ($id <= 0) respond(["success"=>false,"message"=>"id requerido"], 400);

    // ✅ OPCIÓN A: DELETE REAL (sin cambiar tabla)
    // $sql = "DELETE FROM MATRIZ_GENERAL WHERE ID_MATRIZ_GENERAL=?";
    // $stmt = $mysqli->prepare($sql);
    // $stmt->bind_param("i", $id);
    // $stmt->execute();
    // respond(["success"=>true,"message"=>"Matriz eliminada"]);

    // ✅ OPCIÓN B: SOFT DELETE (REQUIERE CAMPO ESTADO_REGISTRO o similar)
    // Cambia "ESTADO_REGISTRO" por el nombre real cuando lo agregues.
    $sql = "UPDATE MATRIZ_GENERAL SET ESTADO_REGISTRO=0 WHERE ID_MATRIZ_GENERAL=?";
    $stmt = $mysqli->prepare($sql);
    $stmt->bind_param("i", $id);
    $stmt->execute();

    respond(["success"=>true,"message"=>"Matriz inactivada"]);
  }

  respond(["success"=>false,"message"=>"Método no permitido"], 405);

} catch (Throwable $e) {
  respond(["success"=>false,"message"=>"Error interno","error"=>$e->getMessage()], 500);
}
