'use strict';
/**
 * @ngdoc controller
 * @name LoginController
 * @description
 *  로그인, 비밀번호 리셋 관련
 */
app.controller('LoginController', function ($rootScope, $scope, $state, $stateParams, toastr, Systems, Auth, User, Dealer) {
  // 로그인이 필요한 url 에 로그인 없이 접근하면 e=401 파리미터를 가지고 /login 으로 오는데 그때에 대한 처리
  if (!_.isEmpty($stateParams)) {
    if ($stateParams.e === '401') {
      $scope.error = '<div class="alert alert-warning"><i class="fa fa-lg fa-warning"></i>&nbsp;&nbsp;You must log in to access this page.</div>';
    }
  }

  // 이미 로그인한 사용자면 system-overview 메뉴로 이동시킴
  Auth.currentUser().then(function(user) {
    if(user) {
      $state.go('menu.system-overview');
    }
  });

  // dealer 로그인인지 검사
  $scope.dealerLogin = false;
  $scope.$watch('credentials.username', function (newVal, oldVal) {
    if (newVal && newVal.match('@')) {
      $scope.dealerLogin = true;
    } else {
      $scope.dealerLogin = false;
    }
  });

  // 로그인 화면에서 아이디/패스워드 입력 후 Sign in 버튼 클릭하면 실행되는 함수
	$scope.login = function() {
		var jsonData = JSON.stringify( $scope.credentials );  // 아이디/패스워드
		console.log(jsonData);

    // dealer 로그인과 일반 사용자 로그인을 구분
    // dealer
    if ($scope.dealerLogin) {
      Dealer.login(jsonData)
        .then( function(data) {
          if(data.result) {
            // dealer company 불러오기
            $rootScope.dealerCompany = Dealer.getDealerCompany();

            $state.go('dealer-jobs-list');
          } else {
            toastr.error(data.error);
          }
        })
        .catch(toastr.error);
    }
    // 일반 사용자
    else {
      // system-select 화면에서 dealer 에게 assign 된 system 인 경우 user-login-change 로 보내기 위해서 sessionStorage 에 저장
      sessionStorage.setItem('credentials', jsonData);

      // 로그인
      User.login(jsonData)
        .then( function(data) {
          if(data.result) {
            if (data.status) {  // result=true, status=true 일 때 로그인 처리
              if (data.systems.length) {  // 등록된 system 이 있는 경우
                Systems.loadSystems(data.systems);
                $state.go('system-select');
              } else {  // 등록된 system 이 없는 경우
                $scope.loginForm.$setPristine();
                $scope.credentials.password = '';
                toastr.warning('It seems you do not have any systems registered on your account. Please register one <a href="/#/register">here</a>.', 'Warning', { allowHtml: true });
              }
            } else {  // result=true, status=false 인 경우: forgot password 로 reset 했는데 base station 이 없거나 통신문제가 발생한 경우
              $rootScope.systemsInfo = angular.copy(data.info);
              $rootScope.credentials = angular.copy($scope.credentials);
              $state.go('ignore-offline-systems');
            }
          } else {
            if (data.code === 'ACCESS_DENY') {
              window.location = '/user-login-change#/auto-login';
            } else {
              toastr.error(data.error);
              $scope.credentials.password = '';
              $scope.loginForm.$setPristine();
            }
          }
        })
        .catch(toastr.error);
    }
	};

});

/**
 * @ngdoc controller
 * @name IgnoreOfflineController
 * @description
 *  forgot password 로 reset 했는데 base station 이 없거나 통신문제가 발생한 경우의 로그인 처리
 */
app.controller('IgnoreOfflineController', function($rootScope, $scope, $state, $stateParams, $modal, toastr, User, Systems) {
  // LoginController 에서 IgnoreOfflineController 로 데이터를 전달하기 위해 $rootScope 를 사용하였으나 전달이 끝나면 $rootScope 의 프로퍼티를 삭제
  $scope.systemsInfo = angular.copy($rootScope.systemsInfo);
  $scope.credentials = angular.copy($rootScope.credentials);
  delete($rootScope.systemsInfo);
  delete($rootScope.credentials);

  $scope.forceIgnore = false;
  $scope.ignore = false;
  $scope.processing = false;

  _.each($scope.systemInfo, function(obj) {
    if (obj.connection == 2) {  // 2의 값이 하나라도 나온 경우는 system들이 복구가 안되는 상황이므로 반드시 ignore 하여 로그인해야함
      $scope.forceIgnore = true;
      $scope.ignore = true;
    }
  });

  $scope.goBack = function() {
    $state.go('login');
  };

  $scope.doNext = function() {
    var modal = $modal({
      scope: $scope,
      template: 'views/modal-tpls/ignore-offline.html',
      container: 'body',
      show: false
    });
    modal.$promise.then(modal.show);
  };

  $scope.reset = function() {
    if ($scope.ignore) {  // ignore 에 체크한 경우 bstationChk=0 값을 넣어서 로그인
      $scope.credentials.bstationChk = 0;
    }

    $scope.processing = true;
    login($scope.credentials);
  };

  function login(credentials) {
    var jsonData = JSON.stringify(credentials);

    User.login(jsonData)
      .then( function(data) {
        if(data.result) {
          if (data.status) {
            if (data.systems.length) {
              Systems.loadSystems(data.systems);
              $state.go('system-select');
            } else {
              toastr.warning('It seems you do not have any systems registered on your account. Please register one <a href="/#/register">here</a>.', 'Warning', { allowHtml: true });
            }
          } else {
            $rootScope.systemsInfo = angular.copy(data.info);
            $rootScope.credentials = angular.copy($scope.credentials);
            $state.go('ignore-offline-systems', {}, {reload: true});
          }
        } else {
          toastr.error(data.error);
        }

        $scope.processing = false;
      })
      .catch(toastr.error);
  }
});

/**
 * @ngdoc controller
 * @name IgnoreOfflineCreateController
 * @description
 *  forgot password 로 reset 했는데 base station 이 없거나 통신문제가 발생한 경우의 system 생성을 위한 로그인 처리
 */
app.controller('IgnoreOfflineCreateController', function($rootScope, $scope, $state, $stateParams, $modal, toastr, User, Registration) {
  // RegisterController 에서 IgnoreOfflineController 로 데이터를 전달하기 위해 $rootScope 를 사용하였으나 전달이 끝나면 $rootScope 의 프로퍼티를 삭제
  $scope.systemsInfo = angular.copy($rootScope.systemsInfo);
  $scope.credentials = angular.copy($rootScope.credentials);
  delete($rootScope.systemsInfo);
  delete($rootScope.credentials);

  $scope.forceIgnore = false;
  $scope.ignore = false;
  $scope.processing = false;

  _.each($scope.systemInfo, function(obj) {
    if (obj.connection == 2) {  // 2의 값이 하나라도 나온 경우는 system들이 복구가 안되는 상황이므로 반드시 ignore 하여 로그인해야함
      $scope.forceIgnore = true;
      $scope.ignore = true;
    }
  });

  $scope.goBack = function() {
    $state.go('login');
  };

  $scope.doNext = function() {
    var modal = $modal({
      scope: $scope,
      template: 'views/modal-tpls/ignore-offline.html',
      container: 'body',
      show: false
    });
    modal.$promise.then(modal.show);
  };

  $scope.reset = function() {
    if ($scope.ignore) {  // ignore 에 체크한 경우 bstationChk=0 값을 넣어서 로그인
      $scope.credentials.bstationChk = 0;
    }

    $scope.processing = true;
    loginForCreate($scope.credentials);
  };

  function loginForCreate(credentials) {
    var jsonData = JSON.stringify(credentials);

    User.loginForCreate(jsonData).then(function(data) {
      if(data.result) {
        if (data.status) {
          Registration.setSystemKey($scope.credentials.key);
          Registration.setBStationMac(data.mac);
          Registration.setSystemType($scope.credentials.modelType);

          $state.go('add-new-system');
        } else {
          $rootScope.systemsInfo = angular.copy(data.info);
          $rootScope.credentials = angular.copy($scope.credentials);
          $state.go('ignore-offline-systems-for-create', {}, {reload: true});
        }
      } else {
        toastr.error(data.error);
      }

      $scope.processing = false;
    }).catch(toastr.error);
  }
});

/**
 * @ngdoc controller
 * @name ForgotController
 * @description
 *  로그인 화면 하단의 "Forgot your password?" 를 클릭해서 들어온 경우 password reset 처리
 */
app.controller('ForgotController', function ($scope, $state, toastr, Auth, User){
  $scope.forgot = {};

  // 로그인 된 상태에서 접근하면 system-overview 로 이동
  Auth.currentUser().then(function(user) {
    if(user) {
      $state.go('menu.system-overview');
    }
  });

  $scope.resetPassword = function() {

    var jsonData = JSON.stringify( $scope.forgot );
    console.log(jsonData);

    // reset password
    User.resetPassword($scope.forgot)
      .then(function() {
        toastr.success('Your password has been reset.');
        $state.go('login');
      })
      .catch(toastr.error);
    
  };
});
