'use strict';
/**
 * @ngdoc service
 * @name User
 * @description
 *  사용자 정보 관리와 관련된 기능
 */
app.service('User', function ($rootScope, $http, $q, $window, Auth, jwtHelper) {

  /**
   * 사용자 생성
   * @memberof User
   * @param {String} data 가입 폼으로 부터 생성된 사용자 정보 json string
   * @returns {Promise} Future object
   */
  this.create = function(data) {
    var d = $q.defer();

    // 사용자 생성 api 호출
    $http.post('/api/user/create', data).
    success(function(response) {
      console.log(response);
      if(response.result) {
        var token = jwtHelper.decodeToken(response.token);    // 서버로 부터 받은 token decode
        var name = token.sub;
        var id = token.usr_id;
        var user = { id: id, username: name, email: response.email, token: response.token, optMenuShow: response.opt_menu_show, optHelpShow: response.opt_help_show, timestamp: parseInt(+new Date() / 1000, 10) };
        Auth.setCurrentUser(user);  // 현재 사용자 정보로 저장 => 클라이언트에서의 로그인 처리
        d.resolve(response);
      }
      else {
        d.reject(response.error);
      }
    }).
    error(function(error) {
      d.reject(error);
    });

    return d.promise;
  };

  /**
   * 시스템 생성을 위한 로그인
   * @memberof User
   * @param {String} data 사용자 아이디/패스워드 json string
   * @returns {Promise} Future object
   */
  this.loginForCreate = function(data) {
    var d = $q.defer();

    // 시스템 생성을 위한 로그인 api 호출
    $http.post('/api/user/login_for_create', data).success(function(response) {
      if (response.result && response.status) {   // result 와 status 가 모두 true 일 때 로그인 시킴
        var token = jwtHelper.decodeToken(response.token);
        var name = token.sub;
        var id = token.usr_id;
        var user = { id: id, username: name, email: response.email, token: response.token, optMenuShow: response.opt_menu_show, optHelpShow: response.opt_help_show, timestamp: parseInt(+new Date() / 1000, 10) };
        Auth.setCurrentUser(user);
      }
      d.resolve(response);
    }).error(function(error) {
      d.reject(error);
    });

    return d.promise;
  };

  /**
   * 로그인
   * @memberof User
   * @param {String} data 사용자 아이디/패스워드 json string
   * @returns {Promise} Future object
   */
  this.login = function(data) {
    var self = this,
        d = $q.defer();

    // 로그인 API 호출
    $http.post('/api/user/login', data).success(function(response) {
      console.log(response);  // result 와 status 가 모두 true 일 때 로그인 시킴
      if (response.result && response.status) {
        var token = jwtHelper.decodeToken(response.token);
        var name = token.sub;
        var id = token.usr_id;
        var user = { id: id, username: name, email: response.email, token: response.token, optMenuShow: response.opt_menu_show, optHelpShow: response.opt_help_show, timestamp: parseInt(+new Date() / 1000, 10) };
        Auth.setCurrentUser(user);
      }
      d.resolve(response); 
    }).error(function (error) {
      d.reject(error);
    });

    return d.promise;
  };

  /**
   * 로그아웃
   * @memberof User
   * @returns {Promise} Future object
   */
  this.logout = function() {
    var d = $q.defer();
    Auth.removeCurrentUser();
    d.resolve();
    return d.promise;
  };

  /**
   * 사용자 email 변경
   * @memberof User
   * @param {String} data 패스워드/이메일 json string
   * @returns {Promise} Future object
   */
  this.changeEmail = function(data) {
    var d = $q.defer(),
     self = this;

    // 사용자 email 변경 API 호출
    $http.post('/api/user/new_email', data).
    success(function(response) {
      console.log(response);
      if(response.result) {
        d.resolve(response.data);
      }
      else {
        d.reject(response.error);
      }
    }).
    error(function(error) {
      d.reject(error);
    });

    return d.promise;
  };

  /**
   * 사용자 password 변경
   * @memberof User
   * @param {String} data 이전 패스워드/변경할 패스워드 json string
   * @returns {Promise} Future object
   */
  this.changePassword = function(data) {
    var d = $q.defer(),
     self = this;

    // 사용자 password 변경 API 호출
    $http.post('/api/user/new_password', data)
    .success(function(response) {
      console.log(response);
      if(response.result) {
        d.resolve(response);
      } else {
        d.reject(response.error);
      }
    })
    .error(function(error) {
      d.reject(error);
    });

    return d.promise;
  };

  /**
   * 패스워드 리셋
   * @memberof User
   * @param {String} data 사용자 email 주소
   * @returns {Promise} Future object
   */
  this.resetPassword = function(data) {
    var d = $q.defer();

    // 패스워드 리셋 API 호출
    $http.post('/api/email/forget_password', JSON.stringify(data))
      .success(function(response) {
        console.log(response);
        if(response.result) {
          d.resolve(response);
        } else {
          d.reject(response.error);
        }
      })
      .error(function(error) {
        d.reject(error);
      });

    return d.promise;
  };

  /**
   * programming menu help show, advanced menu show 옵션 저장
   * @memberof User
   * @param {String} data option json string
   * @returns {Promise} Future object
   */
  this.setOption = function(data) {
    var d = $q.defer();

    var url;
    if ($rootScope.virtualEditor) {
      url = '/api/dealer/set_option';
    } else {
      url = '/api/user/set_option';
    }

    $http.post(url, data)
      .success(function(response) {
        console.log(response);
        if(response.result) {
          d.resolve(response);
        } else {
          d.reject(response.error);
        }
      })
      .error(function(error) {
        d.reject(error);
      });

    return d.promise;
  };

  this.getUserInfo = function() {
    var  d = $q.defer(),
      url = '/api/user/user_info';

    $http.post(url)
      .success(function(response) {
        if(response.result) {
          d.resolve(response);
        } else {
          d.reject(response.error);
        }
      })
      .error( function(error) {
        d.reject(error);
      });

    return d.promise;
  };

});
