(function () {
    "use strict";

    angular.module('pos').controller('saidaAddController', controller);
    controller.$inject = ['$scope', '$state', '$stateParams', '$window', '$timeout', '$q', '$filter', 'saidaService', 'entidadeAuxiliarService', 'sugestaoTransferenciaService', 'terceiroService', 'notaFiscalService'];

    function controller($scope, $state, $stateParams, $window, $timeout, $q, $filter, saidaService, entidadeAuxiliarService, sugestaoTransferenciaService, terceiroService, notaFiscalService) {
        $scope.$parent.initializeLayout('Nova Saída');

        //[Inicializa objetos]
        $scope.state = {
            data: {},
            tiposFrete: [
              { Tipo: 0, Descricao: "Por conta do emitente" },
              { Tipo: 1, Descricao: "Por conta do destinatário" },
              { Tipo: 2, Descricao: "Por conta de terceiros" },
              { Tipo: 9, Descricao: "Sem frete" }
            ],
            carregando: false,
            tipoSaida: 1,
            sugestao: null,
        };
        $scope.wizard = {
            index: 0,
            steps: {
                opcoesTipoSaida: 0,
                pesquisarSugestao: 1,
                detalhes: 2,
                ajustarSugestao: 3,
            },
        }
        $scope.auxiliar = {
            tipoSaida: { sugestao: 0, manual: 1 },
            sugestao: { data: [], carregando: false, vazio: true },
            tabelaPreco: { data: [] },
            filial: { data: [] },
            tipoMovimentacao: { data: [] },
        };

        //[Inicializa funcões]
        $scope.initialize = function () {
            $scope.prepareNew();
            $scope.refresh();
        };
        $scope.historyBack = function () {
            $window.history.back();
        }

        $scope.prepareNew = function () {
            $scope.state.carregando = true;
            $scope.state.vazio = false;
            saidaService
                .prepareNew()
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, 'Serviço');
                        else
                            $scope.state.data = response.Data;
                        $scope.state.carregando = false;
                    },
                    function (err) {
                        $scope.$parent.toastr.error(err);
                        $scope.state.carregando = false;
                    }
                );
        };
        $scope.carregandoSave = false;

        $scope.save = function (callback) {
            $scope.state.data.IndicaDevolucao = $scope.state.IndicaDevolucao;
          
            if (!$scope.carregandoSave) {
                $scope.carregandoSave = true;
                saidaService
                    .save($scope.state.data)
                    .then(
                        function (response) {
                            if (response.Status < 0) {
                                $scope.$parent.toastr.error(response.Message, 'Serviço');
                                console.error(response.Exception);
                            }
                            else {
                                $scope.state.data = response.Data;
                                $state.go("state-saida-edit", { codigo: response.Data.Codigo }, { reload: false, location: 'replace' });
                                if (callback)
                                    callback();
                            }
                            $scope.carregandoSave = false;
                        },
                        function (error) {
                            $scope.carregandoSave = false;
                            $scope.$parent.toastr.error('Ao gravar a saída', 'Comunicação com o servidor');
                            console.error(error);
                        }
                    );
            }
        }
        $scope.saveNewSugestao = function (callback) {

            if (!$scope.carregandoSave) {
                $scope.carregandoSave = true;
                saidaService
                    .saveNewSugestao($scope.state.data, $scope.state.sugestao.Itens)
                    .then(
                        function (response) {
                            if (response.Status < 0) {
                                $scope.$parent.toastr.error(response.Message, 'Ao gravar nova com base em sugestão');
                                console.error(response.Exception);
                            }
                            else {
                                $scope.state.data = response.Data;
                                $state.go("state-saida-detail", { codigo: response.Data.Codigo }, { reload: false, location: 'replace' });
                                if (callback)
                                    callback();
                            }
                            $scope.carregandoSave = false;
                        },
                        function (error) {
                            $scope.carregandoSave = false;
                            $scope.$parent.toastr.error('Ao gravar nova com base em sugestão.', 'Comunicação com o servidor');
                            console.error(error)
                        }
                    );
            }
        };


        $scope.getAllTipoMovimentacao = function () {
            entidadeAuxiliarService
                .getAllTipoMovimentacaoSaida()
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Data, 'Serviço');
                        else
                            angular.copy(angular.fromJson(response.Data), $scope.auxiliar.tipoMovimentacao.data);
                    },
                    function (error) { $scope.$parent.toastr.error(error, 'Comunicação com o servidor'); }
                );
        }
        $scope.getAllTabelaPreco = function () {
            entidadeAuxiliarService
                .getAllTabelaPreco()
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Data, 'Serviço');
                        else
                            angular.copy(angular.fromJson(response.Data), $scope.auxiliar.tabelaPreco.data);
                    },
                    function (error) { $scope.$parent.toastr.error(error, 'Comunicação com o servidor'); }
                );
        }
        $scope.getAllFilial = function () {
            entidadeAuxiliarService
                .getAllFilialTransferencia()
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Data, 'Serviço');
                        else
                            angular.copy(angular.fromJson(response.Data), $scope.auxiliar.filial.data);
                    },
                    function (error) { $scope.$parent.toastr.error(error, 'Comunicação com o servidor'); }
                );
        }
        $scope.buscarTransportadoras = function () {
            entidadeAuxiliarService.getAllTransportadora().then(
                function (response) {
                    $scope.state.transportadoras = response.Data;
                },
                function (error) {
                    $scope.$parent.toastr.error(error, "Serviço");
                }
                );
        }

        $scope.getAllSugestao = function () {
            $scope.auxiliar.sugestao.carregando = true;
            $scope.auxiliar.sugestao.vazio = true;
            sugestaoTransferenciaService
                .getAllPendente()
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, 'Serviço');
                        else {
                            angular.copy(angular.fromJson(response.Data), $scope.auxiliar.sugestao.data);
                            $scope.auxiliar.sugestao.vazio = (response.Data.length == 0);
                        }

                        $scope.auxiliar.sugestao.carregando = false;
                    },
                    function (error) {
                        $scope.$parent.toastr.error(error, 'Comunicação com o servidor');
                        $scope.auxiliar.sugestao.carregando = false;
                        $scope.auxiliar.sugestao.vazio = true;
                    }
                );
        };
        $scope.getSugestao = function () {
            if ($scope.state.sugestao.Codigo == $scope.state.itemSugestao.filtro.codigo)
                return false;
            $scope.state.itemSugestao.filtro.codigo = $scope.state.sugestao.Codigo
            sugestaoService
                .get($scope.state.sugestao.Codigo)
                .then(
                    function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, 'Serviço');
                        else
                            $scope.state.itemSugestao.data = response.Data.Itens;
                    },
                    function (error) { $scope.$parent.toastr.error(error, 'Comunicação com o servidor'); }
                );
        };

        $scope.lookupTerceiro = function (val) {
            return $q.when(
                terceiroService
                    .getLookup(val)
                    .then(function (response) {
                        if (response.Status < 0)
                            $scope.$parent.toastr.error(response.Message, 'Serviço');
                        else {
                            return response.Data;
                        }
                    }));
        };
        $scope.selectTerceiro = function (val) {
            $scope.state.data.TerceiroDevolucao = val;
        }

        $scope.gotoNext = function () {
            switch ($scope.wizard.index) {
                case $scope.wizard.steps.opcoesTipoSaida:
                    switch ($scope.state.tipoSaida) {
                        case $scope.auxiliar.tipoSaida.sugestao:
                            $scope.wizard.index = $scope.wizard.steps.pesquisarSugestao;
                            $scope.getAllSugestao();
                            break;
                        case $scope.auxiliar.tipoSaida.manual:
                            $scope.wizard.index = $scope.wizard.steps.detalhes;
                            break;
                    }
                    break;
                case $scope.wizard.steps.pesquisarSugestao:
                    if (!$scope.state.sugestao) {
                        $scope.$parent.toastr.info('Para avançar é necessário escolher um dos romaneios de sugestão.');
                        break;
                    }
                    $scope.state.data.FilialDestino = $scope.state.sugestao.FilialDestino;
                    $scope.state.data.IndicaDevolucao = false;
                    $scope.wizard.index = $scope.wizard.steps.detalhes;
                    break;
                case $scope.wizard.steps.detalhes:
                    switch ($scope.state.tipoSaida) {
                        case $scope.auxiliar.tipoSaida.sugestao:
                            $scope.wizard.index = $scope.wizard.steps.ajustarSugestao;
                            break;
                        case $scope.auxiliar.tipoSaida.manual:
                            $scope.save();
                            break;
                    }
                    break;
                case $scope.wizard.steps.ajustarSugestao:
                    $scope.saveNewSugestao();
                    break;
                default:
                    $scope.wizard.index++;
                    break
            }
        };
        $scope.gotoPrior = function () {
            switch ($scope.wizard.index) {
                case $scope.wizard.steps.detalhes:
                    switch ($scope.state.tipoSaida) {
                        case $scope.auxiliar.tipoSaida.sugestao:
                            $scope.wizard.index = $scope.wizard.steps.pesquisarSugestao;
                            break;
                        case $scope.auxiliar.tipoSaida.manual:
                            $scope.wizard.index = $scope.wizard.steps.opcoesTipoSaida;
                            break;
                    }
                    break;
                case $scope.wizard.steps.pesquisarSugestao:
                    $scope.wizard.index = $scope.wizard.steps.opcoesTipoSaida;
                    break;
                case $scope.wizard.steps.opcoesTipoSaida:
                    break;
                default:
                    $scope.wizard.index--;
                    break
            }
        };

        $scope.refresh = function () {
            $scope.getAllTipoMovimentacao();
            $scope.getAllTabelaPreco();
            $scope.getAllFilial();
            $scope.buscarTransportadoras();
        };

        /*Inicializa funções*/
        $scope.initialize();
    }

})();