/* global angular, moment, page_title */

// Controlador principal de Caja
angular.module("app").controller("CajaTagCtrl", [
  "$scope",
  "$window",
  "$state",
  "CajaTagService",
  function ($scope, $window, $state, CajaTagService) {
    $window.document.title = page_title + " :: Caja";

    // Inicialización de variables
    $scope.caja = null;
    $scope.loading = true;
    $scope.filtros = {
      fecha_inicio: moment().format("YYYY-MM-DD"),
      fecha_fin: moment().format("YYYY-MM-DD"),
    };

    $scope.moment_picker_fecha_inicio = moment();
    $scope.moment_picker_fecha_fin = moment();

    $scope.movimientos = [];
    $scope.retiros = [];
    $scope.total_movimientos = 0;
    $scope.total_retiros = 0;
    $scope.mensaje_error = null;

    // Funciones para los date pickers
    $scope.on_change_moment_picker_fecha_inicio = function (newValue) {
      $scope.filtros.fecha_inicio = newValue.format("YYYY-MM-DD");
    };

    $scope.on_change_moment_picker_fecha_fin = function (newValue) {
      $scope.filtros.fecha_fin = newValue.format("YYYY-MM-DD");
    };

    // Obtener estado actual de la caja
    function obtenerEstadoCaja() {
      $scope.loading = true;
      CajaTagService.getEstadoActual()
        .then(function (response) {
          if (response.caja) {
            $scope.caja = response.caja;
            buscarMovimientos();
          } else {
            $scope.caja = null;
            $scope.loading = false;
          }
        })
        .catch(function (error) {
          $scope.mensaje_error =
            error.message || "Error al obtener el estado de la caja";
          mostrarError($scope.mensaje_error);
          $scope.loading = false;
        });
    }

    // Función para abrir caja
    $scope.abrirCaja = function () {
      $scope.loading = true;
      CajaTagService.abrirCaja()
        .then(function (response) {
          mostrarMensajeExito("Caja abierta correctamente");
          obtenerEstadoCaja();
        })
        .catch(function (error) {
          $scope.mensaje_error = error.message || "Error al abrir la caja";
          mostrarError($scope.mensaje_error);
          $scope.loading = false;
        });
    };

    // Función para buscar movimientos
    function buscarMovimientos() {
      var params = {
        caja_id: $scope.caja.id,
        fecha_inicio: $scope.filtros.fecha_inicio,
        fecha_fin: $scope.filtros.fecha_fin,
      };

      CajaTagService.getMovimientosCaja(params)
        .then(function (response) {
          $scope.movimientos = response.movimientos || [];
          $scope.total_movimientos = response.total || 0;

          // También buscar retiros
          return CajaTagService.getRetirosCaja(params);
        })
        .then(function (response) {
          $scope.retiros = response.retiros || [];
          $scope.total_retiros = response.total || 0;
        })
        .catch(function (error) {
          $scope.mensaje_error =
            error.message || "Error al obtener los movimientos";
          mostrarError($scope.mensaje_error);
        })
        .finally(function () {
          $scope.loading = false;
        });
    }

    // Función para buscar con filtros
    $scope.buscarConFiltros = function () {
      if (!$scope.caja) return;
      $scope.loading = true;
      buscarMovimientos();
    };

    // Exportar a Excel
    // Modificar la función exportarExcel en CajaTagCtrl
    $scope.exportarExcel = function () {
      if (!$scope.caja || $scope.movimientos.length === 0) {
        mostrarMensajeInfo("No hay datos para exportar");
        return;
      }

      mostrarMensajeInfo("Generando archivo Excel...");

      // Crear una URL con los parámetros de filtro
      var params = {
        caja_id: $scope.caja.id,
        fecha_inicio: $scope.filtros.fecha_inicio,
        fecha_fin: $scope.filtros.fecha_fin,
      };

      // Crear los parámetros de consulta para la URL
      var queryParams = [];
      for (var key in params) {
        if (
          params[key] !== null &&
          params[key] !== undefined &&
          params[key] !== ""
        ) {
          queryParams.push(key + "=" + encodeURIComponent(params[key]));
        }
      }

      // Construir la URL final
      var baseUrl = api_url.replace(/\/+$/, "");
      var url = baseUrl + "/caja/export_movimientos_excel";
      if (queryParams.length > 0) {
        url += "?" + queryParams.join("&");
      }

      // Crear un elemento <a> oculto para descargar
      var link = document.createElement("a");
      link.href = url;
      link.download = "movimientos_caja.xlsx";
      link.style.display = "none";
      document.body.appendChild(link);

      // Simular clic en el enlace para iniciar descarga
      link.click();

      // Limpiar - eliminar el enlace de la página
      setTimeout(function () {
        document.body.removeChild(link);
      }, 100);
    };
    $scope.exportarPdf = function () {
      if (!$scope.caja || $scope.movimientos.length === 0) {
        mostrarMensajeInfo("No hay datos para exportar");
        return;
      }

      mostrarMensajeInfo("Generando archivo PDF...");

      // Crear una URL con los parámetros de filtro
      var params = {
        caja_id: $scope.caja.id,
        fecha_inicio: $scope.filtros.fecha_inicio,
        fecha_fin: $scope.filtros.fecha_fin,
      };

      // Crear los parámetros de consulta para la URL
      var queryParams = [];
      for (var key in params) {
        if (
          params[key] !== null &&
          params[key] !== undefined &&
          params[key] !== ""
        ) {
          queryParams.push(key + "=" + encodeURIComponent(params[key]));
        }
      }

      // Construir la URL final
      var baseUrl = api_url.replace(/\/+$/, "");
      var url = baseUrl + "/caja/export_movimientos_pdf";
      if (queryParams.length > 0) {
        url += "?" + queryParams.join("&");
      }

      // Crear un elemento <a> oculto para descargar
      var link = document.createElement("a");
      link.href = url;
      link.download = "movimientos_caja.pdf";
      link.target = "_blank";
      document.body.appendChild(link);

      // Simular clic en el enlace para iniciar descarga
      link.click();

      // Limpiar - eliminar el enlace de la página
      setTimeout(function () {
        document.body.removeChild(link);
      }, 100);
    };

    // Imprimir comprobante de retiro
    $scope.imprimirRetiro = function (retiro_id) {
      var url = CajaTagService.getUrlPrintRetiro(retiro_id);

      // Detectar si es Android para impresora térmica
      let ua = navigator.userAgent.toLowerCase();
      let isAndroid = ua.indexOf("android") > -1;

      if (isAndroid) {
        document.location = "rawbt:url:base64," + btoa(url);
      } else {
        // Abrir en nueva ventana e imprimir
        $window.open(url, "_blank");
      }
    };

    // Ir a la pantalla de retiro
    $scope.irARetiro = function () {
      $state.go("main.caja_tag_retiro");
    };

    // Ir a la pantalla de arqueo
    $scope.irAArqueo = function () {
      $state.go("main.caja_tag_arqueo");
    };

    // Ir a la pantalla de cierre
    $scope.irACierre = function () {
      $state.go("main.caja_tag_cierre");
    };

    // Funciones de mensajes
    function mostrarError(mensaje) {
      new Noty({
        theme: "bootstrap-v4",
        type: "error",
        text: mensaje,
        layout: "topRight",
        timeout: 3000,
      }).show();
    }

    function mostrarMensajeExito(mensaje) {
      new Noty({
        theme: "bootstrap-v4",
        type: "success",
        text: mensaje,
        layout: "topRight",
        timeout: 3000,
      }).show();
    }

    function mostrarMensajeInfo(mensaje) {
      new Noty({
        theme: "bootstrap-v4",
        type: "info",
        text: mensaje,
        layout: "topRight",
        timeout: 3000,
      }).show();
    }

    // Inicialización
    obtenerEstadoCaja();
  },
]);

// Controlador para retiro de caja
angular.module("app").controller("CajaRetiroCtrl", [
  "$scope",
  "$window",
  "$state",
  "CajaTagService",
  function ($scope, $window, $state, CajaTagService) {
    $window.document.title = page_title + " :: Retiro de Caja";

    // Inicialización
    $scope.caja = null;
    $scope.loading = true;
    $scope.form = {
      monto: "",
      concepto: "",
      observaciones: "",
    };

    // Obtener estado de la caja
    function obtenerEstadoCaja() {
      $scope.loading = true;
      CajaTagService.getEstadoActual()
        .then(function (response) {
          if (response.caja) {
            $scope.caja = response.caja;
          } else {
            $scope.caja = null;
            mostrarError("No hay caja abierta actualmente");
            $state.go("main.caja_tag");
          }
        })
        .catch(function (error) {
          mostrarError(
            error.message || "Error al obtener el estado de la caja"
          );
          $state.go("main.caja_tag");
        })
        .finally(function () {
          $scope.loading = false;
        });
    }

    // Enviar formulario
    $scope.submit = function () {
      if (!$scope.caja) {
        mostrarError("No hay caja abierta");
        return;
      }

      // Validar que el formulario tenga los campos requeridos
      if (!$scope.form.monto || !$scope.form.concepto) {
        mostrarError("El monto y el concepto son campos obligatorios");
        return;
      }

      // Validar que el monto sea un número válido
      var monto = parseFloat($scope.form.monto);
      if (isNaN(monto) || monto <= 0) {
        mostrarError("El monto debe ser un número mayor a cero");
        return;
      }

      // Validar que el monto no sea mayor al saldo
      if (monto > $scope.caja.saldo) {
        mostrarError("El monto a retirar es mayor al saldo disponible");
        return;
      }

      // Mostrar mensaje de carga
      $scope.loading = true;

      // Realizar la petición
      CajaTagService.retiroCaja($scope.form)
        .then(function (response) {
          mostrarMensajeExito("Retiro realizado correctamente");

          // Ver si tenemos un ID de retiro para imprimir
          if (response.retiro_id) {
            // Preguntar si desea imprimir el comprobante
            if (confirm("¿Desea imprimir el comprobante de retiro?")) {
              var url = CajaTagService.getUrlPrintRetiro(response.retiro_id);
              $window.open(url, "_blank");
            }
          }

          // Redirigir a la página principal de caja
          $state.go("main.caja_tag");
        })
        .catch(function (error) {
          // Mostrar mensaje de error
          mostrarError(error.message || "Error al realizar el retiro");
          console.error("Error en retiro:", error);
        })
        .finally(function () {
          // Ocultar mensaje de carga
          $scope.loading = false;
        });
    };

    // Cancelar y volver
    $scope.cancelar = function () {
      $state.go("main.caja_tag");
    };

    // Funciones de mensajes
    function mostrarError(mensaje) {
      new Noty({
        theme: "bootstrap-v4",
        type: "error",
        text: mensaje,
        layout: "topRight",
        timeout: 3000,
      }).show();
    }

    function mostrarMensajeExito(mensaje) {
      new Noty({
        theme: "bootstrap-v4",
        type: "success",
        text: mensaje,
        layout: "topRight",
        timeout: 3000,
      }).show();
    }

    // Inicialización
    obtenerEstadoCaja();
  },
]);

// Controlador para arqueo de caja
angular.module("app").controller("CajaArqueoCtrl", [
  "$scope",
  "$window",
  "$state",
  "CajaTagService",
  function ($scope, $window, $state, CajaTagService) {
    $window.document.title = page_title + " :: Arqueo de Caja";

    // Inicialización
    $scope.caja = null;
    $scope.loading = true;
    $scope.form = {
      monto_fisico: "",
      observaciones: "",
    };
    $scope.diferencia = 0;

    // Obtener estado de la caja
    function obtenerEstadoCaja() {
      $scope.loading = true;
      CajaTagService.getEstadoActual()
        .then(function (response) {
          if (response.caja) {
            $scope.caja = response.caja;
          } else {
            $scope.caja = null;
            mostrarError("No hay caja abierta actualmente");
            $state.go("main.caja_tag");
          }
        })
        .catch(function (error) {
          mostrarError(
            error.message || "Error al obtener el estado de la caja"
          );
          $state.go("main.caja_tag");
        })
        .finally(function () {
          $scope.loading = false;
        });
    }

    // Calcular diferencia al cambiar el monto físico
    $scope.calcularDiferencia = function () {
      if (!$scope.caja || !$scope.form.monto_fisico) {
        $scope.diferencia = 0;
        return;
      }

      var monto_fisico = parseFloat($scope.form.monto_fisico);
      $scope.diferencia = monto_fisico - $scope.caja.saldo;
    };

    // Enviar formulario
    $scope.submit = function () {
      if (!$scope.caja) {
        mostrarError("No hay caja abierta");
        return;
      }

      $scope.loading = true;
      CajaTagService.arqueoCaja($scope.form)
        .then(function (response) {
          mostrarMensajeExito("Arqueo realizado correctamente");
          $state.go("main.caja_tag");
        })
        .catch(function (error) {
          mostrarError(error.message || "Error al realizar el arqueo");
        })
        .finally(function () {
          $scope.loading = false;
        });
    };

    // Cancelar y volver
    $scope.cancelar = function () {
      $state.go("main.caja_tag");
    };

    // Funciones de mensajes
    function mostrarError(mensaje) {
      new Noty({
        theme: "bootstrap-v4",
        type: "error",
        text: mensaje,
        layout: "topRight",
        timeout: 3000,
      }).show();
    }

    function mostrarMensajeExito(mensaje) {
      new Noty({
        theme: "bootstrap-v4",
        type: "success",
        text: mensaje,
        layout: "topRight",
        timeout: 3000,
      }).show();
    }

    // Inicialización
    obtenerEstadoCaja();
  },
]);

// Controlador para cierre de caja
angular.module("app").controller("CajaCierreCtrl", [
  "$scope",
  "$window",
  "$state",
  "CajaTagService",
  function ($scope, $window, $state, CajaTagService) {
    $window.document.title = page_title + " :: Cierre de Caja";

    // Inicialización
    $scope.caja = null;
    $scope.loading = true;
    $scope.form = {
      observaciones: "",
    };
    $scope.movimientos = [];

    // Obtener estado de la caja
    function obtenerEstadoCaja() {
      $scope.loading = true;
      CajaTagService.getEstadoActual()
        .then(function (response) {
          if (response.caja) {
            $scope.caja = response.caja;
            // Obtener movimientos de la caja para mostrar resumen
            return CajaTagService.getMovimientosCaja({
              caja_id: $scope.caja.id,
            });
          } else {
            $scope.caja = null;
            mostrarError("No hay caja abierta actualmente");
            $state.go("main.caja_tag");
            return Promise.reject();
          }
        })
        .then(function (response) {
          $scope.movimientos = response.movimientos || [];
        })
        .catch(function (error) {
          if (error) {
            mostrarError(
              error.message || "Error al obtener el estado de la caja"
            );
            $state.go("main.caja_tag");
          }
        })
        .finally(function () {
          $scope.loading = false;
        });
    }

    // Enviar formulario
    $scope.submit = function () {
      if (!$scope.caja) {
        mostrarError("No hay caja abierta");
        return;
      }

      // Confirmar acción
      if (
        !confirm(
          "¿Está seguro de cerrar la caja? Esta acción no se puede deshacer."
        )
      ) {
        return;
      }

      $scope.loading = true;
      CajaTagService.cerrarCaja($scope.form)
        .then(function (response) {
          mostrarMensajeExito("Caja cerrada correctamente");
          $state.go("main.caja_tag");
        })
        .catch(function (error) {
          mostrarError(error.message || "Error al cerrar la caja");
        })
        .finally(function () {
          $scope.loading = false;
        });
    };

    // Cancelar y volver
    $scope.cancelar = function () {
      $state.go("main.caja_tag");
    };

    // Calcular total por tipo de movimiento
    $scope.calcularTotalPorTipo = function (tipo) {
      if (!$scope.movimientos || $scope.movimientos.length === 0) {
        return 0;
      }

      return $scope.movimientos
        .filter(function (mov) {
          return mov.tipo_movimiento === tipo;
        })
        .reduce(function (total, mov) {
          return total + parseFloat(mov.monto);
        }, 0);
    };

    // Funciones de mensajes
    function mostrarError(mensaje) {
      new Noty({
        theme: "bootstrap-v4",
        type: "error",
        text: mensaje,
        layout: "topRight",
        timeout: 3000,
      }).show();
    }

    function mostrarMensajeExito(mensaje) {
      new Noty({
        theme: "bootstrap-v4",
        type: "success",
        text: mensaje,
        layout: "topRight",
        timeout: 3000,
      }).show();
    }

    // Inicialización
    obtenerEstadoCaja();
  },
]);
