// =========================
// Helpers / APIs
// =========================
const API_REP = '../../Controlador/Ctrl_Administrador/MySQL_Repuestos.php';
const API_MOV = '../../Controlador/Ctrl_Administrador/MySQL_Rep_Movimientos.php';

// =========================
// Cargar selects (categoría, UM, almacén, proveedor)
// =========================
function cargarSelectsRepuestos() {
  return $.getJSON(API_REP, { action: 'listar_selects' }).then(r => {
    if (!r || !r.ok) {
      console.warn('Error listar_selects', r);
      return;
    }

    const $cat = $('#id_categoria');
    const $um = $('#id_unidad');
    const $alm = $('#id_almacen_default');
    const $almMov = $('#id_almacen');
    const $prov = $('#id_proveedor');

    // Categorías
    $cat.empty().append('<option value="">-- Sin categoría --</option>');
    (r.categorias || []).forEach(c => {
      $cat.append(`<option value="${c.id}">${c.nombre}</option>`);
    });

    // Unidades
    $um.empty();
    (r.unidades || []).forEach(u => {
      $um.append(`<option value="${u.id}">${u.texto}</option>`);
    });

    // Almacenes
    $alm.empty().append('<option value="">-- Seleccionar --</option>');
    $almMov.empty();
    (r.almacenes || []).forEach(a => {
      $alm.append(`<option value="${a.id}">${a.nombre}</option>`);
      $almMov.append(`<option value="${a.id}">${a.nombre}</option>`);
    });

    // Proveedores
    $prov.empty().append('<option value="">-- Sin proveedor --</option>');
    if (Array.isArray(r.proveedores)) {
      r.proveedores.forEach(p => {
        $prov.append(`<option value="${p.id}">${p.nombre}</option>`);
      });
    }

    // Reaplicar Select2 con parent fijo
    $('.select2-cat').select2({ dropdownParent: $('#modalRepuesto') });
    $('.select2-um').select2({ dropdownParent: $('#modalRepuesto') });
    $('.select2-alm').select2({ dropdownParent: $('#modalRepuesto') });
    $('.select2-prov').select2({ dropdownParent: $('#modalRepuesto') });
  });
}

/* ======================= CREAR CATÁLOGOS AL VUELO ======================= */

function crearCategoriaAlVuelo() {
  const modalRepuestoAbierto = $('#modalRepuesto').hasClass('show');
  if (modalRepuestoAbierto) $('#modalRepuesto').modal('hide');

  Swal.fire({
    title: 'Nueva Categoría',
    html: `
      <div class="mb-2">
        <input id="swal_cat_nom" type="text" class="form-control" placeholder="Nombre">
      </div>
      <div>
        <input id="swal_cat_des" type="text" class="form-control" placeholder="Descripción (opcional)">
      </div>
    `,
    focusConfirm: false,
    showCancelButton: true,
    confirmButtonText: 'Guardar',
    cancelButtonText: 'Cancelar',
    didOpen: () => {
      document.getElementById('swal_cat_nom').focus();
    },
    preConfirm: () => {
      const nombre = document.getElementById('swal_cat_nom').value.trim();
      const descripcion = document.getElementById('swal_cat_des').value.trim();
      if (!nombre) {
        Swal.showValidationMessage('Ingresa un nombre para la categoría');
        return false;
      }
      return { nombre, descripcion };
    }
  }).then(res => {
    if (modalRepuestoAbierto) $('#modalRepuesto').modal('show');
    if (!res.isConfirmed) return;

    const payload = {
      action: 'crear_categoria',
      nombre: res.value.nombre,
      descripcion: res.value.descripcion
    };
    $.post(API_REP, payload, function (r) {
      if (!r.ok) {
        return Swal.fire('Atención', r.msg || 'No se pudo crear la categoría', 'warning');
      }
      cargarSelectsRepuestos().then(() => {
        $('#id_categoria').val(r.id).trigger('change');
      });
      Swal.fire({
        icon: 'success',
        title: 'Categoría creada correctamente',
        showConfirmButton: false,
        timer: 2000
      });

    }, 'json');
  });
}

function crearUnidadAlVuelo() {
  const modalRepuestoAbierto = $('#modalRepuesto').hasClass('show');
  if (modalRepuestoAbierto) $('#modalRepuesto').modal('hide');

  Swal.fire({
    title: 'Nueva Unidad',
    html: `
      <div class="mb-2">
        <input id="swal_um_nom" type="text" class="form-control" placeholder="Nombre (p.ej. Unidad)">
      </div>
      <div>
        <input id="swal_um_abr" type="text" class="form-control" placeholder="Abreviatura (p.ej. UND)">
      </div>
    `,
    focusConfirm: false,
    showCancelButton: true,
    confirmButtonText: 'Guardar',
    cancelButtonText: 'Cancelar',
    didOpen: () => {
      document.getElementById('swal_um_nom').focus();
    },
    preConfirm: () => {
      const nombre = document.getElementById('swal_um_nom').value.trim();
      const abreviatura = document.getElementById('swal_um_abr').value.trim();
      if (!nombre || !abreviatura) {
        Swal.showValidationMessage('Completa Nombre y Abreviatura');
        return false;
      }
      return { nombre, abreviatura };
    }
  }).then(res => {
    if (modalRepuestoAbierto) $('#modalRepuesto').modal('show');
    if (!res.isConfirmed) return;

    const payload = {
      action: 'crear_unidad',
      nombre: res.value.nombre,
      abreviatura: res.value.abreviatura
    };
    $.post(API_REP, payload, function (r) {
      if (!r.ok) {
        return Swal.fire('Atención', r.msg || 'No se pudo crear la unidad', 'warning');
      }
      cargarSelectsRepuestos().then(() => {
        $('#id_unidad').val(r.id).trigger('change');
      });
      Swal.fire({
        icon: 'success',
        title: 'Unidad creada correctamente',
        showConfirmButton: false,
        timer: 2000
      });

    }, 'json');
  });
}

function crearAlmacenAlVuelo() {
  const modalRepuestoAbierto = $('#modalRepuesto').hasClass('show');
  if (modalRepuestoAbierto) $('#modalRepuesto').modal('hide');

  Swal.fire({
    title: 'Nuevo Almacén',
    html: `
      <div class="mb-2">
        <input id="swal_alm_nom" type="text" class="form-control" placeholder="Nombre">
      </div>
      <div class="mb-2">
        <input id="swal_alm_cod" type="text" class="form-control" placeholder="Código (opcional)">
      </div>
      <div>
        <input id="swal_alm_ubi" type="text" class="form-control" placeholder="Ubicación (opcional)">
      </div>
    `,
    focusConfirm: false,
    showCancelButton: true,
    confirmButtonText: 'Guardar',
    cancelButtonText: 'Cancelar',
    didOpen: () => {
      document.getElementById('swal_alm_nom').focus();
    },
    preConfirm: () => {
      const nombre = document.getElementById('swal_alm_nom').value.trim();
      const codigo = document.getElementById('swal_alm_cod').value.trim();
      const ubicacion = document.getElementById('swal_alm_ubi').value.trim();
      if (!nombre) {
        Swal.showValidationMessage('Ingresa un nombre para el almacén');
        return false;
      }
      return { nombre, codigo, ubicacion };
    }
  }).then(res => {
    if (modalRepuestoAbierto) $('#modalRepuesto').modal('show');
    if (!res.isConfirmed) return;

    const payload = {
      action: 'crear_almacen',
      nombre: res.value.nombre,
      codigo: res.value.codigo,
      ubicacion: res.value.ubicacion
    };
    $.post(API_REP, payload, function (r) {
      if (!r.ok) {
        return Swal.fire('Atención', r.msg || 'No se pudo crear el almacén', 'warning');
      }
      cargarSelectsRepuestos().then(() => {
        $('#id_almacen_default').val(r.id).trigger('change');
      });
      Swal.fire({
        icon: 'success',
        title: 'Almacén creado correctamente',
        showConfirmButton: false,
        timer: 2000
      });

    }, 'json');
  });
}

// Nuevo: crear proveedor al vuelo
function crearProveedorAlVuelo() {
  const modalRepuestoAbierto = $('#modalRepuesto').hasClass('show');
  if (modalRepuestoAbierto) $('#modalRepuesto').modal('hide');

  Swal.fire({
    title: 'Nuevo Proveedor',
    html: `
      <div class="mb-2">
        <input id="swal_prov_nom" type="text" class="form-control" placeholder="Nombre">
      </div>
      <div class="mb-2">
        <input id="swal_prov_ruc" type="text" class="form-control" placeholder="RUC (opcional)">
      </div>
      <div>
        <input id="swal_prov_tel" type="text" class="form-control" placeholder="Teléfono (opcional)">
      </div>
    `,
    focusConfirm: false,
    showCancelButton: true,
    confirmButtonText: 'Guardar',
    cancelButtonText: 'Cancelar',
    didOpen: () => {
      document.getElementById('swal_prov_nom').focus();
    },
    preConfirm: () => {
      const nombre = document.getElementById('swal_prov_nom').value.trim();
      const ruc = document.getElementById('swal_prov_ruc').value.trim();
      const telefono = document.getElementById('swal_prov_tel').value.trim();
      if (!nombre) {
        Swal.showValidationMessage('Ingresa un nombre para el proveedor');
        return false;
      }
      return { nombre, ruc, telefono };
    }
  }).then(res => {
    if (modalRepuestoAbierto) $('#modalRepuesto').modal('show');
    if (!res.isConfirmed) return;

    const payload = {
      action: 'crear_proveedor',
      nombre: res.value.nombre,
      ruc: res.value.ruc,
      telefono: res.value.telefono
    };
    $.post(API_REP, payload, function (r) {
      if (!r.ok) {
        return Swal.fire('Atención', r.msg || 'No se pudo crear el proveedor', 'warning');
      }
      cargarSelectsRepuestos().then(() => {
        $('#id_proveedor').val(r.id).trigger('change');
      });
      Swal.fire({
        icon: 'success',
        title: 'Proveedor creado correctamente',
        showConfirmButton: false,
        timer: 2000
      });

    }, 'json');
  });
}

/* ======================= FORMULARIO REPUESTO ======================= */

function limpiarFormRepuesto() {
  $('#rep_id').val('');
  $('#sku').val('');
  $('#nombre').val('');
  $('#id_proveedor').val('').trigger('change');
  $('#id_categoria').val('').trigger('change');
  $('#id_unidad').val('').trigger('change');
  $('#id_almacen_default').val('').trigger('change');
  $('#stock_min').val('0');
  $('#stock_max').val('0');
  $('#imagen').val(''); // limpiar input file
  $('#imagen_actual').val('');
}

function abrirCrear() {
  $('#tituloModal').text('Nuevo Repuesto');
  limpiarFormRepuesto();
  $('#modalRepuesto').modal('show');
}

function abrirEditar(id) {
  $('#tituloModal').text('Editar Repuesto');
  limpiarFormRepuesto();

  $.getJSON(API_REP, { action: 'obtener', id }, function (r) {
    if (!r.ok) {
      return Swal.fire('Error', 'No se pudo cargar el repuesto', 'error');
    }
    const d = r.data;
    $('#rep_id').val(d.id);
    $('#sku').val(d.sku);
    $('#nombre').val(d.nombre);
    $('#id_proveedor').val(d.id_proveedor || '').trigger('change');
    $('#id_categoria').val(d.id_categoria || '').trigger('change');
    $('#id_unidad').val(d.id_unidad || '').trigger('change');
    $('#id_almacen_default').val(d.id_almacen_default || '').trigger('change');
    $('#stock_min').val(d.stock_min);
    $('#stock_max').val(d.stock_max);
    $('#imagen').val('');
    $('#imagen_actual').val(d.imagen || '');
    $('#modalRepuesto').modal('show');
  });
}

/* ======================= MOVIMIENTOS ======================= */

function abrirMovimiento({ id, sku, nombre }) {
  $('#mov_id_repuesto').val(id);
  $('#mov_repuesto_txt').text(`${sku} - ${nombre}`);
  $('#tipo').val('INGRESO');
  $('#cantidad').val('');
  $('#costo_unit').val('0');
  $('#ref_tipo').val('');
  $('#ref_id').val('');
  $('#observacion').val('');
  $('#modalMovimiento').modal('show');
}

/**
 * Guardar repuesto (crear/actualizar) usando FormData
 */
function guardarRepuesto(e) {
  e.preventDefault();

  const esNuevo = !$('#rep_id').val();
  const action = esNuevo ? 'crear' : 'actualizar';

  const formData = new FormData(document.getElementById('formRepuesto'));
  formData.append("action", action);

  $.ajax({
    url: API_REP,
    type: "POST",
    data: formData,
    contentType: false,
    processData: false,
    dataType: "json",
    success: function (r) {
      if (!r.ok) {
        Swal.fire('Atención', r.msg || 'No se pudo guardar', 'warning');
        return;
      }
      Swal.fire({
        icon: 'success',
        title: r.msg || 'Guardado',
        showConfirmButton: false,
        timer: 2000
      });

      $('#modalRepuesto').modal('hide');
      $('#tablaRepuestos').DataTable().ajax.reload(null, false);
    },
    error: function () {
      Swal.fire("Error", "No se pudo procesar la solicitud", "error");
    }
  });
}

function registrarMovimiento(e) {
  e.preventDefault();

  const tipo     = $('#tipo').val();
  const cantidad = parseFloat($('#cantidad').val() || '0');
  const costo    = parseFloat($('#costo_unit').val() || '0');

  if (!tipo) {
    Swal.fire('Atención', 'Selecciona un tipo de movimiento', 'warning');
    return;
  }
  if (isNaN(cantidad) || cantidad <= 0) {
    Swal.fire('Atención', 'La cantidad debe ser mayor a 0', 'warning');
    return;
  }

  // Solo INGRESO obliga costo > 0
  if (tipo === 'INGRESO' && (isNaN(costo) || costo <= 0)) {
    Swal.fire('Atención', 'El costo es obligatorio para Ingreso', 'warning');
    return;
  }

  // Mapear tipo -> action que entiende el PHP
  let action = '';
  if (tipo === 'INGRESO') {
    action = 'ingreso';
  } else if (tipo === 'SALIDA') {
    action = 'salida';
  } else if (tipo === 'AJUSTE+') {
    action = 'ajuste_mas';
  } else if (tipo === 'AJUSTE-') {
    action = 'ajuste_menos';
  } else {
    Swal.fire('Atención', 'Tipo de movimiento no reconocido', 'warning');
    return;
  }

  const payload = $('#formMovimiento').serialize() + '&action=' + encodeURIComponent(action);

  $.post(API_MOV, payload, function (r) {
    if (!r.ok) {
      return Swal.fire('Atención', r.msg || 'No se pudo registrar', 'warning');
    }
    Swal.fire({
      icon: 'success',
      title: 'Movimiento registrado',
      showConfirmButton: false,
      timer: 2000
    });

    $('#modalMovimiento').modal('hide');
    $('#tablaRepuestos').DataTable().ajax.reload(null, false);
  }, 'json');
}


/* ======================= EVENTOS LISTA / BOTONES ======================= */

function bindEventosLista() {
  // Crear (botón principal u otros)
  $(document).on('click', '.btn-add', function () {
    abrirCrear();
  });

  // Editar (tabla y tarjetas)
  $(document).on('click', '.btn-edit', function () {
    const id = $(this).data('id');
    if (!id) return;
    abrirEditar(id);
  });

  // Movimiento (tabla y tarjetas)
  $(document).on('click', '.btn-mov', function () {
    const id     = $(this).data('id');
    const sku    = $(this).data('sku');
    const nombre = $(this).data('nombre');
    if (!id) return;
    abrirMovimiento({ id, sku, nombre });
  });

  // Eliminar (tabla y tarjetas)
  $(document).on('click', '.btn-del', function () {
    const id = $(this).data('id');
    if (!id) return;

    Swal.fire({
      title: '¿Eliminar repuesto?',
      text: 'No podrás revertirlo. Si tiene movimientos, no se eliminará.',
      icon: 'warning',
      showCancelButton: true,
      confirmButtonText: 'Sí, eliminar',
      cancelButtonText: 'Cancelar'
    }).then(res => {
      if (!res.isConfirmed) return;
      $.post(API_REP, { action: 'eliminar', id }, function (r) {
        if (!r.ok) return Swal.fire('Atención', r.msg || 'No se pudo eliminar', 'warning');
        Swal.fire({
          icon: 'success',
          title: 'Eliminado',
          showConfirmButton: false,
          timer: 2000
        });

        $('#tablaRepuestos').DataTable().ajax.reload(null, false);
      }, 'json');
    });
  });

  // Ver imagen (tabla y tarjetas)
  $(document).on('click', '.btn-img', function () {
    const fileName = $(this).data('img');
    if (!fileName) return;

    const url = `../../Modelo/Archivos_Media/Repuestos/${fileName}`;

    Swal.fire({
      html: `
        <div style="text-align:center">
          <img src="${url}" alt="Imagen repuesto" style="max-width:100%; max-height:400px; border-radius:8px;">
        </div>
      `,
      width: 600,
      showCloseButton: true,
      showConfirmButton: false
    });
  });
}

/* ======================= INIT ======================= */

$(document).ready(function () {
  // Cargar combos al inicio
  cargarSelectsRepuestos();

  // Select2 al abrir modales (por si se abre antes de terminar la carga)
  $('#modalRepuesto').on('shown.bs.modal', () => {
    $('.select2-cat,.select2-um,.select2-alm,.select2-prov').select2({
      dropdownParent: $('#modalRepuesto')
    });
  });
  $('#modalMovimiento').on('shown.bs.modal', () => {
    $('#id_almacen').select2({ dropdownParent: $('#modalMovimiento') });
  });

  // Reglas: costo requerido en Ingreso/Ajuste+
  $('#tipo').on('change', function () {
    const t = $(this).val();
    const $c = $('#costo_unit');
    if (t === 'INGRESO' || t === 'AJUSTE+') {
      $c.prop('required', true);
    } else {
      $c.prop('required', false);
    }
  });

  // Submits
  $('#formRepuesto').on('submit', guardarRepuesto);
  $('#formMovimiento').on('submit', registrarMovimiento);

  // Eventos tabla / tarjetas / botones
  bindEventosLista();

  // Botones [+] para crear catálogos al vuelo
  $(document).on('click', '#btnAddCategoria', crearCategoriaAlVuelo);
  $(document).on('click', '#btnAddUnidad', crearUnidadAlVuelo);
  $(document).on('click', '#btnAddAlmacen', crearAlmacenAlVuelo);
  $(document).on('click', '#btnAddProveedor', crearProveedorAlVuelo);

  /* --------- Toggle Tabla ↔ Tarjetas + vista automática en móvil --------- */
  const $tablaWrap  = $('#tablaResponsive');
  const $cardsWrap  = $('#tarjetasResponsive');
  const $toggleBtn  = $('#toggleViewBtn');

  function mostrarTarjetas() {
    $tablaWrap.addClass('d-none');
    $cardsWrap.removeClass('d-none');
    if ($toggleBtn.length) $toggleBtn.text('Ver como tabla');
  }

  function mostrarTabla() {
    $cardsWrap.addClass('d-none');
    $tablaWrap.removeClass('d-none');
    if ($toggleBtn.length) $toggleBtn.text('Ver como tarjetas');
  }

  // Click del botón toggle
  $toggleBtn.on('click', function () {
    const tablaVisible = !$tablaWrap.hasClass('d-none');
    if (tablaVisible) {
      mostrarTarjetas();
    } else {
      mostrarTabla();
    }
  });

  // Vista automática según tamaño de pantalla
  function ajustarVistaPorTamaño() {
    const esMovil = window.matchMedia('(max-width: 767.98px)').matches;
    if (esMovil) {
      // En móvil, por defecto mostrar tarjetas
      mostrarTarjetas();
    } else {
      // En escritorio, por defecto mostrar tabla
      mostrarTabla();
    }
  }

  ajustarVistaPorTamaño();
  window.matchMedia('(max-width: 767.98px)').addEventListener('change', ajustarVistaPorTamaño);
});

// === Fix desalineo inicial de la cabecera DataTables ===
$(window).on('load', function () {
  if ($.fn.DataTable && $.fn.DataTable.isDataTable('#tablaRepuestos')) {
    $('#tablaRepuestos').DataTable().columns.adjust().draw(false);
  }
});
