var angular = require('angular');
require('../modules');
require('jsUtil');

'use strict';

var module = angular.module('task.services');

module.factory('TaskRemoteService', function($http, $state, $rootScope) {
  var taskTypeMap = {
    '0': '局发文',
    '1': '处发文',
    '2': '局收文',
    '3': '处收文',
    '4': '出差',
    '5': '信息发布',
    '6': '文件归档'
  }, taskStatusMap = {
    '0': '未发送',
    '1': '待处理',
    '2': '已完成'
  };
  

  /**
   * 创建任务。
   * @param  {Number} ifSend 0/null->不发送，仅保存草稿；1->发送
   */
  function saveTask(task, ifSend) {
    if (task.id) {
      return updateTask(task, ifSend);
    } else {
      return $http({
        method: 'POST',
        url: '/dispatchTask',
        params: {
          send: ifSend
        },
        data: task
      }).then(function(response) {
        $rootScope.$broadcast('task.add', response.data);
        return response.data;
      });
    }
  }
  /**
   * 更新任务。
   * @param  {Object} task
   * @param  {Number} ifSend 是否发送
   */
  function updateTask(task, ifSend) {
    return $http({
      method: 'PUT',
      url: '/dispatchTask/' + task.id,
      data: task,
      params: {
        send: ifSend
      }
    }).then(function(response) {
      $rootScope.$broadcast('task.update', response.data);
      return response.data;
    });
  }
  /**
   * 根据任务类型id获取任务类型名称
   * @param  {String} typeId 类型id
   */
  function getTypeById(typeId) {
    return taskTypeMap[typeId]? taskTypeMap[typeId] : typeId;
  }
  /**
   * 根据任务状态id获取任务状态名称。
   * @param  {String} statusId 任务状态id
   */
  function getStatusById(statusId) {
    return taskStatusMap[statusId]? taskStatusMap[statusId] : statusId;
  }
  /**
   * 查询任务列表模块的任务列表。
   */
  function queryTaskList(pageNo) {
    return queryList(0, pageNo).then(function(response) {
      return response.data;
    });
  }
  /**
   * 查询任务列表。
   * 消息列表：type = 1;
   * 全部任务：type = 0 || null
   * url:
   * /dispatchTask?type={type}&status={status}&page.pn=:pn&page.size=:size&sort:order.:property=:orderType
   */
  function queryList(type, pageNo, status) {
    var url = '/dispatchTask?sort.sendDate=desc&sort.createDate=desc&page.size=15' + (_.isUndefined(type) ? '' : '&type=' + type) + (_.isUndefined(status) ? '' : '&status=' + status) + (_.isUndefined(pageNo) ? '': '&page.pn=' + pageNo);
    return $http.get(url);
  }
  /**
   * 加载草稿任务列表。
   */
  function queryDraftTaskList(pageNo) {
    return queryList(0, pageNo, 0).then(function(response) {
      return response.data;
    });
  }
  /**
   * 查询消息列表
   * @param  {String} pageNo 页码
   */
  function queryMessageList(pageNo) {
    return $http.get('/dispatchTask/message/list?' + (_.isUndefined(pageNo) ? '': '&page.pn=' + pageNo)).then(function(response) {
      //每一条消息都去调用一下推送方法，可以通过此操作来更新缓存中的任务评论。唯一需要继续添加的是：在任务讨论添加缓存的方法中添加去重处理
      jsUtil.each(response.data.content, function(item) {
        $rootScope.$broadcast('message.websocket', item);
      });
      return response.data;
    });
  }
  
  /**
   * 根据任务id查询任务的详细内容，包括关于任务的讨论信息。
   * @param  {String} taskId 任务id
   */
  function queryTaskDetail(taskId) {
    return $http.get('/dispatchTask/' + taskId).then(function(response) {
      return response.data;
    });
  }
  /**
   * 删除草稿任务。
   * @param {String} taskId 待删除的草稿任务id
   * {"success":1,"msg":"删除成功","data":"null"}
   * {"success":0,"msg":"删除失败","data":"null"}
   */
  function deleteDraftTask(taskId) {
    return $http.delete('/dispatchTask/' + taskId).then(function(response) {
      $rootScope.$broadcast('task.remove', taskId);
      return response.data;
    });
  }
  /**
   * 领导强制关闭任务/下属关闭自己的任务
   * @param  {String} taskId 任务id
   * /dispatchTask/finish/{id}
   */
  function completeTask(taskId) {
    return $http({
      method: 'POST',
      url: '/dispatchTask/finish/' + taskId
    }).then(function(response) {
      $rootScope.$broadcast('task.complete', taskId);
      return response.data;
    });
  }
  /**
   * 任务是否完成
   * @param  {String} taskId 任务id
   */
  function taskFinishOrNot(taskId) {
    return $http.get('/dispatchTask/finish/'+taskId).then(function(response) {
      return response.data;
    });
  }

  return {
    queryTaskList: queryTaskList,
    queryMessageList: queryMessageList,
    queryTaskDetail: queryTaskDetail,
    deleteDraftTask: deleteDraftTask,
    completeTask: completeTask,
    getTypeById: getTypeById,
    getStatusById: getStatusById,
    saveTask: saveTask,
    queryDraftTaskList: queryDraftTaskList,
    taskFinishOrNot: taskFinishOrNot
  };

});