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

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

require_once __DIR__ . '/../Utilidades/Conexion_BD.php'; // <- RUTA CORREGIDA

// === obtener conexión (PDO o MySQLi) desde tu clase Conexion_BD ===
$db = new Conexion_BD();
$conn = null;
if (method_exists($db, 'getConnection')) {
  $conn = $db->getConnection();
} elseif (method_exists($db, 'Conectar')) {
  $conn = $db->Conectar();
} else {
  echo json_encode(['ok'=>false,'msg'=>'No se pudo obtener la conexión']); exit;
}

$usePdo    = $conn instanceof PDO;
$useMysqli = class_exists('mysqli') && $conn instanceof mysqli;

$action = $_REQUEST['action'] ?? '';

function outJson($arr){
  if (ob_get_length()) { ob_clean(); }
  echo json_encode($arr);
  exit;
}

try {
  if ($action === 'vehiculos') {
    if ($usePdo) {
      $st = $conn->query("SELECT id, placa, marca FROM vehiculos WHERE estado='activo' ORDER BY placa");
      $rows = $st->fetchAll(PDO::FETCH_ASSOC);
    } else {
      $res = $conn->query("SELECT id, placa, marca FROM vehiculos WHERE estado='activo' ORDER BY placa");
      $rows = $res ? $res->fetch_all(MYSQLI_ASSOC) : [];
    }
    outJson(['ok'=>true,'data'=>$rows]);
  }

  if ($action === 'get_km') {
    $vehiculo_id = (int)($_GET['vehiculo_id'] ?? 0);
    $sql = "SELECT COALESCE(
              (SELECT cc.kilometraje FROM control_combustible cc
                 WHERE cc.vehiculo_id=? ORDER BY cc.fecha_abastecimiento DESC, cc.id DESC LIMIT 1),
              (SELECT v.kilometraje_inicial FROM vehiculos v WHERE v.id=?)
            ) AS km_actual";
    if ($usePdo) {
      $st = $conn->prepare($sql);
      $st->execute([$vehiculo_id, $vehiculo_id]);
      $km = (int)($st->fetchColumn() ?? 0);
    } else {
      $st = $conn->prepare($sql);
      $st->bind_param('ii', $vehiculo_id, $vehiculo_id);
      $st->execute(); $res = $st->get_result();
      $row = $res? $res->fetch_assoc(): null;
      $km = (int)($row['km_actual'] ?? 0);
    }
    outJson(['ok'=>true,'km_actual'=>$km]);
  }

  if ($action === 'agregar') {
    $vehiculo_id  = (int)($_POST['vehiculo_id'] ?? 0);
    $km_cambio    = (int)($_POST['km_cambio'] ?? 0);
    $fecha_cambio = $_POST['fecha_cambio'] ?? date('Y-m-d');
    $frecuencia   = (int)($_POST['frecuencia_km'] ?? 5000);
    $observacion  = trim($_POST['observacion'] ?? '');

    if ($vehiculo_id <= 0 || $km_cambio <= 0) {
      outJson(['ok'=>false,'msg'=>'Datos incompletos']);
    }

    if ($usePdo) {
      $conn->beginTransaction();
      $st = $conn->prepare("INSERT INTO mant_aceite_hist(vehiculo_id,cambio_km,cambio_fecha,observacion) VALUES (?,?,?,?)");
      $st->execute([$vehiculo_id,$km_cambio,$fecha_cambio,$observacion]);

      $st = $conn->prepare("INSERT INTO mant_aceite(vehiculo_id, ultimo_cambio_km, frecuencia_km, ultimo_cambio_fecha, estado, observacion)
                            VALUES(?,?,?,?, 'cambio_realizado', ?)
                            ON DUPLICATE KEY UPDATE
                              ultimo_cambio_km=VALUES(ultimo_cambio_km),
                              frecuencia_km=VALUES(frecuencia_km),
                              ultimo_cambio_fecha=VALUES(ultimo_cambio_fecha),
                              estado='cambio_realizado',
                              observacion=VALUES(observacion),
                              updated_at=NOW()");
      $st->execute([$vehiculo_id,$km_cambio,$frecuencia,$fecha_cambio,$observacion]);

      $conn->commit();
    } else {
      $conn->begin_transaction();
      $st = $conn->prepare("INSERT INTO mant_aceite_hist(vehiculo_id,cambio_km,cambio_fecha,observacion) VALUES (?,?,?,?)");
      $st->bind_param('iiss',$vehiculo_id,$km_cambio,$fecha_cambio,$observacion);
      $st->execute();

      $sql="INSERT INTO mant_aceite(vehiculo_id, ultimo_cambio_km, frecuencia_km, ultimo_cambio_fecha, estado, observacion)
            VALUES(?,?,?,?, 'cambio_realizado', ?)
            ON DUPLICATE KEY UPDATE
              ultimo_cambio_km=VALUES(ultimo_cambio_km),
              frecuencia_km=VALUES(frecuencia_km),
              ultimo_cambio_fecha=VALUES(ultimo_cambio_fecha),
              estado='cambio_realizado',
              observacion=VALUES(observacion),
              updated_at=NOW()";
      $st=$conn->prepare($sql);
      $st->bind_param('iiiss', $vehiculo_id,$km_cambio,$frecuencia,$fecha_cambio,$observacion);
      $st->execute();

      $conn->commit();
    }

    outJson(['ok'=>true,'msg'=>'Mantenimiento registrado correctamente']);
  }

  if ($action === 'registrar_cambio') {
    $vehiculo_id = (int)($_POST['vehiculo_id'] ?? 0);
    $observacion = trim($_POST['observacion'] ?? '');

    if ($vehiculo_id <= 0) outJson(['ok'=>false,'msg'=>'vehiculo_id inválido']);

    // Obtener km actual
    $kmSql = "SELECT COALESCE(
                (SELECT cc.kilometraje FROM control_combustible cc
                   WHERE cc.vehiculo_id=? ORDER BY cc.fecha_abastecimiento DESC, cc.id DESC LIMIT 1),
                (SELECT v.kilometraje_inicial FROM vehiculos v WHERE v.id=?)
              ) AS km_actual";
    if ($usePdo) {
      $conn->beginTransaction();
      $st = $conn->prepare($kmSql);
      $st->execute([$vehiculo_id,$vehiculo_id]);
      $kmActual = (int)($st->fetchColumn() ?? 0);

      // historial
      $st = $conn->prepare("INSERT INTO mant_aceite_hist(vehiculo_id,cambio_km,cambio_fecha,observacion) VALUES (?,?,CURDATE(),?)");
      $st->execute([$vehiculo_id,$kmActual,$observacion]);

      // maestro
      $st = $conn->prepare("INSERT INTO mant_aceite(vehiculo_id, ultimo_cambio_km, frecuencia_km, ultimo_cambio_fecha, estado, observacion)
                            VALUES(?, ?, 5000, CURDATE(), 'cambio_realizado', ?)
                            ON DUPLICATE KEY UPDATE
                              ultimo_cambio_km=VALUES(ultimo_cambio_km),
                              ultimo_cambio_fecha=VALUES(ultimo_cambio_fecha),
                              estado='cambio_realizado',
                              observacion=VALUES(observacion),
                              updated_at=NOW()");
      $st->execute([$vehiculo_id,$kmActual,$observacion]);

      $conn->commit();
    } else {
      $conn->begin_transaction();
      $st = $conn->prepare($kmSql);
      $st->bind_param('ii', $vehiculo_id, $vehiculo_id);
      $st->execute(); $res = $st->get_result(); $row = $res? $res->fetch_assoc(): null;
      $kmActual = (int)($row['km_actual'] ?? 0);

      $st = $conn->prepare("INSERT INTO mant_aceite_hist(vehiculo_id,cambio_km,cambio_fecha,observacion) VALUES (?,?,CURDATE(),?)");
      $st->bind_param('iis', $vehiculo_id,$kmActual,$observacion);
      $st->execute();

      $sql="INSERT INTO mant_aceite(vehiculo_id, ultimo_cambio_km, frecuencia_km, ultimo_cambio_fecha, estado, observacion)
            VALUES(?, ?, 5000, CURDATE(), 'cambio_realizado', ?)
            ON DUPLICATE KEY UPDATE
              ultimo_cambio_km=VALUES(ultimo_cambio_km),
              ultimo_cambio_fecha=VALUES(ultimo_cambio_fecha),
              estado='cambio_realizado',
              observacion=VALUES(observacion),
              updated_at=NOW()";
      $st=$conn->prepare($sql);
      $st->bind_param('iis', $vehiculo_id,$kmActual,$observacion);
      $st->execute();

      $conn->commit();
    }

    outJson(['ok'=>true,'msg'=>'Cambio de aceite registrado']);
  }

  if ($action === 'list') {
    $sql = "SELECT vehiculo_id, placa, ultimo_cambio_km, frecuencia_km, ultimo_cambio_fecha,
                   km_actual, proximo_cambio_km, km_restantes, estado, observacion, updated_at
              FROM v_mant_aceite_dashboard
             ORDER BY km_restantes ASC, placa ASC";
    if ($usePdo) {
      $st = $conn->query($sql);
      $rows = $st->fetchAll(PDO::FETCH_ASSOC);
    } else {
      $res = $conn->query($sql);
      if (!$res) { outJson(['ok'=>true,'data'=>[],'msg'=>'vista no disponible']); }
      $rows = $res->fetch_all(MYSQLI_ASSOC);
    }
    outJson(['ok'=>true,'data'=>$rows]);
  }

  outJson(['ok'=>false,'msg'=>'Acción no reconocida']);
} catch (Throwable $e){
  if ($usePdo && $conn->inTransaction()) $conn->rollBack();
  if ($useMysqli && $conn->errno) $conn->rollback();
  outJson(['ok'=>false,'msg'=>$e->getMessage()]);
}
