app.controller("auxiliosController", function ($scope, $modal, dataService, auxiliosFactory, notificationFactory, httpRequestFactory, ngProgress, $upload) {

    $scope.dataNova = dataService.devDataHoje();
    $scope.TotalInventariosIguais = 0;
    $scope.emExecucao = false;

    $scope.info = "Caracteristicas: Data, Classificação, Nome, C.Económica, C.Funcional, C.Patrimonial, Cor, Cod.Actividade, Fornecedor, ";
    $scope.info += "Comprimento, ";
    $scope.info += "Largura, ";
    $scope.info += "Altura, ";
    $scope.info += "Modelo, ";
    //$scope.info += "NRO, ";
    //$scope.info += "Observacao, ";
    $scope.info += "RefMarca, ";
    $scope.info += "Edificio, ";
    $scope.info += "Piso, ";
    $scope.info += "Sala, ";
    //$scope.info += "N.Factura, ";
    $scope.info += "Responsável";

    $scope.confirmarAlterarDatas = function (row, dataNova) {

        if (row == null)
            return;

        row.mensagem = "Deseja alterar a data de todos os bens com a mesmas caracteristicas?";
        var modalInstance = $modal.open(
        {

            templateUrl: 'views/modalConfirmar.html',
            controller: 'modalController',
            backdrop: 'static',
            keyboard: false,
            resolve: {

                items: function () { return row; }
            }
        });

        modalInstance.result.then(function (item) {
            $scope.atualizarDatas(item, dataNova);
        }, function () {

        });

    };



    $scope.atualizarDatas = function (elem, dataNova) {
        if (elem == null)
            return;


        $scope.emExecucao = true;

        var successCallback = function (data, status, headers, config) {
            $scope.emExecucao = false;
            notificationFactory.success(data);
            elem.Data = dataNova;
            $scope.$parent.ok();
            
        };

        var errorCallback = function (data, status, headers, config) {
            $scope.emExecucao = false;
            var res = { msg: data };
            $scope.openModalMostrarResultado(res);
            $scope.$parent.ok();

        };

        if (dataNova == "" || isNaN(Date.parse(dataNova))) {
            $scope.emExecucao = false;
            notificationFactory.error("A nova data não é válida");
            return;
        }



        if (elem.Aquisicao.DataInicio == "" || isNaN(Date.parse(elem.Aquisicao.DataInicio)))
            elem.Aquisicao.DataInicio = "1900-01-01";
        if (elem.Aquisicao.DataTermo == "" || isNaN(Date.parse(elem.Aquisicao.DataTermo)))
            elem.Aquisicao.DataTermo = "1900-01-01";
        if (elem.Abate.Data == "" || isNaN(Date.parse(elem.Abate.Data)))
            elem.Abate.Data = "1900-01-01";
        if (elem.Data == "" || isNaN(Date.parse(elem.Data)))
            elem.Data = "1900-01-01";
        if (elem.Aquisicao.Valor == "" || isNaN(elem.Aquisicao.Valor))
            elem.Aquisicao.Valor = 0;
        if (elem.Aquisicao.ValorRenda == "" || isNaN(elem.Aquisicao.ValorRenda))
            elem.Aquisicao.ValorRenda = 0;
        if (elem.Aquisicao.ValorResidual == "" || isNaN(elem.Aquisicao.ValorResidual))
            elem.Aquisicao.ValorResidual = 0;
        if (elem.Aquisicao.NumeroRendas == "" || isNaN(elem.Aquisicao.NumeroRendas))
            elem.Aquisicao.NumeroRendas = 0;
        if (elem.Abate.Receita == "" || isNaN(elem.Abate.Receita))
            elem.Abate.Receita = 0;
        if (elem.Comprimento == "" || isNaN(elem.Comprimento))
            elem.Comprimento = 0;
        if (elem.Largura == "" || isNaN(elem.Largura))
            elem.Largura = 0;
        if (elem.Altura == "" || isNaN(elem.Altura))
            elem.Altura = 0;

        auxiliosFactory.updateDatas(elem, dataNova).success(successCallback).error(errorCallback);
    };

    $scope.devTotalInventarioIguais = function (elem) {
        if (elem == null)
            return;

        var successCallback = function (data, status, headers, config) {
            if (isNaN(data))
                $scope.TotalInventariosIguais = 0;
            else
                $scope.TotalInventariosIguais = Number(data);
        };

        var errorCallback = function (data, status, headers, config) {
            notificationFactory.error(data);
        };

        if (elem.Aquisicao.DataInicio == "" || isNaN(Date.parse(elem.Aquisicao.DataInicio)))
            elem.Aquisicao.DataInicio = "1900-01-01";
        if (elem.Aquisicao.DataTermo == "" || isNaN(Date.parse(elem.Aquisicao.DataTermo)))
            elem.Aquisicao.DataTermo = "1900-01-01";
        if (elem.Abate.Data == "" || isNaN(Date.parse(elem.Abate.Data)))
            elem.Abate.Data = "1900-01-01";
        if (elem.Data == "" || isNaN(Date.parse(elem.Data)))
            elem.Data = "1900-01-01";
        if (elem.Aquisicao.Valor == "" || isNaN(elem.Aquisicao.Valor))
            elem.Aquisicao.Valor = 0;
        if (elem.Aquisicao.ValorRenda == "" || isNaN(elem.Aquisicao.ValorRenda))
            elem.Aquisicao.ValorRenda = 0;
        if (elem.Aquisicao.ValorResidual == "" || isNaN(elem.Aquisicao.ValorResidual))
            elem.Aquisicao.ValorResidual = 0;
        if (elem.Aquisicao.NumeroRendas == "" || isNaN(elem.Aquisicao.NumeroRendas))
            elem.Aquisicao.NumeroRendas = 0;
        if (elem.Abate.Receita == "" || isNaN(elem.Abate.Receita))
            elem.Abate.Receita = 0;
        if (elem.Comprimento == "" || isNaN(elem.Comprimento))
            elem.Comprimento = 0;
        if (elem.Largura == "" || isNaN(elem.Largura))
            elem.Largura = 0;
        if (elem.Altura == "" || isNaN(elem.Altura))
            elem.Altura = 0;

        auxiliosFactory.devTotalInventarioIguais(elem).success(successCallback).error(errorCallback);
    };

    $scope.openModalMostrarResultado = function (row) {

        if (row == null)
            return;
        row.titulo = "Resultados";
        

        var modalInstance = $modal.open(
        {
            templateUrl: 'views/modalResultados.html',
            controller: 'modalController',
            resolve: {
                items: function () { return row; }
            }
        });

        modalInstance.result.then(function (item) {
            item.perm = null;
        }, function () {
        });
    };

    $scope.corrigirDuplicacoes = function () {
        
        $scope.emExecucao = true;
        $scope.msgRepetidos = "";
        var successCallback = function (data, status, headers, config) {
            $scope.emExecucao = false;
            notificationFactory.success(data);
            
        };

        var errorCallback = function (data, status, headers, config) {
            $scope.emExecucao = false;
            notificationFactory.error(data);
        };
        
        auxiliosFactory.corrigirDuplicacoes().success(successCallback).error(errorCallback);
    };

    $scope.lstDuplicacoes = [];

    $scope.msgRepetidos = "Não Existem 'Bens' com Problemas";

    $scope.getDuplicacoes = function () {

        $scope.emExecucao = true;

        var successCallback = function (data, status, headers, config) {
            $scope.emExecucao = false;
            $scope.lstDuplicacoes = data;
            if (data == "null")
                $scope.lstDuplicacoes = [];
            if ($scope.lstDuplicacoes.length >0)
                $scope.msgRepetidos = "Existem 'Bens' com Problemas";
        };

        var errorCallback = function (data, status, headers, config) {
            $scope.emExecucao = false;
            notificationFactory.error(data);
        };
        
        auxiliosFactory.getDuplicacoes().success(successCallback).error(errorCallback);
    };

    $scope.corrigirDuplicacoesAnos = function () {
        $scope.mensagemResultado = "";
        $scope.emExecucao = true;
        var successCallback = function (data, status, headers, config) {
            $scope.emExecucao = false;
            $scope.mensagemResultado = data;
            notificationFactory.success(data);

        };

        var errorCallback = function (data, status, headers, config) {
            $scope.emExecucao = false;
            notificationFactory.error(data);
            $scope.mensagemResultado = "";
        };

        auxiliosFactory.corrigirDuplicacoesAnos().success(successCallback).error(errorCallback);
    };

    $scope.corrigeLocalizacoes = function (idInventario) {
        $scope.mensagemResultado = "";
        $scope.emExecucao = true;

        var getSuccessCallback = function (data, status) {
            $scope.emExecucao = false;
            $scope.mensagemResultado = data;
            notificationFactory.success(data);
            ngProgress.complete();
        };

        var errorCallback = function (data, status, headers, config) {
            $scope.emExecucao = false;
            notificationFactory.error(data);
            $scope.mensagemResultado = "";
            ngProgress.reset();
        };

        var dados = {};
        httpRequestFactory.postData('../api/auxilio/corrigirlocais', dados).success(getSuccessCallback).error(errorCallback);
        ngProgress.start();
    };

    $scope.associaAmortizacaoInventario = function (idInventario) {
        $scope.mensagemResultado = "";
        $scope.emExecucao = true;

        var getSuccessCallback = function (data, status) {
            $scope.emExecucao = false;
            $scope.mensagemResultado = data;
            notificationFactory.success(data);
            ngProgress.complete();
        };

        var errorCallback = function (data, status, headers, config) {
            $scope.emExecucao = false;
            notificationFactory.error(data);
            $scope.mensagemResultado = "";
            ngProgress.reset();
        };

        var dados = {};
        httpRequestFactory.postData('../api/auxilio/AssociaInventarioAmortizacao', dados).success(getSuccessCallback).error(errorCallback);
        ngProgress.start();
    };

    $scope.lstResultados = [];
    $scope.corrigeCentroCustosDuplicados = function () {
        $scope.lstResultados = [];
        $scope.emExecucao = true;

        var getSuccessCallback = function (data, status) {
            $scope.emExecucao = false;
            $scope.lstResultados = data;
            //notificationFactory.success("Concluido");
            if (data.length == 0)
                $scope.lstResultados.push("Não há duplicações");
            ngProgress.complete();
        };

        var errorCallback = function (data, status, headers, config) {
            $scope.emExecucao = false;
            notificationFactory.error(data);
            $scope.lstResultados = [];
            ngProgress.reset();
        };

        var dados = {};
        httpRequestFactory.postData('../api/auxilio/centroCustosDuplicados', dados).success(getSuccessCallback).error(errorCallback);
        ngProgress.start();
    };

    $scope.ContaPatInicial = '';
    $scope.ContaPatFinal = '';

    $scope.alteraContasPatrimoniais = function () {
        
        if ($scope.ContaPatInicial == '')
        {
            notificationFactory.error("A conta patrimonial inicial não pode ser vazia");
            return;
        }
        if ($scope.ContaPatFinal == '')
        {
            notificationFactory.error("A conta patrimonial que pretende alterar não pode ser vazia");
            return;
        }

        $scope.emExecucao = true;

        var getSuccessCallback = function (data, status) {
            $scope.emExecucao = false;
            notificationFactory.success("Concluido");
            ngProgress.complete();
        };

        var errorCallback = function (data, status, headers, config) {
            $scope.emExecucao = false;
            notificationFactory.error(data);
            ngProgress.reset();
        };

        var dados = {};
        httpRequestFactory.postData('../api/auxilio/alteraContaPatrimonial/'+$scope.ContaPatInicial+'/'+$scope.ContaPatFinal, dados).success(getSuccessCallback).error(errorCallback);
        ngProgress.start();
    };

    $scope.lstAmortizacoesErros = [];
    $scope.getAmortizacoesErros = function () {
       
        $scope.emExecucao = true;

        var getSuccessCallback = function (data, status) {
            $scope.lstAmortizacoesErros = data.Dados;
            $scope.emExecucao = false;
            ngProgress.complete();
        };

        var errorCallback = function (data, status, headers, config) {
            $scope.emExecucao = false;
            notificationFactory.error(data);
            ngProgress.reset();
        };

        $scope.lstAmortizacoesErros = [];
        httpRequestFactory.getData('../api/cadastro/verifica/ErrosAbatesAmortizacoes').success(getSuccessCallback).error(errorCallback);
        ngProgress.start();
    };

    $scope.selectedErroAmortizacao = null;
    $scope.selErroAmortizacao = function (item) {
        $scope.selectedErroAmortizacao = item;
    };

    $scope.selectedLinhaAmortizacao = null;
    $scope.selLinhaAmortizacao = function (item) {
        $scope.selectedLinhaAmortizacao = item;
    };

    $scope.linhaAmortizacaoAdiciona = function (item) {

        if (item == null)
            return;
        if (item.LstAm == null)
            return;
        
        info = {
            Pk_Amortizacao: 0,
            Data: dataService.devDataHoje(),
            Tipo: '',
            DescricaoCodigo: '',
            ValorBruto: 0,
            VidaUtil: 0,
            Taxa: 0,
            ValorAmortizacao: 0,
            ValorLiquido: 0,
            Fk_CodAquisicao: 1,
            Mensal: true,
            Fk_Iventario: item.IdInv,
            Gravar: true
        };

        item.LstAm.push(info);

        item.LstAm.sort(function (a, b) {
            
            return new Date(a.Data) - new Date(b.Data);
        });
    };

    $scope.atualizaAmortizacaoLista = function (dados) {

        var getSuccessCallback = function (data, status) {
            notificationFactory.success(data);
            ngProgress.complete();
            $scope.getAmortizacoesErros();
            $scope.selectedLinhaAmortizacao = null;
            $scope.selectedErroAmortizacao = null;
        };

        var errorCallback = function (data, status, headers, config) {
            notificationFactory.error(data);
            ngProgress.reset();
        };

        httpRequestFactory.postData('../api/cadastro/gravarAmortizacao/Lista', dados).success(getSuccessCallback).error(errorCallback);
        ngProgress.start();
    };

    $scope.apagaAmortizacaoIndividual = function (id,lstAm, elem) {

        var getSuccessCallback = function (data, status) {
            notificationFactory.success(data);
            ngProgress.complete();
            //$scope.getAmortizacoesErros();

            for (i = 0; i < lstAm.length; i++) {
                if (lstAm[i] == elem) {
                    lstAm.splice(i, 1);

                    break;

                }
            }
            $scope.selectedLinhaAmortizacao = null;
        };

        var errorCallback = function (data, status, headers, config) {
            notificationFactory.error(data);
            ngProgress.reset();
        };


        httpRequestFactory.deleteData('../api/cadastro/apagaAmortizacao/', id).success(getSuccessCallback).error(errorCallback);
        ngProgress.start();
    };

    $scope.confirmaApagarAmortizacao = function (id, lstAm, elem) {
        var row = {
            mensagem: "Confirma que deseja apagar este linha de amortização?"
        };

        var modalInstance = $modal.open(
        {

            templateUrl: 'views/modalConfirmar.html',
            controller: 'modalController',
            backdrop: 'static',
            keyboard: false,
            resolve: {

                items: function () { return row; }
            }
        });

        modalInstance.result.then(function (item) {
            $scope.apagaAmortizacaoIndividual(id, lstAm, elem);
        }, function () {

        });
    };

    $scope.sugereValorLiquidoLinhaAbate = function (lstAm) {
        lstAm.sort(function (a, b) {
            return new Date(a.Data) - new Date(b.Data);
        });

        var linhaAnt = null;
        for (i = 0; i < lstAm.length; i++) {
            if (lstAm[i].Tipo == 'Abate' && linhaAnt != null) {
                lstAm[i].ValorLiquido = linhaAnt.ValorLiquido;
                lstAm[i].ValorAmortizacao = 0;
                lstAm[i].Gravar = true;
                break;
            }
            linhaAnt = lstAm[i];
        }
    };

    $scope.sugereValorLiquidoLinhaAbateTodos = function (dados) {
        
        for (k = 0; k < dados.length; k++) {
            $scope.sugereValorLiquidoLinhaAbate(dados[k].LstAm);
        }
    };

    $scope.fileAbateBens = "";
    $scope.lstDadosBensExcelAbater = [];
    $scope.onFileAbateBemsPorExcel = function ($files, info) {
        //if ($files.length.length != 1) {
        //    notificationFactory.error("Só é permitido um ficheiro de cada vez.")
        //    return;
        //}

        var $file = $files[0];
        (function (index) {
            $upload.upload({
                url: "../api/cadastro/carregar/BensAbater/excel/",
                method: "POST",
                file: $file
            }).progress(function (evt) {
                // get upload percentage
                $scope.uploadprogress = parseInt(100.0 * evt.loaded / evt.total);

            }).success(function (data, status, headers, config) {
                if (data.Success == false) {
                    notificationFactory.error(data.Message);
                }
                else
                    $scope.lstDadosBensExcelAbater = data.Dados;

            }).error(function (data, status, headers, config) {
                notificationFactory.error(data);
            });

        })(0);

    };


    $scope.gravarAbatesPorDadosExcel = function (lstDados) {
        if ($scope.lstDadosBensExcelAbater.length == 0) {
            notificationFactory.error("Não existem dados para gravar");
            return;
        }

        var getSuccessCallback = function (data, status) {
            $scope.lstDadosBensExcelAbater = [];
            notificationFactory.success(data);
            ngProgress.complete();
        };

        var errorCallback = function (data, status, headers, config) {
            notificationFactory.error(data);
            ngProgress.reset();
        };

        httpRequestFactory.postData('../api/cadastro/recalcular/abates/lista', lstDados).success(getSuccessCallback).error(errorCallback);
        //var h = { pass: acesso };
        //httpRequestFactory.postDataHeader('../api/cadastro/recalcular/abates/lista', lstDados, h).success(getSuccessCallback).error(errorCallback);
        ngProgress.start();
    };

    

});