Source: components/inicio/inicio.controller.js

/**
 * @ngdoc inicio
 * @name InicioCtrl
 * @module s4c.components.inicio.InicioCtrl
 *
 * @description Controller da tela de login 
 * 
 * 
 */
(function () {
    'use strict';

    /**
     * @method InicioCtrl
     * 
     * @param {*} $rootScope 
     * @param {*} $scope 
     * @param {*} $state 
     * @param {*} $http 
     * @param {*} API_ENDPOINT 
     * @param {*} $location 
     * @param {*} AuthService 
     * @param {*} $window 
     * @param {*} localize 
     * @param {*} $locale 
     * @param {*} $dtlocale 
     * @param {*} tmhDynamicLocale 
     * @param {*} amMoment 
     * @param {*} $interval 
     * @param {*} ParametrosS4C 
     * @param {*} $mdDialog 
     * @param {*} Base 
     * @param {*} $timeout 
     * @param {*} LocationService 
     * @param {*} MainState 
     */
    function InicioCtrl($rootScope, $scope, $state, $http, API_ENDPOINT,
        $location, AuthService, $window, localize, $locale, $dtlocale, tmhDynamicLocale,
        amMoment, $interval, ParametrosS4C, $mdDialog, Base, $timeout, LocationService, MainState) {

        $scope.res = $rootScope.res;
        $scope.displayLogin = false;

        /**
         * @method alterarIdioma
         * 
         * @param {*} idioma 
         */
        function alterarIdioma(idioma) {

            localize.setLanguage(idioma);
            tmhDynamicLocale.set(localize.language).then(function () {
                amMoment.changeLocale(localize.language);
                var shortDate = $locale.DATETIME_FORMATS.shortDate;
                shortDate = shortDate.replace(new RegExp('yy', 'g'), 'yyyy');
                $locale.DATETIME_FORMATS.shortDate = shortDate;
                var datetimepickerLang = _.find($dtlocale.i18n, function (dpt) {
                    return dpt.lang.toLowerCase() === $locale.id;
                });
                $locale.DATETIME_FORMATS.datetimepicker = datetimepickerLang ? datetimepickerLang : _.find($dtlocale.i18n, { lang: 'en' });
                getCurrentWeather();
            });
        }

        ParametrosS4C.downloadParametros()
            .then(function (parametros) {
                $rootScope.ParametrosS4C = parametros;
                applyBackgroundImage();
            });

        /**
         * @method applyBackgroundImage 
         */
        function applyBackgroundImage() {
            angular.element('#wrapperInicio').css('background-image', 'url(' + $rootScope.ParametrosS4C.imagemInicial + ')');
        }

        /**
         * @method openLoginModal
         */
        function openLoginModal() {
            Base.obter('ldap/authenticatedUser').then(function (response) {
                if (response.s4c_mode_auth != null && response.s4c_mode_auth == "LDAP") {
                    $scope.isLdapAuthenticatedUser = true;
                    Base.obter('dominios/ldap').then(function (response) {
                        $scope.dominios = response;
                        $scope.displayLogin = !$scope.displayLogin;
                        $scope.isRemember = !$scope.displayLogin;
                    });
                } else {
                    $scope.isLdapAuthenticatedUser = false;
                }
            });
        }

		//Retirando a chamada ao metodo ldap/authenticatedUser. Se não der problema, exclua ambas as linhas
        //openLoginModal();

        /**
         * @method rememberModal
         */
        function rememberModal() {
            $scope.isRemember = !$scope.isRemember;
        }

        /**
         * @method k2c
         * 
         * @param {*} k 
         */
        function k2c(k) {
            return Math.round(k - 273.15);
        }

        /**
         * @method translateCondition
         * 
         * @param {*} condition 
         */
        function translateCondition(condition) {
            switch (condition) {
                case 'Clouds':
                    return localize.getLocalizedString('TEMPO_NUBLADO');
                case 'Mist':
                    return localize.getLocalizedString('TEMPO_PARCIALMENTENUBLADO');
                case 'Rain':
                    return localize.getLocalizedString('TEMPO_CHUVA');
                case 'Thunderstorm':
                    return localize.getLocalizedString('TEMPO_TROVOADA');
                case 'Sun':
                    return localize.getLocalizedString('TEMPO_ENSOLARADO');
                case 'Clear':
                    return localize.getLocalizedString('TEMPO_LIMPO');
            }
        }

        /**
         * @method getConditionIcon
         * 
         * @param {*} condition 
         */
        function getConditionIcon(condition) {
            var icon = '/assets/images/';

            switch (condition) {
                case 'Clouds':
                    return icon + 'ic_nublado_white_48px.svg';
                case 'Mist':
                    return icon + 'ic_parcialmente_nublado_white_48px.svg';
                case 'Rain':
                    return icon + 'ic_chuva_48px.svg';
                case 'Thunderstorm':
                    return icon + 'ic_raios_white_48px.svg';
                case 'Sun':
                    return icon + 'ic_ensolarado_48px.svg';
                case 'Clear':
                    return icon + 'ic_ensolarado_48px.svg';
            }
        }

        /**
         * @method timestamp2string
         * @param {*} timestamp 
         */
        function timestamp2string(timestamp) {
            return moment.unix(timestamp).format('ddd - DD/MM/YYYY')
        }

        LocationService.getLocation();

        /**
         * @method getCurrentWeather
         */
        function getCurrentWeather() {
            $http({
                method: 'GET',
                url: '/externalServiceCaller',
                params: { url: "http://api.openweathermap.org/data/2.5/forecast/daily?lat=" + LocationService.getLat() + "&lon=" + LocationService.getLon() + "&cnt=6&mode=json&APPID=9a05e591d36e51e747fb7f515186c6b0" }
            }).then(function (response) {
                adjustDate();
                if (typeof response.data === 'object') {
                    if (response.data.list[0].temp.day) {
                        $scope.currentTemp = k2c(response.data.list[0].temp.day);
                    } else { }

                    $scope.currentCondition = translateCondition(response.data.list[0].weather[0].main);
                    $scope.currentConditionIcon = getConditionIcon(response.data.list[0].weather[0].main);
                    $scope.currentDateString = timestamp2string(response.data.list[0].dt);
                    return response.data;
                }
            }, function (response) {
            });
        }

        /**
         * @method getWeatherForecast
         */
        function getWeatherForecast() {
            $http({
                method: 'GET',
                url: '/externalServiceCaller',
                params: { url: "http://api.openweathermap.org/data/2.5/forecast/daily?lat=" + LocationService.getLat() + "&lon=" + LocationService.getLon() + "&cnt=6&mode=json&APPID=9a05e591d36e51e747fb7f515186c6b0" }
            }).then(function (response) {
                adjustDate();
                if (typeof response.data === 'object') {
                    $scope.weatherForecast = response.data.list;
                    return response.data;
                }
            });
        }

        $scope.isElectron = navigator.userAgent.indexOf("Electron") != -1;
        $scope.reboot = function () {
            MainState.reboot();
        }

        $scope.shutdown = function () {
            MainState.shutdown();
        }

        $scope.license = false;
        $scope.error = false;
        $scope.license_message;
        /**
         * @method login
         */
        function login() {
            $scope.loading = true;
            $scope.form_login = {};
            $scope.form_login.username = $scope.user.username;
            $scope.form_login.password = $scope.user.password;
            $scope.form_login.primeiroLogin = $scope.user.primeiroLogin;
            $scope.form_login.dominio = $scope.user.dominio;
            AuthService.login($scope.user.username, $scope.user.password, $scope.user.primeiroLogin, $scope.user.dominio)
                .then(function (token) {
                    adjustDate();
                    $rootScope.oauth = token;
                    $scope.loading = false;

                    $location.path('/');
                }, function (error) {
                    $scope.loading = false;

                    if (error.data && error.data.status == 403) {

                        $scope.license = true;
                        $scope.license_message = $scope.res(error.data.message);

                    } else if (error.data && error.data.errorCode == 401 && error.data.messageError == 'userAlreadyAuthenticatedException') {

                        loginAgain();
                    	/*
                        Base.salvar('logoutAll', $scope.form_login).then(function (rep) {
                            reLogin();
                        });
                        */

                    } else {
                        $scope.error = true;
                    }

                    $scope.user.password = '';
                });
        }

        /**
         * @method loginAgain
         */
        function loginAgain() {
            var confirm = $mdDialog.confirm()
                .title($scope.res('COMUM_AVISO'))
                .content($scope.res('SESSAO_ATIVA'))
                .ok($scope.res('COMUM_SIM'))
                .cancel($scope.res('COMUM_CANCELAR'));

            $mdDialog.show(confirm)
                .then(function () {
                    Base.salvar('logoutAll', $scope.form_login).then(function (rep) {
                        reLogin();
                    });

                }, function () {
                    console.log('cancel');
                });
        }

        /**
         * @method reLogin
         */
        function reLogin() {
            $scope.loading = true;
            AuthService.login($scope.form_login.username, $scope.form_login.password, $scope.form_login.primeiroLogin, $scope.form_login.dominio)
                .then(function (token) {
                    adjustDate();
                    $rootScope.oauth = token;
                    $location.path('/');
                    $scope.loading = false;
                }, function (error) {
                    $scope.loading = false;

                    if (error.data.status == 403) {

                        $scope.license = true;
                        $scope.license_message = $scope.res(error.data.message);

                    } else {
                        $scope.error = true;
                    }

                    $scope.user.password = '';
                });
        }

        /**
         * @method adjustDate
         */
        function adjustDate() {
            Base.obter('date_server').then(function (response) {

                var horario = moment(response, "DD/MM/YYYY HH:mm");
                var then = moment();
                $window.sessionStorage.setItem('diff_date', horario.diff(then));
                moment.now = function () {
                    var diff_date = $window.sessionStorage.getItem('diff_date');
                    var m = moment(new Date());
                    m.add(diff_date, 'ms').hours();
                    return m;
                };
            });
        }

        /**
         * @method rememberPassword
         */
        function rememberPassword() {
            if (($scope.user.username == null || $scope.user.username == '') && ($scope.user.email == null || $scope.user.email == '')) {
                $mdDialog.show($mdDialog.alert()
                    .title($scope.res('COMUM_AVISO'))
                    .content($scope.res('REMEMBER_PASSWORD_CAMPO_VAZIO'))
                    .ok($scope.res('COMUM_OK')));
                return;
            }

            var _sucesso = true;

            if ($scope.user.username != null && $scope.user.username.trim().length > 0) {
                Base.obter('remember/user/username/' + $scope.user.username).then(function (data) {
                    if (data == null || data == "") {
                        _sucesso = false;
                        $mdDialog.show($mdDialog.alert()
                            .title($scope.res('COMUM_AVISO'))
                            .content($scope.res('USUARIO_INATIVO'))
                            .ok($scope.res('COMUM_OK')));
                        return;
                    } else if (data != null && data.email != null) {
                        var objeto = {};
                        objeto.username = $scope.user.username;
                        Base.salvar('remember/password/', objeto).then(function (response) {

                        });
                    }
                    if (_sucesso) {
                        $mdDialog
                            .show($mdDialog.alert()
                                .title($scope.res('COMUM_SUCESSO'))
                                .content($scope.res('REMEMBER_PASSWORD_TITLE'))
                                .ok($scope.res('COMUM_OK'))).then(function () {
                                    rememberModal();
                                });
                    }
                });
            }
            else if ($scope.user.email != null && $scope.user.email.trim().length > 0) {
                var objeto_email = {};
                objeto_email.email = $scope.user.email;
                Base.salvar('remember/user/email/', objeto_email).then(function (data) {
                    if (data == null || data == "") {
                        _sucesso = false;
                        $mdDialog.show($mdDialog.alert()
                            .title($scope.res('COMUM_AVISO'))
                            .content($scope.res('USUARIO_INATIVO'))
                            .ok($scope.res('COMUM_OK')));
                        return;
                    } else if (data != null && data.email != null) {
                        var objeto = {};
                        objeto.email = $scope.user.email;
                        Base.salvar('remember/password/', objeto).then(function (response) {

                        });
                    }
                    if (_sucesso) {
                        $mdDialog
                            .show($mdDialog.alert()
                                .title($scope.res('COMUM_SUCESSO'))
                                .content($scope.res('REMEMBER_PASSWORD_TITLE'))
                                .ok($scope.res('COMUM_OK'))).then(function () {
                                    rememberModal();
                                });
                    }
                });
            }
        }

        $scope.horario = moment().format('HH:mm');

        $interval(function () {
            $scope.horario = moment().format('HH:mm');
        }, 1000);

        angular.extend($scope, {
            login: login,
            user: {
                error: false
            },
            getCurrentWeather: getCurrentWeather,
            getWeatherForecast: getWeatherForecast,
            k2c: k2c,
            translateCondition: translateCondition,
            getConditionIcon: getConditionIcon,
            timestamp2string: timestamp2string,
            openLoginModal: openLoginModal,
            alterarIdioma: alterarIdioma,
            rememberPassword: rememberPassword,
            rememberModal: rememberModal
        });

        $timeout(function () {
            getCurrentWeather();
            getWeatherForecast();
        }, 1500);

    }

    InicioCtrl.$inject = [
        '$rootScope',
        '$scope',
        '$state',
        '$http',
        'API_ENDPOINT',
        '$location',
        'AuthService',
        '$window',
        'localize',
        '$locale',
        '$dtlocale',
        'tmhDynamicLocale',
        'amMoment',
        '$interval',
        'ParametrosS4C',
        '$mdDialog',
        'Base',
        '$timeout',
        'LocationService',
        'MainState'
    ];

    /**
     * @method compareTo
     */
    function compareTo() {
        return {
            require: "ngModel",
            scope: {
                otherModelValue: "=compareTo"
            },
            link: function (scope, element, attributes, ngModel) {

                ngModel.$validators.compareTo = function (modelValue) {
                    return modelValue === scope.otherModelValue;
                };

                scope.$watch("otherModelValue", function () {
                    ngModel.$validate();
                });
            }
        };
    }

    /**
     * @method safePassword
     */
    function safePassword() {
        return {
            require: "ngModel",
            scope: {
                username: '=username',
                nome: '=nome'
            },
            link: function (scope, element, attributes, ngModel) {
                /*
                 * Valid passwords:
                 * @a0Abcab
                 * 0@acanan
                 */

                // Retorno:
                // true = tudo OK
                ngModel.$validators.safePassword = function (modelValue) {
                    // Queremos que seja true:
                    var checkMinusculas = /(.*[a-z]){1,}/.test(modelValue);
                    var checkMaiusculas = /(.*[A-Z]){1,}/.test(modelValue);
                    var checkNumeros = /(.*[0-9]){1,}/.test(modelValue);
                    var checkCaracteres = /(.*[!@#$&*,.()%^]){1,}/.test(modelValue);

                    var checkName = true;
                    var checkUsername = true;

                    var checks = [
                        checkMinusculas,
                        checkMaiusculas,
                        checkNumeros,
                        checkCaracteres
                    ].filter(function (check) {
                        return check;
                    });

                    if (modelValue !== undefined) {
                        var usernameTester = new RegExp(scope.username, 'i');
                        checkUsername = !usernameTester.test(modelValue.trim());
                    }

                    var nomeSobrenome = scope.nome.split(' ');
                    for (var i = 0; i < nomeSobrenome.length; i++) {
                        var nameTester = new RegExp(nomeSobrenome[i], 'i');
                        checkName = !nameTester.test(modelValue);
                        if (!checkName) {
                            break;
                        }
                    }

                    // Pelo menos cumpre 3 das regras
                    var valido = checks.length >= 3 &&
                        checkName && checkUsername;

                    /*checkMinusculas && checkMaiusculas &&
                    checkNumeros && checkCaracteres*/

                    return valido;
                };
            }
        };
    }

    angular.module('s4c.controllers.InicioCtrl', ['s4c.services.AuthService'])
        .controller('InicioCtrl', InicioCtrl)
        .directive('compareTo', compareTo)
        .directive('safePassword', safePassword);

}());