﻿"use strict";

// login controller
app.controller("loginController", ["$rootScope", "$scope", "$location", "authService", "categoryDataService", "judgeRulesService", "localStorageService", "ngAuthSettings", "$timeout", "$cookies", "configDataService",
    function ($rootScope, $scope, $location, authService, categoryDataService, judgeRulesService, localStorageService, ngAuthSettings, $timeout, $cookies, configDataService) {
        $scope.master = {};
        $scope.randomNumber = Math.random();
        $scope.loginClicked = false;
        $scope.isJudgeSiteClosed = isJudgeSiteClosed;
        $scope.config = null;

        $scope.timerCounterLimitMinutes = 20; // Default is 20 mins, this will come from configkeys
        $scope.timerCounterStart = $scope.timerCounterLimitMinutes * 60;
        $scope.timerCounter = $scope.timerCounterStart; // In secs
        $scope.timerMinutes = $scope.timerCounterLimitMinutes.toString();
        $scope.timerSeconds = "00";
        $scope.timerPercentage = 0;
        $scope.timerProgressCss = "progress-bar-success";
        $scope.stopTimerFunc;
        $scope.showPasswordForm = true;
        $scope.showAccessCodeForm = false;

        $scope.displayCookieMessage = function () {
            // cookies expiration dates arent supported properly in angular 1.2, thats why I used localStorage
            if (localStorageService.get('userAgreedCookies') == null) {
                $(".cookie-message").removeClass("hidden");
                $(".cookieConsentOK").on("click", $scope.checkAndSetFirstTimeCookie);
            }
        }

        $scope.checkAndSetFirstTimeCookie = function () {
            if (localStorageService.get('userAgreedCookies') == null)
                localStorageService.set('userAgreedCookies', 'true')
        }

        $scope.hideSignup = function () {
            if ($rootScope.hideSignUpPanel) {
                return true;
            }

            return false;
        }

        $scope.padNumber = function (num, size) {
            var s = num + "";
            while (s.length < size) s = "0" + s;
            return s;
        };
        $scope.timerCountdown = function () {
            $scope.stopTimerFunc = $timeout(function () {
                $scope.timerCounter--;

                $scope.timerMinutes = $scope.padNumber((~~($scope.timerCounter / 60)), 2);
                $scope.timerSeconds = $scope.padNumber(($scope.timerCounter - ($scope.timerMinutes * 60)), 2);

                $scope.timerPercentage = ($scope.timerCounterStart - $scope.timerCounter) * 100 / $scope.timerCounterStart;

                if ($scope.timerPercentage > 70) {
                    $scope.timerProgressCss = "progress-bar-danger";
                }
                else {
                    $scope.timerProgressCss = "progress-bar-success";
                }

                if ($scope.timerCounter === 0) {
                    $.awards.alert({
                        title: "Timer Expired",
                        message: "Your session has expired. Please enter your credentials again",
                        largeSize: false,
                        okText: "OK"
                    });
                    $scope.stopTimer();
                    $scope.showUsernamePanel();
                }
                else {
                    $scope.timerCountdown();
                }
            }, 1000);
        };
        $scope.stopTimer = function () {
            // The timer has expired
            console.i("timer stopped");
            $timeout.cancel($scope.stopTimerFunc);
        };

        $scope.resendCode = function (user) {
            var credentials = { username: user.username, password: user.password };
            authService.validateCredentialsAndGenerateAccessCode(credentials);
        };

        $scope.accessCodeUpdated = function (user) {
            var codeUser = { username: user.username, password: user.accessCode };
            $scope.authenticateLogin(codeUser, true);
        };

        $scope.login = function (user) {
            console.i('starting login with credentials ...');
            $scope.loginClicked = true;

            var credentials = { username: user.username.trim(), password: user.password.trim(), userName: user.username.trim(), useRefreshTokens: true};
            if (!$scope.config.judgeRequire2FA) {

                authService.login(credentials ).then(function (response) {
                    $rootScope.firstLogin = true;

                    var authData = localStorageService.get(ngAuthSettings.authDataKey);
                    $location.path(response.redirect_url);
                }, function (err) {
                    $scope.showUsernamePanel();
                    if (err.error === "invalid_grant") {
                        $scope.message = "The user name or password is invalid or incorrect.";
                    } else {
                        $scope.message = err.error_description ||
                            "The user name or password is invalid or incorrect.";
                    }
                });

            } else {
                authService.validateCredentialsAndGenerateAccessCode (credentials)
                    .then(function (response) {
                        if (response === "true") {
                            _moveTo2FAStep();
                        }
                        else {
                            $scope.showUsernamePanel();
                            $scope.message = response.message || "The user name or password is invalid or incorrect.";
                        }
                    },
                        function (err) {
                            $scope.showUsernamePanel();
                            if (err.error === "invalid_grant") {
                                $scope.message = "The user name or password is invalid or incorrect.";
                            } else {
                                $scope.message = err.error_description;
                            }
                        });
            }
    };

    $scope.proceedToLoginClicked = function () {
        $('#votesSubmittedModal').modal('hide');
        var credentials = { username: $scope.currentUser.username.trim(), password: $scope.currentUser.password.trim() };


        authService.validateCredentialsAndGenerateAccessCode(credentials)
            .then(function (response) {

                if (response === "true") {
                        _moveTo2FAStep();
                    
                }
                else {
                    $scope.showUsernamePanel();
                    $scope.message = response.message || "The user name or password is invalid or incorrect.";
                }
            },
            function (err) {
                $scope.showUsernamePanel();
                if (err.error === "invalid_grant") {
                    $scope.message = "The user name or password is invalid or incorrect.";
                } else {
                    $scope.message = err.error_description;
                }
            });
    };


    function _moveTo2FAStep() {
        $scope.showAccessCodePanel();
        if ($scope.timerCounterLimitMinutes > 0) {
            $scope.timerCounter = $scope.timerCounterLimitMinutes * 60;
            $scope.timerCountdown();
        }
    };

    function _showLoginErrMsg() {
        $scope.showUsernamePanel();
        if (err.error === "invalid_grant") {
            $scope.message = "The user name or password is invalid or incorrect.";
        } else {
            $scope.message = err.error_description;
        }
    }

    $scope.showAccessCodePanel = function () {
        $scope.message = "";
        $scope.showPasswordForm = false;
        $scope.showAccessCodeForm = true;
    };

    $scope.showUsernamePanel = function () {
        $scope.message = "";
        $scope.showPasswordForm = true;
        $scope.showAccessCodeForm = false;
        $scope.loginClicked = false;
    };

    $scope.loginCode = function (user) {
        console.i('starting login with access code ...');

        if (!user.username || !user.accessCode)
            return;

        var codeUser = { username: user.username, password: user.accessCode };
        $scope.authenticateLogin(codeUser, false, "The access code is incorrect.");
    };

    $scope.authenticateLogin = function(user, silentMode, errorMsg) {
        var loginData = { userName: user.username, password: user.password, useRefreshTokens: true };

        loginData.userName = loginData.userName.trim();
        loginData.password = loginData.password.trim();

        authService.login(loginData).then(function (response) {
            $scope.stopTimer();
            $rootScope.firstLogin = true;

            var authData = localStorageService.get(ngAuthSettings.authDataKey);
            $location.path(authData.homeUrl);

            $scope.setShowPlayer();
        },
        function (err) {
            $scope.loginClicked = false;

            if (silentMode) {
                if (err.error === "grant_expired") {
                    $scope.message = err.error_description || errorMsg;
                }

                return;
            }

            if (err.error === "invalid_grant" || err.error === "grant_expired") {
                $scope.message = err.error_description || errorMsg;
            }
            else {
                $scope.message = err.error_description;
            }
        });
    }

    $scope.setShowPlayer = function () {
        var result = false;
        var notShowList = ["/", "/login", "/forgotPassword", "/error"];

        if (notShowList.indexOf($location.path()) < 0) {
            if (typeof judgeRulesService.showPlayer === "function") {
                result = judgeRulesService.showPlayer();
            }
        }
        $(".playerwrapper").toggleClass("hidden", !result);
    };

    $scope.reset = function () {
        $scope.user = angular.copy($scope.master);
    };

    $scope.clearQueryString = function () {
        $location.search("ts", null);
        $location.search("cid", null);
    };

    $scope.init = function () {

        if (authService.isLoggedIn()) {
            var authData = localStorageService.get(ngAuthSettings.authDataKey);
            $location.path(authData.homeUrl);
        }
        else {
            $scope.displayCookieMessage();
        }

        $scope.clearQueryString();

        var configTask = configDataService.getAppConfig();

        configTask.then(function (result) {
            $scope.config = result.data;
        });

        if (typeof $scope.hideForgotPassword === "undefined") {
            $scope.hideForgotPassword = judgeRulesService.hideForgotPassword || false;
        }

        $scope.setShowPlayer();
    };

    function isJudgeSiteClosed() {
        if (!$rootScope.judgeSiteCloseDate) {
            return false;
        }
        return new Date() > new Date($rootScope.judgeSiteCloseDate);
    };

    $scope.init();

    
}]);