(function () {
    'use strict';

    angular
        .module('app')
        .controller('CadastroPaineisController', CadastroPaineisController);

    CadastroPaineisController.$inject = ['$scope', 'Consulta', 'Comando', '$location', '$routeParams', 'MenuService'];

    function CadastroPaineisController($scope, Consulta, Comando, $location, $routeParams, MenuService) {

        FecharTodasMensagens();

        $scope.$parent.DestinoMessage = "Painel";
        $scope.Edicao = $routeParams.id != null;

        /// Lista de funçãoes cadastro de paineis
        $scope.SelecionarDispositivo = SelecionarDispositivo;
        $scope.SelecionarTerminal = SelecionarTerminal;
        $scope.SelecionarTemplate = SelecionarTemplate;
        $scope.SelecionarCheckLinha = SelecionarCheckLinha;
        $scope.Salvar = Salvar;
        $scope.SelecionarTodasLinhas = SelecionarTodasLinhas;
        $scope.filtarPorLocal = filtarPorLocal;
        $scope.clickAutoComplete = clickAutoComplete;
        $scope.keyDownAutoComplete = keyDownAutoComplete;

        /// Variaveis de interface
        $scope.filtroLocal = '';
        $scope.Terminais = null;
        $scope.Linhas = null;
        $scope.Dispositivos = null;
        $scope.Templates = null;
        $scope.Identificador = 0;
        $scope.SelecionarTodos = false;
        $scope.CodigoPainel = $routeParams.id;
        //$scope.dispositivoSelecionado = '';
        //$scope.templateSelecionado = '';

        $scope.LinhasSelecionadas = {};

        $scope.Obrigatorio = {
            Dispositivo: false,
            Local: false,
            Template: false
        };

        /// Init controller
        $scope.$on('$viewContentLoaded', function () {
            ConsultaBD();
            if ($scope.CodigoPainel) {
                CarregarPainelPorCodigo();
            }
            //MenuService.Hide();
        });

        /// Funções privadas
        function ConsultaBD() {
            Consulta.ConsPaineisTemplates(
                function sucesso(data) {
                    $scope.Templates = data.data;
                    ConsultaDispositivo();
                },
                function erro(erro) { $scope.Templates = null; }
            );
        };

        function ConsultaDispositivo() {
            Consulta.ConsPaineisDispositivo(
                function sucesso(data) {
                    $scope.Dispositivos = data.data;
                    ConsultaTerminais();
                },
                function erro(erro) { $scope.Dispositivos = null; }
            );
        };

        function ConsultaTerminais() {
            Consulta.ConsPaineisTerminais(
                function sucesso(data) {
                    $scope.Terminais = data.data;
                    $scope.TerminaisAux = data.data;
                },
                function erro(erro) { $scope.Terminais = null; }
            );
        };

        /// Funções
        function SelecionarDispositivo(dispositivo) {
            if (dispositivo) {
                var dispositivoObjeto = $scope.Dispositivos.find((item) => item.Codigo == dispositivo);
                $scope.Obrigatorio.Dispositivo = false;
                $scope.Identificador = dispositivoObjeto.Identificador;
                $scope.CodigoDispositivo = dispositivoObjeto.Codigo;
                $scope.DescricaoDispositivo = dispositivoObjeto.Descricao;
            } else {
                $scope.Identificador = null;
                $scope.CodigoDispositivo = null;
                $scope.DescricaoDispositivo = null;
            }
        };

        function SelecionarTerminal(terminal) {
            if (terminal) {
                $scope.Obrigatorio.Local = false;
                $scope.CodigoLocal = terminal.Codigo;
                $scope.DescricaoLocal = terminal.Descricao;
                $scope.filtroLocal = $scope.DescricaoLocal;
                $('#listAutoComplete').hide();
                ConsultarLinhas(terminal.Codigo);
            } else {
                $scope.CodigoLocal = null;
                $scope.DescricaoLocal = null;
                $scope.Linhas = null;
            }
        };

        function SelecionarTemplate(template) {

            if (template) {
                var templateObjeto = $scope.Templates.find((item) => item.Codigo == template);
                $scope.Obrigatorio.Template = false;
                $scope.CodigoTemplate = templateObjeto.Codigo;
                $scope.DescricaoTemplate = templateObjeto.Descricao;
            } else {
                $scope.CodigoTemplate = null;
                $scope.DescricaoTemplate = null;
            }
        };

        function SelecionarCheckLinha(linha) {
            linha.Selecionado = !linha.Selecionado;
            if (linha.Selecionado)
                $scope.LinhasSelecionadas[linha.IdentificadorLinha] = linha;
            else
                delete $scope.LinhasSelecionadas[linha.IdentificadorLinha];

            $scope.Obrigatorio.Linha = false;
        };

        function SelecionarTodasLinhas() {
            $scope.SelecionarTodos = !$scope.SelecionarTodos;
            if ($scope.Linhas) {
                angular.forEach($scope.Linhas, function (value, key) {
                    value.Selecionado = $scope.SelecionarTodos;
                });
                if ($scope.SelecionarTodos) {
                    angular.forEach($scope.Linhas, function (value, key) {
                        $scope.LinhasSelecionadas[value.IdentificadorLinha] = value;
                    });
                } else
                    angular.forEach($scope.Linhas, function (value, key) {
                        delete $scope.LinhasSelecionadas[value.IdentificadorLinha];
                    });
            }

            $scope.Obrigatorio.Linha = false;
        }

        function Salvar() {
            FecharTodasMensagens();
            if (ValidaSalvar()) {
                var params = {
                    'Codigo': $scope.CodigoPainel,
                    'CodigoDispositivo': $scope.CodigoDispositivo,
                    'CodigoTemplate': $scope.CodigoTemplate,
                    'CodigoLocal': $scope.CodigoLocal,
                    'DescricaoLocal': $scope.DescricaoLocal,
                    'Identificador': $scope.Identificador,
                    'DescricaoDispositivo': $scope.DescricaoDispositivo,
                    'Linhas': []
                };

                var selecionouLinhas = false;
                for (var l in $scope.LinhasSelecionadas) {
                    params.Linhas.push($scope.LinhasSelecionadas[l]);
                    selecionouLinhas = true;
                };

                Comando.SalvarPainel(params,
                    function sucesso(data) {
                        if (data.data.Sucesso) {
                            ExibirSucesso(data.data.MensagemSucesso);
                            $location.path(urlGlobal + "Terminais/Paineis/");
                        } else {
                            ExibirErro(data.data.MensagemErro);
                            $location.path(urlGlobal + "Terminais/Paineis/");
                        }
                        $(".loading-div").fadeOut();
                    },
                    function erro(erro) {
                        $(".loading-div").fadeOut();
                        ExibirAlerta(erro);
                    }
                );

            } else {
                ExibirAlerta("Selecione todos os dados obrigatórios!");
            }

            //$scope.Edicao = false;
        };

        function ValidaSalvar() {
            var bool = true;

            $scope.Obrigatorio.Dispositivo = false;
            $scope.Obrigatorio.Template = false;
            $scope.Obrigatorio.Local = false;
            $scope.Obrigatorio.Linha = false;

            if (!$scope.CodigoDispositivo) {
                $scope.Obrigatorio.Dispositivo = true; bool = false;
            }
            if (!$scope.CodigoTemplate) {
                $scope.Obrigatorio.Template = true; bool = false;
            }
            if (!$scope.CodigoLocal) {
                $scope.Obrigatorio.Local = true; bool = false;
            }

            if (jQuery.isEmptyObject($scope.LinhasSelecionadas) || $scope.LinhasSelecionadas.length == 0) {
                $scope.Obrigatorio.Linha = true; bool = false;
            }

            return bool;
        };

        function CarregarPainelPorCodigo() {
            Consulta.ConsultaPainelPorCodigo(
                $scope.CodigoPainel,
                function sucesso(data) {
                    if (data.data.Sucesso) {

                        $scope.CodigoDispositivo = data.data.Data.CodigoDispositivo;
                        $scope.DescricaoDispositivo = data.data.Data.DescricaoDispositivo;
                        $scope.CodigoLocal = data.data.Data.CodigoLocal;
                        $scope.DescricaoLocal = data.data.Data.DescricaoLocal;
                        $scope.CodigoTemplate = data.data.Data.CodigoTemplate;
                        $scope.DescricaoTemplate = data.data.Data.DescricaoTemplate;
                        $scope.Identificador = data.data.Data.Identificador;

                        $scope.templateSelecionado = $scope.CodigoTemplate;
                        $scope.dispositivoSelecionado = $scope.CodigoLocal;
                        $scope.dispositivoSelecionadoObjeto = { Codigo: $scope.CodigoLocal, Descricao: $scope.DescricaoLocal };

                        $scope.filtroLocal = $scope.DescricaoLocal;

                        ConsultarLinhas($scope.CodigoLocal, function () {
                            angular.forEach(data.data.Data.Linhas, function (item, index) {
                                var result = $.grep($scope.Linhas, function (e) {
                                    return e.IdentificadorLinha == item.CodigoLinha;
                                });

                                if (result.length > 0) {
                                    $scope.LinhasSelecionadas[item.CodigoLinha] = result[0];
                                    result[0].Selecionado = true;
                                }
                            });
                        });

                        $scope.Edicao = true;
                    }
                    else {
                        ExibirErro(data.data.Mensagem);
                        $scope.CodigoPainel = 0;
                    }
                    $(".loading-div").fadeOut();
                },
                function erro(error) {
                    $(".loading-div").fadeOut();
                    ExibirErro(error.statusText);
                }
            );
        };

        function ConsultarLinhas(descricao, CarregarLinhasSelecionadas) {

            $(".loading-div").fadeIn();

            var param = {
                'terminal': descricao
            };

            Consulta.ConsPaineisCarregarLinhasTerminais(param,
                function (data) {
                    $scope.Linhas = data.data;
                    if (CarregarLinhasSelecionadas)
                        CarregarLinhasSelecionadas();
                    $(".loading-div").fadeOut();
                },
                function (erro) {
                    $(".loading-div").fadeOut();
                }
            );
        }

        function clickAutoComplete() {
            if ($('#listAutoComplete').css('display') == 'none') {
                $('#listAutoComplete').show();
                $scope.DescricaoLocal == $scope.filtroLocal
                filtarPorLocal(true);
            } else {
                $scope.DescricaoLocal = null;
                $('#listAutoComplete').hide();
            }
        }

        function keyDownAutoComplete(keyCode) {
            if (keyCode == 8) {
                $scope.CodigoLocal = null;
                $scope.DescricaoLocal = null;
                $scope.Linhas = null;
            }

            if ($scope.filtroLocal.length > 0)
                filtarPorLocal(true);

            if ($('#listAutoComplete').css('display') == 'none') {
                $('#listAutoComplete').show();
            }

        }

        function filtarPorLocal(click) {
            if (($scope.DescricaoLocal != $scope.filtroLocal) || click) {
                $scope.Terminais = $scope.TerminaisAux.filter(function (item) { return item.Descricao.toUpperCase().indexOf($scope.filtroLocal.toUpperCase()) > -1; });

                if ($scope.Terminais.length == 0) {
                    $scope.CodigoLocal = null;
                    $scope.DescricaoLocal = null;
                    $scope.Linhas = null;
                }
            }
        }
    }
})();
