'use strict';
/**
 * @ngdoc service
 * @name Systems
 * @description
 *  system 관련 기능
 */
app.service('Systems', function ($http, $q, $window) {

  this.system = null;
  this.currentJobId = null;
  this.userInfo = null;
  this.selectedBstation = null;
  this.selectedRemote = null;

  /**
   * 현재 job ID 저장
   * @memberof Systems
   * @param {String} id job ID
   */
  this.setCurrentJobId = function(id) {
    this.currentJobId = id;
  };

  /**
   * 현재 job ID 얻기
   * @memberof Systems
   * @returns {String} job ID
   */
  this.getCurrentJobId = function() {
    return this.currentJobId;
  };

  /**
   * 현재 userInfo 저장
   * @memberof Systems
   * @param {String} userInfo base64 encode 된 username:password
   */
  this.setUserInfo = function(userInfo) {
    this.userInfo = userInfo;
  };

  /**
   * 현재 userInfo 얻기
   * @memberof Systems
   * @returns {String} userInfo
   */
  this.getUserInfo = function() {
    return this.userInfo;
  };

  /**
   * 선택된 bstation 저장
   * @memberof Systems
   * @param {Object} bstation 선택된 base station 정보 객체
   */
  this.setSelectedBstation = function(bstation) {
    this.selectedBstation = bstation;
  };

  /**
   * 선택된 bstation 얻기
   * @memberof Systems
   * @returns {Object} bstation
   */
  this.getSelectedBstation = function() {
    return this.selectedBstation;
  };

  /**
   * 선택된 remote 저장
   * @memberof Systems
   * @param {Object} remote 선택된 remote control 정보 객체
   */
  this.setSelectedRemote = function(remote) {
    this.selectedRemote = remote;
  };

  /**
   * 선택된 remote 얻기
   * @memberof Systems
   * @returns {Object} remote
   */
  this.getSelectedRemote = function() {
    return this.selectedRemote;
  };

  /**
   * job ID 로 system 얻기
   * @memberof Systems
   * @returns {Promise} Future object
   */
  this.getJobSystem = function(data) {
    var d = $q.defer();

    $http.post('/installer/api/system/get_job_system', data).success(function(response) {
      console.log(response);
      if(response.result) {
        d.resolve(response);
      } else {
        d.reject(response.error);
      }
    }, function(error) {
      d.reject(error);
    });

    return d.promise;
  };

  /**
   * system 저장
   * @memberof Systems
   * @param {Object} system
   */
  this.loadSystem = function(system) {
    this.system = system;   // system 정보를 현재 system 으로 저장
  };

  /**
   * system 정보 얻기
   * @memberof Systems
   * @returns {Object} 현재 system 정보 객체
   */
  this.getCurrentSystem = function() {
    return this.system;
  };

  /**
   * system 정보 얻어와서 저장
   * @memberof Systems
   * @param {Number} id system ID
   * @param {String} data json string
   * @returns {Promise} Future object
   */
  this.updateSystem = function (id, data) {

    var self = this,
      d = $q.defer();

    // system 얻기 API 호출
    $http.post('/installer/api/system/get/' + id, data).success(function(response) {
      console.log(response);
      if(response.result) {
        self.loadSystem(response.data);   // 얻어온 system 를 저장
        self.setUserInfo(JSON.parse(data).userInfo);    // userInfo 저장

        var user = JSON.parse($window.localStorage.getItem('hcm_installer'));    // localStorage 에서 사용자 정보 얻기
        user.system_id = id;
        user.userInfo = data;

        $window.localStorage.setItem('hcm_installer', JSON.stringify(user));   // 사용자 정보에 system ID, userInfo 를 더해서 localStorage 에 저장

        d.resolve(response.data);
      } else {
        d.reject(response.data);
      }
    }, function(error) {
      d.reject(error);
    });

    return d.promise;
  };

  /**
   * system 생성
   * @memberof Systems
   * @param {String} data system 생성에 필요한 정보들 json string
   * @returns {Promise} Future object
   */
  this.createOne = function (data) {

    var d = $q.defer();

    // system 생성 API 호출
    $http.post('/installer/api/system/create', data).success(function(response) {
      console.log(response);
      if(response.result) {
        d.resolve(response.systemId);   // 만들어진 system 의 ID
      } else {
        d.reject(response.error);
      }
    }, function(error) {
      d.reject(error);
    });

    return d.promise;
  };

  /**
   * 사용자 생성
   * @memberof Systems
   * @param {String} data 사용자 생성을 위한 정보 json string
   * @returns {Promise} Future object
   */
  this.createUser = function(data) {
    var d = $q.defer();

    // 사용자 생성 api 호출
    $http.post('/installer/api/system/create_user', data).success(function(response) {
      if(response.result) {
        d.resolve(response);
      } else {
        d.reject(response.error);
      }
    }).error(function(error) {
      d.reject(error);
    });

    return d.promise;
  };

  /**
   * 편집중인 사용자 system 목록 얻기
   * @memberof Systems
   * @param {String} data userInfo, jobId json string
   * @returns {Promise} Future object
   */
  this.getListWorking = function(data) {
    var d = $q.defer();

    // 편집중인 사용자 system 목록 얻기 호출
    $http.post('/installer/api/system/list_working', data).success(function(response) {
      if(response.result) {
        d.resolve(response);
      } else {
        d.reject(response.error);
      }
    }).error(function(error) {
      d.reject(error);
    });

    return d.promise;
  };

  /**
   * device 들을 해당 system 이 있는 network 에서 search
   * @memberof Systems
   * @param {String} deviceName device name
   * @param {String} data json string
   * @returns {Promise} Future object
   */
  this.searchHardware = function(deviceName, data) {
    // deviceName (String): hardware device name
    // data (Object): additional data to be passed along with systemId (optional)

    data = data || null; //optional parameter

    var self = this,
      d = $q.defer();

    var currentSystem = self.getCurrentSystem();
    var sendData = { systemId : currentSystem.id };

    //if there is data is present in the arguments passed through append to sendData
    if (data) {
      _.assign(sendData, data);
    }

    var jsonData = JSON.stringify(sendData);

    // deviceName 을 가진 device 들을 해당 system 이 있는 network 에서 search 하는 API 호출
    $http.post('/installer/api/cloud/search/' + deviceName, jsonData)
      .success(function(response) {
        if(response.result) {

          var resolve = {
              searchedDevices: response.data,
              searchKey: response.searchKey
            };

          d.resolve(resolve);

        } else {
          d.reject(response.error);
        }

      }, function(error) {
        console.log(error);
        d.reject(error);
      });

    return d.promise;
  };

  /**
   * MAC이 할당되지 않은 (TMP_로 시작하는 MAC) Base station 에 MAC을 할당
   * @memberof Systems
   * @param {Number} systemId system ID
   * @param {String} data json string
   * @returns {Promise} Future object
   */
  this.assignBaseStation = function(systemId, data) {
    var d = $q.defer();

    $http.post('/installer/api/system/assign_bstation/' + systemId, data).success(function(response) {
      if(response.result) {
        d.resolve(response);
      } else {
        d.reject(response.error);
      }
    }).error(function(error) {
      d.reject(error);
    });

    return d.promise;
  };

  /**
   * MAC이 할당되지 않은 (TMP_로 시작하는 MAC) Remote control 에 MAC을 할당
   * @memberof Systems
   * @param {Number} systemId system ID
   * @param {String} data json string
   * @returns {Promise} Future object
   */
  this.assignRemoteControl = function(systemId, data) {
    var d = $q.defer();

    $http.post('/installer/api/system/assign_remote/' + systemId, data).success(function(response) {
      if(response.result) {
        d.resolve(response);
      } else {
        d.reject(response.error);
      }
    }).error(function(error) {
      d.reject(error);
    });

    return d.promise;
  };

  /**
   * TV 등 각종 Device 들의 Address 를 세팅
   * @memberof Systems
   * @param {Number} systemId system ID
   * @param {String} data json string
   * @returns {Promise} Future object
   */
  this.assignDevices = function(systemId, data) {
    var d = $q.defer();

    $http.post('/installer/api/system/assign_devices/' + systemId, data).success(function(response) {
      if(response.result) {
        d.resolve(response);
      } else {
        d.reject(response.error);
      }
    }).error(function(error) {
      d.reject(error);
    });

    return d.promise;
  };

  /**
   * 사용자 데이터 세팅 완료 설정
   * @memberof Systems
   * @param {Number} systemId system ID
   * @param {String} data json string
   * @returns {Promise} Future object
   */
  this.setDone = function(systemId, data) {
    var d = $q.defer();

    $http.post('/installer/api/system/set_done/' + systemId, data).success(function(response) {
      if(response.result) {
        d.resolve(response);
      } else {
        d.reject(response.error);
      }
    }).error(function(error) {
      d.reject(error);
    });

    return d.promise;
  };

});