<?php
header('Content-Type: application/json; charset=utf-8');
session_start();

require_once '../Utilidades/Conexion_BD.php';

if (!isset($_SESSION['usuario'])) {
  echo json_encode(['ok' => false, 'msg' => 'Sesión expirada']);
  exit;
}

function j($r) {
  echo json_encode($r, JSON_UNESCAPED_UNICODE);
  exit;
}

$action = $_POST['action'] ?? $_GET['action'] ?? '';

// ----------------------------
// Fallback: deducir action desde tipo
// ----------------------------
if ($action === '' && isset($_POST['tipo'])) {
  switch ($_POST['tipo']) {
    case 'INGRESO':
      $action = 'ingreso';
      break;
    case 'SALIDA':
      $action = 'salida';
      break;
    case 'AJUSTE+':
      $action = 'ajuste_mas';
      break;
    case 'AJUSTE-':
      $action = 'ajuste_menos';
      break;
  }
}

$conn = new Conexion_BD();
$cn   = $conn->getConnection();

switch ($action) {

  /* ==========================================================
   * INGRESO / SALIDA / AJUSTE (+/-)
   * ========================================================== */
  case 'ingreso':
  case 'salida':
  case 'ajuste_mas':
  case 'ajuste_menos':

    // Mapeo a los tipos que entiende el SP
    $tipoMap = [
      'ingreso'      => 'INGRESO',
      'salida'       => 'SALIDA',
      'ajuste_mas'   => 'AJUSTE+',
      'ajuste_menos' => 'AJUSTE-'
    ];

    if (!isset($tipoMap[$action])) {
      j(['ok' => false, 'msg' => 'Tipo de movimiento no válido']);
    }

    $tipo = $tipoMap[$action];

    $id_rep   = (int)($_POST['id_repuesto'] ?? 0);
    $id_alm   = (int)($_POST['id_almacen'] ?? 0);
    $cant     = (float)($_POST['cantidad'] ?? 0);
    $costo    = (float)($_POST['costo_unit'] ?? 0);
    $ref_tipo = $_POST['ref_tipo'] ?? null;
    $ref_id   = $_POST['ref_id'] ?? null;
    $obs      = $_POST['observacion'] ?? null;
    $id_user  = (int)($_SESSION['id_usuario'] ?? 0);

    if ($id_rep <= 0 || $id_alm <= 0 || $cant <= 0) {
      j(['ok' => false, 'msg' => 'Datos incompletos']);
    }

    // En INGRESO el costo es obligatorio (en ajustes puede ser 0)
    if ($tipo === 'INGRESO' && $costo <= 0) {
      j(['ok' => false, 'msg' => 'Costo requerido para Ingreso']);
    }

    try {
      // SP: (id_repuesto, id_almacen, tipo, cantidad, costo_unit, ref_tipo, ref_id, obs, id_usuario)
      $stmt = $cn->prepare("CALL sp_rep_registrar_movimiento(?,?,?,?,?,?,?,?,?)");
      if (!$stmt) {
        j(['ok' => false, 'msg' => 'Error al preparar SP: ' . $cn->error]);
      }

      $stmt->bind_param(
        "iisddsssi",
        $id_rep,
        $id_alm,
        $tipo,
        $cant,
        $costo,
        $ref_tipo,
        $ref_id,
        $obs,
        $id_user
      );
      $ok = $stmt->execute();
      $stmt->close();

      j([
        'ok'  => $ok,
        'msg' => $ok ? 'Movimiento registrado correctamente' : 'No se pudo registrar el movimiento'
      ]);

    } catch (Throwable $e) {
      $msg = $e->getMessage();
      if (stripos($msg, 'Stock insuficiente') !== false) {
        j(['ok' => false, 'msg' => 'Stock insuficiente para realizar la operación']);
      } else {
        j(['ok' => false, 'msg' => $msg]);
      }
    }

  break;

  /* ========================================================== */
  default:
    j(['ok' => false, 'msg' => 'Acción no reconocida']);
}

$cn->close();
