app.controller("localController", function ($scope, $modal, $rootScope, cadastroFactory, dataService, localizacaoFactory, notificationFactory) {

    $scope.edificios = [];
    


    $scope.dadosModificados = function (modificado) {
        
        $rootScope.$broadcast('houveAlteracoes', modificado);

    };

    

    $scope.listarEdificios = function (cadastro) {

        
        var getSuccessCallback = function (data, status) {

            
            $scope.edificios = data;
            
            $scope.edificios = $scope.ordernar($scope.edificios);
            

            
            $scope.seleccionarPorDefeito(cadastro);
                
            $scope.devolveLocalizacao(cadastro, $scope.selectedEdificio, $scope.selectedPiso, $scope.selectedSala);

            

        };



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

        localizacaoFactory.getEdificios().success(getSuccessCallback).error(errorCallback);
    };

    $scope.inserirEdificio = function (item,cadastro) {

        if (item == null)
            return;

        var successCallback = function (data, status, headers, config) {

            notificationFactory.success(data.Msg);

            $scope.edificios.push(data.Conteudo);
            if ($scope.edificios.length > 0)
            {
                //$scope.edificios = $scope.ordernar($scope.edificios);
                //selecciona ultimo piso guardado
                $scope.selEdificio($scope.edificios[$scope.edificios.length - 1]);
            }
                

            if (cadastro != null)
                $scope.atribuirLoc(cadastro);
        };


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

        localizacaoFactory.addEdificio(item).success(successCallback).error(errorCallback);

    };


    $scope.apagarEdificio = function (elem,cadastro) {
        if (elem == null)
            return;

        var successCallback = function (data, status, headers, config) {
            notificationFactory.success(data);
            $scope.selectedEdificio = null;
            $scope.selectedPiso = null;
            $scope.selectedSala = null;
            $scope.listarEdificios();

            if (cadastro != null)
                $scope.atribuirLoc(cadastro);
        };


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

        localizacaoFactory.deleteEdificio(elem).success(successCallback).error(errorCallback);
    };

    $scope.confirmarApagarEdificio = function (row,cadastro) {

        if (row == null)
            return;

        var modalInstance = $modal.open(
        {

            templateUrl: 'views/modalConfirmarApagar.html?v=' + new Date(),
            controller: 'modalController',
            resolve: {

                items: function () { return row; },

                //  isNew: false
            }
        });

        modalInstance.result.then(function (item) {

            $scope.apagarEdificio(item,cadastro);
        }, function () {

        });

    };

    $scope.updateEdificio = function (elem,cadastro) {
        if (elem == null)
            return;



        var successCallback = function (data, status, headers, config) {
            notificationFactory.success(data);
            
            if (cadastro != null)
                $scope.atribuirLoc(cadastro);
        };


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

        localizacaoFactory.updateEdificio(elem).success(successCallback).error(errorCallback);
    };

    $scope.selEdificio = function (item,cadastro) {
        $scope.selectedSala = null;
        $scope.selectedPiso = null;
        

        if (item == null) {
            
            return;
        }

        $scope.selectedEdificio = item;
        if ($scope.selectedEdificio.LstPiso.length > 0)
        {
            $scope.selectedEdificio.LstPiso = $scope.ordernar($scope.selectedEdificio.LstPiso);
            $scope.selPiso($scope.selectedEdificio.LstPiso[0]);
        }
            

        
        
    };

    $scope.edificioEditRow = function (row,cadastro) {

        if (row == null) {
            row = {
                PK_Edificio: 0,
                Descricao: 'Edificio'
            };
            row.op = "Novo";
        }
        else
            row.op = "Editar";

        var modalInstance = $modal.open(
        {

            templateUrl: 'views/modalEditarEdificio.html?v=' + new Date(),
            controller: 'modalController',
            resolve: {

                items: function () { return row; },

                //  isNew: false
            }
        });

        modalInstance.result.then(function (item) {
            if (item.op == "Editar") {
                $scope.selectedEdificio = item;
                $scope.updateEdificio(item,cadastro);
            }
            else
                $scope.inserirEdificio(item,cadastro);

        }, function () {

        });

    };

    //Pisos
    $scope.inserirPiso = function (item,cadastro) {

        if (item == null)
            return;
        var successCallback = function (data, status, headers, config) {
            notificationFactory.success(data.Msg);

            $scope.selectedEdificio.LstPiso.push(data.Conteudo);
            if ($scope.selectedEdificio.LstPiso.length > 0)
                //selecciona ultimo piso guardado
                $scope.selPiso($scope.selectedEdificio.LstPiso[$scope.selectedEdificio.LstPiso.length - 1]);

            if (cadastro != null)
                $scope.atribuirLoc(cadastro);
        };


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

        localizacaoFactory.addPiso(item).success(successCallback).error(errorCallback);

    };


    $scope.apagarPiso = function (elem,cadastro) {
        if (elem == null)
            return;
        var successCallback = function (data, status, headers, config) {
            notificationFactory.success(data);


            $scope.selectedPiso.LstSala = [];
            var arr = $scope.selectedEdificio.LstPiso;

            if (arr == null)
                return;
            for (i = 0; i < arr.length; i++) {
                if (arr[i] == elem) {
                    arr.splice(i, 1);
                    break;

                }
            }
            $scope.selectedSala = null;
            $scope.selectedPiso = null;
            if ($scope.selectedEdificio.LstPiso.length > 0)
                $scope.selPiso($scope.selectedEdificio.LstPiso[0]);

            if (cadastro != null)
                $scope.atribuirLoc(cadastro);

        };


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

        localizacaoFactory.deletePiso(elem).success(successCallback).error(errorCallback);
    };

    $scope.updatePiso = function (elem,cadastro) {

        if (elem == null)
            return;
        var successCallback = function (data, status, headers, config) {
            notificationFactory.success(data);
            if (cadastro != null)
                $scope.atribuirLoc(cadastro);

        };

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

        localizacaoFactory.updatePiso(elem).success(successCallback).error(errorCallback);
    };

    $scope.selPiso = function (item,cadastro) {



        $scope.selectedSala = null;
        if (item == null) {
            
            return;
        }

        $scope.selectedPiso = item;
        if ($scope.selectedPiso.LstSala.length > 0)
        {
            $scope.selectedEdificio.LstSala = $scope.ordernar($scope.selectedPiso.LstSala);
            $scope.selSala($scope.selectedPiso.LstSala[0]);
        }
            
        
        
    };

    $scope.pisoEditRow = function (row,cadastro) {

        if ($scope.selectedEdificio == null) {
            notificationFactory.error("Seleccione o Edificio");
            return;
        }


        if (row == null) {


            row = {
                PK_Piso: 0,
                FK_Edificio: $scope.selectedEdificio.PK_Edificio,
                Descricao: 'Piso'
            };
            row.op = "Novo";
        }
        else {
            if ($scope.selectedPiso == null) {
                notificationFactory.error("Seleccione o Piso");
                return;
            }

            row.op = "Editar";
        }


        var modalInstance = $modal.open(
        {

            templateUrl: 'views/modalEditarPiso.html?v=' + new Date(),
            controller: 'modalController',
            resolve: {

                items: function () { return row; },

                //  isNew: false
            }
        });

        modalInstance.result.then(function (item) {

            if (item.op == "Editar") {

                $scope.selectedPiso = item;
                $scope.updatePiso(item,cadastro);
            }
            else
                $scope.inserirPiso(item,cadastro);

        }, function () {

        });

    };

    $scope.confirmarApagarPiso = function (row,cadastro) {

        if (row == null)
            return;

        var modalInstance = $modal.open(
        {

            templateUrl: 'views/modalConfirmarApagar.html?v=' + new Date(),
            controller: 'modalController',
            resolve: {

                items: function () { return row; },

                //  isNew: false
            }
        });

        modalInstance.result.then(function (item) {

            $scope.apagarPiso(item,cadastro);
        }, function () {

        });

    };

    //Sala

    $scope.selSala = function (item,cadastro) {
        $scope.selectedSala = item;
        
    };

    $scope.salaEditRow = function (row,cadastro) {

        if ($scope.selectedEdificio == null || $scope.selectedPiso == null) {
            notificationFactory.error("Seleccione a Piso");
            return;
        }

        if (row == null) {
            row = {
                PK_Sala: 0,
                FK_Piso: $scope.selectedPiso.PK_Piso,
                Descricao: 'Sala'
            };
            row.op = "Nova";
        }
        else {
            if ($scope.selectedSala == null) {
                notificationFactory.error("Seleccione a Sala");
                return;
            }
            row.op = "Editar";
        }


        var modalInstance = $modal.open(
        {

            templateUrl: 'views/modalEditarSala.html?v=' + new Date(),
            controller: 'modalController',
            resolve: {

                items: function () { return row; },

                //  isNew: false
            }
        });

        modalInstance.result.then(function (item) {

            if (item.op == "Editar") {

                $scope.selectedSala = item;
                $scope.updateSala(item,cadastro);
            }
            else
                $scope.inserirSala(item,cadastro);

        }, function () {

        });

    };

    $scope.confirmarApagarSala = function (row,cadastro) {

        if (row == null)
            return;

        var modalInstance = $modal.open(
        {

            templateUrl: 'views/modalConfirmarApagar.html?v=' + new Date(),
            controller: 'modalController',
            resolve: {

                items: function () { return row; },

                //  isNew: false
            }
        });

        modalInstance.result.then(function (item) {

            $scope.apagarSala(item,cadastro);
        }, function () {

        });

    };

    $scope.inserirSala = function (item,cadastro) {

        if (item == null)
            return;

        var successCallback = function (data, status, headers, config) {
            notificationFactory.success(data.Msg);

            $scope.selectedPiso.LstSala.push(data.Conteudo);
            if ($scope.selectedPiso.LstSala.length > 0)
                //selecciona ultimo piso guardado
                $scope.selSala($scope.selectedPiso.LstSala[$scope.selectedPiso.LstSala.length - 1]);
            if (cadastro != null)
                $scope.atribuirLoc(cadastro);
        };


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

        localizacaoFactory.addSala(item).success(successCallback).error(errorCallback);

    };


    $scope.apagarSala = function (elem,cadastro) {
        if (elem == null)
            return;

        var successCallback = function (data, status, headers, config) {
            notificationFactory.success(data);

            
            var arr = $scope.selectedPiso.LstSala;
            if (arr == null)
                return;
            for (i = 0; i < arr.length; i++) {
                if (arr[i] == elem) {
                    arr.splice(i, 1);
                    break;

                }
            }
            $scope.selectedSala = null;
            if ($scope.selectedPiso.LstSala.length > 0)
                $scope.selSala($scope.selectedPiso.LstSala[0]);

            if (cadastro != null)
                $scope.atribuirLoc(cadastro);
        };


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

        localizacaoFactory.deleteSala(elem).success(successCallback).error(errorCallback);
    };

    $scope.updateSala = function (elem,cadastro) {
        if (elem == null)
            return;



        var successCallback = function (data, status, headers, config) {
            notificationFactory.success(data);
            if (cadastro != null)
                $scope.atribuirLoc(cadastro);

        };


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

        localizacaoFactory.updateSala(elem).success(successCallback).error(errorCallback);
    };

    

    $scope.devolveLocalizacao = function (item, edificio, piso, sala) {

        if (item == null)
            return "";
        var edificioDescricao = "";
        var pisoDescricao = "";
        var salaDescricao = "";
        var NomeEntidade = "";

        if (edificio == null) {

            item.FK_Edificio = 0;
        }
        else {
            edificioDescricao = edificio.Descricao;
            item.FK_Edificio = edificio.PK_Edificio;
            NomeEntidade = edificio.NomeEntidade;
        }


        if (piso == null) {
            item.FK_Piso = 0;
        }
        else {
            item.FK_Piso = piso.PK_Piso;
            pisoDescricao = " - " + piso.Descricao;
        }

        if (sala == null) {
            item.FK_Sala = 0;
        }
        else {
            salaDescricao = " - " + sala.Descricao;
            item.FK_Sala = sala.PK_Sala;
        }

        if (edificio != null && piso != null && edificio.PK_Edificio != piso.FK_Edificio) {
            $scope.selectedPiso = null;
            $scope.selectedSala = null;

            edificioDescricao = edificio.Descricao;
            pisoDescricao = "";
            salaDescricao = "";
            item.FK_Piso = 0;
            item.FK_Sala = 0;

        }

        if (edificio != null && piso != null && sala != null &&
            edificio.PK_Edificio != piso.FK_Edificio &&
            piso.PK_Piso != sala.FK_Piso) {
            $scope.selectedPiso = null;
            $scope.selectedSala = null;
            edificioDescricao = edificio.Descricao;
            pisoDescricao = "";
            salaDescricao = "";
            item.FK_Piso = 0;
            item.FK_Sala = 0;
        }
        if (piso != null && sala != null && piso.PK_Piso != sala.FK_Piso) {
            $scope.selectedSala = null;
            edificioDescricao = edificio.Descricao;
            pisoDescricao = pisoDescricao;
            salaDescricao = "";

            item.FK_Sala = 0;
        }
        //$scope.caminhoLocalizacao = edificioDescricao + "" + pisoDescricao + "" + salaDescricao + " - " + NomeEntidade;
        $scope.caminhoLocalizacao = NomeEntidade + " - " + edificioDescricao + "" + pisoDescricao + "" + salaDescricao;
        item.Localizacao = $scope.caminhoLocalizacao;


    };

    $scope.atribuirLoc = function (cadastro) {
        if (cadastro == null)
            return;
        var ed = 0;
        var pi = 0;
        var sa = 0;
        if ($scope.selectedEdificio != null)
            ed = $scope.selectedEdificio.PK_Edificio;
        if ($scope.selectedPiso != null)
            pi = $scope.selectedPiso.PK_Piso;
        if ($scope.selectedSala != null)
            sa = $scope.selectedSala.PK_Sala;

        cadastro.PK_Edificio = ed;
        cadastro.PK_Piso = pi;
        cadastro.PK_Sala = sa;
        $scope.devolveLocalizacao(cadastro, $scope.selectedEdificio, $scope.selectedPiso, $scope.selectedSala);
    };

    $scope.selEdificioPK = function (PK_Edificio) {


        //$scope.selectedEdificio = null;
        if ($scope.edificios == null)
            return;
        //console.log($scope.edificios.length);
        for (i = 0; i < $scope.edificios.length; i++) {
            //console.log($scope.edificios[i].PK_Edificio + " " + PK_Edificio);
            if ($scope.edificios[i].PK_Edificio == PK_Edificio) {

                $scope.selectedEdificio = $scope.edificios[i];
                //console.log($scope.selectedEdificio);
                i = $scope.edificios.length;
            }

        }
    };

    $scope.selPisoPK = function (PK_Piso) {

        //$scope.selectedPiso = null;
        if ($scope.selectedEdificio == null)
            return;

        for (j = 0; j < $scope.selectedEdificio.LstPiso.length; j++) {
            //console.log($scope.selectedEdificio.LstPiso[j].PK_Piso+" "+PK_Piso);
            if ($scope.selectedEdificio.LstPiso[j].PK_Piso == PK_Piso) {

                $scope.selectedPiso = $scope.selectedEdificio.LstPiso[j];
                j = $scope.selectedEdificio.LstPiso.length;
            }
        }
    };

    $scope.selSalaPK = function (PK_Sala) {

        //$scope.selectedSala = null;
        if ($scope.selectedPiso == null)
            return;

        for (k = 0; k < $scope.selectedPiso.LstSala.length; k++) {
            if ($scope.selectedPiso.LstSala[k].PK_Sala == PK_Sala) {
                $scope.selectedSala = $scope.selectedPiso.LstSala[k];
                k = $scope.selectedPiso.LstSala.length;
            }
        }
    };

    $scope.seleccionarPorDefeito = function (item) {
        if (item == null)
            return;

        $scope.selEdificioPK(item.FK_Edificio);

        $scope.selPisoPK(item.FK_Piso);

        $scope.selSalaPK(item.FK_Sala);
    };

    $scope.sortJsonArrayByProperty = function (objArray, prop, direction) {
        if (arguments.length < 2) throw new Error("sortJsonArrayByProp requires 2 arguments");
        var direct = arguments.length > 2 ? arguments[2] : 1; //Default to ascending

        if (objArray && objArray.constructor === Array) {
            var propPath = (prop.constructor === Array) ? prop : prop.split(".");
            objArray.sort(function (a, b) {
                for (var p in propPath) {
                    if (a[propPath[p]] && b[propPath[p]]) {
                        a = a[propPath[p]];
                        b = b[propPath[p]];
                    }
                }
                // convert numeric strings to integers
                a = a.match(/^\d+$/) ? +a : a;
                b = b.match(/^\d+$/) ? +b : b;
                return ((a < b) ? -1 * direct : ((a > b) ? 1 * direct : 0));
            });
        }
    };

    $scope.ordernar = function (lst) {
        return lst.sort(function (a, b) {
            var nameA = a.Descricao.toLowerCase(), nameB = b.Descricao.toLowerCase()
            if (nameA < nameB) //sort string ascending
                return -1
            if (nameA > nameB)
                return 1
            return 0 //default return value (no sorting)
        })
    };

    //Entidade
    $scope.modalEntidades = function (row) {

        if (row == null)
            return;
        //console.log(row);
        var modalInstance = $modal.open(
        {

            templateUrl: 'views/modalEntidades.html',
            controller: 'modalController',
            resolve: {

                items: function () { return row; },

            }
        });

        modalInstance.result.then(function (item) {

            
        }, function () {

        });

    };

});