/* global angular, page_title */

angular.module("app").controller('TagsListCtrl', [
    '$scope',
    '$state',
    '$window',
    'uDataParamsTools',
    'TagsService',
    'VentasTagService',
    function ($scope, $state, $window, uDataParamsTools, TagsService, VentasTagService) {
        $window.document.title = page_title + " :: TAGs";
        localStorage.setItem("app_last_state", JSON.stringify({state: $state.current.name, params: null}));
        
        $scope.show_list = false;
        $scope.tags = [];
        $scope.tagsAsignados = [];
        $scope.tagsNoAsignados = [];
        $scope.total_tags = 0;
        $scope.by_page = 20;
        
        $scope.filter_form = {
            status: {alias: 't.status', default: '1'},
            numero_tag: {alias: 't.numero_tag'}
        };

        $scope.unassignTag = function (tag) {
            var data = {
                comentario: 'Baja de TAG'
            };
            TagsService.unassignTag(tag.id, data).then(function () {
                showTagUnassignedMessage(tag);
                loadAllTags();
            });
        };
        
        $scope.imprimirTicket = function (tagId) {
            // Primero verificamos si hay movimientos de recarga para este TAG
            TagsService.getLastRechargeMovement(tagId)
                .then(function (response) {
                    if (response && response.movimiento && response.movimiento.id) {
                        // Si hay un movimiento, usamos la URL para imprimir el ticket con ese ID de movimiento
                        var url = api_url + 'ventas_tag/imprime_ticket_recarga/' + response.movimiento.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');
                        }
                    } else {
                        // Si no hay movimientos, mostramos mensaje de error
                        showNoTicketMessage();
                    }
                })
                .catch(function (error) {
                    console.error('Error al obtener el último movimiento:', error);
                    showNoTicketMessage();
                });
        };

        function showNoTicketMessage() {
            new Noty({
                theme: 'bootstrap-v4',
                type: 'warning',
                text: 'No se encontraron movimientos de recarga para este TAG',
                layout: 'bottomCenter',
                timeout: 3000
            }).show();
        }
                
        function loadAllTags() {
            // Cargar todos los TAGs y luego separarlos en dos listas
            TagsService.getAllTags($scope.by_page, 
                uDataParamsTools.get_page_order_and_filters_for_rest($scope.filter_form))
                .then(function(data_response) {
                    $scope.tags = angular.copy(data_response.tags);
                    $scope.total_tags = data_response.total_tags;
                    
                    // Separar los tags en dos listas: asignados y no asignados
                    $scope.tagsAsignados = $scope.tags.filter(function(tag) {
                        return tag.numero_economico !== null;
                    });
                    
                    $scope.tagsNoAsignados = $scope.tags.filter(function(tag) {
                        return tag.numero_economico === null;
                    });
                    
                    $scope.show_list = true;
                });
        }

        function showTagUnassignedMessage(tag) {
            new Noty({
                theme: 'bootstrap-v4',
                type: 'info',
                text: 'Se ha dado de baja el TAG: <strong>' + tag.numero_tag + '</strong>',
                layout: 'bottomCenter',
                timeout: 3000
            }).show();
        }

        loadAllTags();
    }
]);


angular.module("app").controller('TagAsignarCtrl', [
    '$scope',
    '$state',
    '$stateParams',
    '$window',
    'TagsService',
    'NumerosEconomicosService',
    function ($scope, $state, $stateParams, $window, TagsService, NumerosEconomicosService) {
        $window.document.title = page_title + " :: Asignar TAG";
        
        $scope.tag = null;
        $scope.show_form = false;
        $scope.loading = false;
        $scope.modalidades = [];
        
        $scope.filtros = {
            numero: "",
            modalidad_id: "2",
            estatus: "1"  // Por defecto activos
        };
        
        $scope.numeros_economicos = [];
        $scope.numero_economico_selected = null;
        
        function initData() {
            // Cargar el TAG
            TagsService.getTagById($stateParams.tag_id).then(function (data_response) {
                $scope.tag = data_response.tag;
                $scope.show_form = true;
            });
            
            // Cargar las modalidades para el filtro
            NumerosEconomicosService.getModalidades().then(function(response) {
                $scope.modalidades = response.modalidades;
            });
        }

        $scope.buscarNumeroEconomico = function () {
            if ($scope.filtros.numero) {
                $scope.loading = true;
                $scope.numeros_economicos = [];

                // Asegurar que modalidad_id siempre sea 2 (COLECTIVO)
                $scope.filtros.modalidad_id = "2";
                
                NumerosEconomicosService.buscarNumeroEconomico($scope.filtros)
                    .then(function (data_response) {
                        if (data_response.numeros_economicos && data_response.numeros_economicos.length > 0) {
                            $scope.numeros_economicos = data_response.numeros_economicos;
                        } else {
                            mostrarMensaje('No se encontraron números económicos con los filtros especificados', 'warning');
                        }
                    })
                    .catch(function(error) {
                        mostrarMensaje(error.message || 'Error al buscar números económicos', 'error');
                    })
                    .finally(function() {
                        $scope.loading = false;
                    });
            } else {
                mostrarMensaje('Ingrese al menos un criterio de búsqueda', 'warning');
            }
        };

        $scope.limpiarFiltros = function() {
            $scope.filtros = {
                numero: "",
                modalidad_id: "2",
                estatus: "1"
            };
            $scope.numeros_economicos = [];
        };

        $scope.selectNumeroEconomico = function (numero_economico) {
            $scope.numero_economico_selected = angular.copy(numero_economico);
            $scope.numeros_economicos = [];
        };

        $scope.removeNumeroEconomico = function () {
            $scope.numero_economico_selected = null;
        };

        $scope.submit = function () {
            if (!$scope.numero_economico_selected) {
                return;
            }

            var data = {
                numero_economico_id: $scope.numero_economico_selected.id,
                comentario: "Asignación de TAG"
            };
            
            TagsService.assignTag($scope.tag.id, data)
                .then(function () {
                    mostrarMensaje('TAG asignado correctamente', 'success');
                    $state.go("main.tags_lista");
                })
                .catch(function(error) {
                    mostrarMensaje(error.message || 'Error al asignar el TAG', 'error');
                });
        };

        function mostrarMensaje(mensaje, tipo) {
            new Noty({
                theme: 'bootstrap-v4',
                type: tipo,
                text: mensaje,
                layout: 'bottomCenter',
                timeout: 3000
            }).show();
        }

        initData();
    }
]);

angular.module("app").controller('TagAgregarCtrl', [
    '$scope',
    '$state',
    '$window',
    'TagsService',
    function ($scope, $state, $window, TagsService) {
        $window.document.title = page_title + " :: Agregar TAG";
        
        $scope.tag = {
            numero_tag: ''
        };
        
        $scope.form = {
            numero_tag: ''
        };
        
        $scope.show_form = true;
        
        $scope.submit = function () {
            var data = {
                numero_tag: $scope.form.numero_tag
            };
            
            TagsService.create(data).then(function (response) {
                showSuccessMessage();
                $state.go('main.tags_lista');
            }).catch(function(error) {
                showErrorMessage(error.message || 'Error al crear el TAG');
            });
        };
        
        function showSuccessMessage() {
            new Noty({
                theme: 'bootstrap-v4',
                type: 'success',
                text: 'TAG creado correctamente',
                layout: 'bottomCenter',
                timeout: 3000
            }).show();
        }
        
        function showErrorMessage(message) {
            new Noty({
                theme: 'bootstrap-v4',
                type: 'error',
                text: message,
                layout: 'bottomCenter',
                timeout: 3000
            }).show();
        }
    }
]);
angular.module("app").controller('TagRechargeCtrl', [
    '$scope',
    '$state',
    '$stateParams', // Asegúrate que este parámetro esté incluido
    '$window',
    'TagsService',
    function ($scope, $state, $stateParams, $window, TagsService) { // El orden debe coincidir con la inyección
        $window.document.title = page_title + " :: Recargar TAG";
        
        $scope.tag = null;
        $scope.show_form = false;
        
        $scope.form = {
            monto: '',
            comentario: ''
        };
        
        function initData() {
            TagsService.getTagById($stateParams.tag_id).then(function (data_response) {
                $scope.tag = data_response.tag;
                $scope.show_form = true;
            });
        }
        
        $scope.submit = function () {
            var data = {
                monto: parseFloat($scope.form.monto),
                comentario: $scope.form.comentario || 'Recarga de TAG'
            };
            
            TagsService.rechargeTag($scope.tag.id, data).then(function () {
                showSuccessMessage();
                $state.go('main.tags_lista');
            }).catch(function(error) {
                showErrorMessage(error.message || 'Error al realizar la recarga');
            });
        };
        
        function showSuccessMessage() {
            new Noty({
                theme: 'bootstrap-v4',
                type: 'success',
                text: 'Recarga realizada correctamente',
                layout: 'bottomCenter',
                timeout: 3000
            }).show();
        }
        
        function showErrorMessage(message) {
            new Noty({
                theme: 'bootstrap-v4',
                type: 'error',
                text: message,
                layout: 'bottomCenter',
                timeout: 3000
            }).show();
        }
        
        initData();
    }
]);

// Nuevo controlador para asignar y recargar en un solo paso
angular.module("app").controller('TagAsignarRecargarCtrl', [
    '$scope',
    '$state',
    '$stateParams',
    '$window',
    'TagsService',
    'NumerosEconomicosService',
    function ($scope, $state, $stateParams, $window, TagsService, NumerosEconomicosService) {
        $window.document.title = page_title + " :: Asignar y Recargar TAG";
        
        $scope.tag = null;
        $scope.tag_selected = null;
        $scope.show_form = false;
        $scope.loading = false;
        $scope.procesando = false;
        $scope.step = 1; // 1: Seleccionar TAG, 2: Asignar/Recargar, 3: Crear TAG
        $scope.new_tag = {
            numero_tag: ''
        };
        
        $scope.filtros = {
            numero: "",
            modalidad_id: "2", // Por defecto COLECTIVO
            estatus: "1"       // Por defecto Activos
        };
        
        $scope.tags_disponibles = [];
        $scope.numeros_economicos = [];
        $scope.numero_economico_selected = null;
        
        $scope.form = {
            monto: '',
            comentario: ''
        };
        
        function initData() {
            if ($stateParams.tag_id) {
                if ($stateParams.tag_id === 'nuevo') {
                    // Si el tag_id es 'nuevo', vamos a la pantalla de creación
                    $scope.show_form = true;
                    $scope.step = 3; // Ir al paso de crear TAG
                } else {
                    // Si se proporciona un ID de TAG, cargar ese TAG específico
                    TagsService.getTagById($stateParams.tag_id).then(function (data_response) {
                        $scope.tag = data_response.tag;
                        $scope.show_form = true;
                        $scope.step = 2; // Ir directamente a asignar/recargar
                    });
                }
            } else {
                // Si no se proporciona un ID, mostrar listado de TAGs para seleccionar
                $scope.show_form = true;
                $scope.step = 1;
                // Cargar TAGs activos
                TagsService.getTagsBySaldo('todos').then(function (response) {
                    if (response && response.tags) {
                        $scope.tags_disponibles = response.tags;
                    }
                });
            }
        }
        
        $scope.createTag = function() {
            if (!$scope.new_tag.numero_tag) {
                return;
            }
            
            $scope.procesando = true;
            
            var data = {
                numero_tag: $scope.new_tag.numero_tag
            };
            
            TagsService.create(data)
                .then(function(response) {
                    mostrarMensaje('TAG creado correctamente', 'success');
                    // Buscar el TAG recién creado
                    return TagsService.getTagsBySaldo('todos');
                })
                .then(function(response) {
                    if (response && response.tags) {
                        // Buscar el TAG recién creado (debería ser el último)
                        var nuevoTag = response.tags.find(function(tag) {
                            return tag.numero_tag === $scope.new_tag.numero_tag;
                        });
                        
                        if (nuevoTag) {
                            // Ir directamente a asignar y recargar con el nuevo TAG
                            $state.go('main.tag_asignar_recargar', {tag_id: nuevoTag.id});
                        } else {
                            // Si no se encuentra, volver a la lista
                            $state.go('main.tags_lista');
                        }
                    }
                })
                .catch(function(error) {
                    mostrarMensaje(error.message || 'Error al crear el TAG', 'error');
                })
                .finally(function() {
                    $scope.procesando = false;
                });
        };
        
        $scope.selectTag = function(tag) {
            $scope.tag_selected = angular.copy(tag);
            $state.go('main.tag_asignar_recargar', {tag_id: tag.id});
        };
        
        $scope.goToCreateTag = function() {
            $state.go('main.tag_asignar_recargar', {tag_id: 'nuevo'});
        };
        
        $scope.selectNumeroEconomico = function (numero_economico) {
            $scope.numero_economico_selected = angular.copy(numero_economico);
            $scope.numeros_economicos = [];
        };

        $scope.removeNumeroEconomico = function () {
            $scope.numero_economico_selected = null;
        };
        
        $scope.submit = function () {
            $scope.procesando = true;
            
            // Si el TAG ya tiene número económico, solo hacemos la recarga
            if ($scope.tag.numero_economico) {
                realizarRecarga();
            } else {
                // Si no tiene número económico, primero asignamos y luego recargamos
                asignarTagYRecargar();
            }
        };
        
        function asignarTagYRecargar() {
            var dataAsignacion = {
                numero_economico_id: $scope.numero_economico_selected.id,
                comentario: "Asignación desde módulo de Asignación y Recarga"
            };
            
            TagsService.assignTag($scope.tag.id, dataAsignacion)
                .then(function () {
                    mostrarMensaje('TAG asignado correctamente', 'success');
                    // Ahora realizamos la recarga
                    realizarRecarga();
                })
                .catch(function(error) {
                    mostrarMensaje(error.message || 'Error al asignar el TAG', 'error');
                    $scope.procesando = false;
                });
        }
        
        function realizarRecarga() {
            var dataRecarga = {
                monto: parseFloat($scope.form.monto),
                comentario: $scope.form.comentario || 'Recarga de TAG desde módulo de Asignación y Recarga'
            };
            
            TagsService.rechargeTag($scope.tag.id, dataRecarga)
                .then(function () {
                    mostrarMensaje('Recarga realizada correctamente', 'success');
                    $state.go('main.tags_lista');
                })
                .catch(function(error) {
                    mostrarMensaje(error.message || 'Error al realizar la recarga', 'error');
                })
                .finally(function() {
                    $scope.procesando = false;
                });
        }
        
        $scope.buscarNumeroEconomico = function () {
            if ($scope.filtros.numero) {
                $scope.loading = true;
                $scope.numeros_economicos = [];
                
                // Asegurar que modalidad_id siempre sea 2 (COLECTIVO)
                $scope.filtros.modalidad_id = "2";
                
                NumerosEconomicosService.buscarNumeroEconomico($scope.filtros)
                    .then(function (data_response) {
                        if (data_response.numeros_economicos && data_response.numeros_economicos.length > 0) {
                            $scope.numeros_economicos = data_response.numeros_economicos;
                        } else {
                            mostrarMensaje('No se encontraron números económicos con los filtros especificados', 'warning');
                        }
                    })
                    .catch(function(error) {
                        mostrarMensaje(error.message || 'Error al buscar números económicos', 'error');
                    })
                    .finally(function() {
                        $scope.loading = false;
                    });
            } else {
                mostrarMensaje('Ingrese al menos un criterio de búsqueda', 'warning');
            }
        };
        
        function mostrarMensaje(mensaje, tipo) {
            new Noty({
                theme: 'bootstrap-v4',
                type: tipo,
                text: mensaje,
                layout: 'bottomCenter',
                timeout: 3000
            }).show();
        }
        
        initData();
    }
]);