const system = require("../../../system");
const ServiceBase = require("../../sve.base")
const settings = require("../../../../config/settings")
class OrgService extends ServiceBase {
  constructor() {
    super("org", ServiceBase.getDaoName(OrgService));
  }
  /**
   *  添加 
   * @param {*} params 
   */
  async apiAddOrg(params) {
    try {
      return await this.addOrg(params);
    } catch (error) {
      return system.getResult(null, `系统错误 错误信息 ${error}`);
    }
  }

  /**
   * Org  更新
   * @param {*} params 
   */
  async apiUpdOrg(params) {
    try {
      return await this.updOrg(params);
    } catch (error) {
      return system.getResult(null, `系统错误 错误信息 ${error}`);
    }
  }

  /**
   * Org 删除 
   * @param {*} params 
   */
  async apiDelOrg(params) {
    try {
      return await this.delOrg(params);
    } catch (error) {
      return system.getResult(null, `系统错误 错误信息 ${error}`);
    }
  }
  /**
   * Org  查询列表 
   * @param {*} params 
   */
  async apiListOrg(params) {
    try {
      return await this.listOrg(params);
    } catch (error) {
      return system.getResult(null, `系统错误 错误信息 ${error}`);
    }
  }

  /**
   * 根据ID查询该组织机构下的所有用户
   */
  async apiFindUserByOrgId(params){
    try {
      return this.findUserByOrgId(params.id);
    } catch (error) {
      return system.getResult(null, `系统错误 错误信息 ${error}`);
    }
  }

  /**
   * 根据ID查明细
   * @param {*} params 
   */
  async apiFindById(params){
    try {
      return await this.queryById(params)
    } catch (error) {
      return system.getResult(-1,`系统错误 错误信息 ${error}`);
    }
  }

  /**
   * 根据Ip查明细
   * @param {*} params 
   */
  async apiByPid(params){
    try {
      return await this.byPid(params)
    } catch (error) {
      return system.getResult(-1,`系统错误 错误信息 ${error}`);
    }
  }

  /**
   * 根据ID查明细
   * @param {*} params 
   */
  async apiTree(params){
    try {
      return await this.tree(params)
    } catch (error) {
      return system.getResult(-1,`系统错误 错误信息 ${error}`);
    }
  }

  /********************************************************************** */


  /**
   * 添加
   * @param {T} params 
   */
  async addOrg(params) {
    try {
      var pid = Number(params.pid || 0);
      params.orgname = this.trim(params.orgname);
      if(!params.orgname){return system.getResult(-1,`参数错误 组织名称不能为空`)}
      let _orgByName = await this.findOne({orgname:params.orgname});
      if(_orgByName){
        return system.getResult(-1,`参数错误 组织名称已经存在`);
      }
      let path = "";
      if(pid===0){
        path = `/${params.orgname}`;
      }else{
        let _org = await this.findOne({id:pid});
        if(!_org){
          return system.getResult(-1,`参数错误 父节点不存在`);
        }
        path =`${_org.path}/${params.orgname}`;
      }
      params.path=path;
      let res = await this.dao.create(params);
      return system.getResult(res);
    } catch (error) {
      return system.getResult(-1,`系统错误 错误信息 ${error}`);
    }
  }

  /**
   * 更新
   * @param {T} params 
   */
  async updOrg(params) {
    // if (!params.id) {
    //   return system.getResult(-1, `参数错误 ID不能为空`);
    // }
    // let _org = await this.findById(params.id);
    // if (!_org) {
    //   return system.getResult(-1, `信息不存在 请核对 ID`);
    // }
    // try {
    //   let res = await _org.save();
    //   console.log(`saas 更新成功 ： ${JSON.stringify(res)}`);
    //   return system.getResult(res);
    // } catch (error) {
    //   return system.getResult(-1, `系统错误 错误信息 ${error}`);
    // }
    return system.getResult(`此方法不对外提供服务`);
  }
  /**
   * 删除
   * @param {T} params 
   */
  async delOrg(params) {
    try {
      //检查是否存在此组织机构
      let _org = await this.findById(params.id);
      if (!_org) {
        return system.getResult(-1, `信息不存在 请核对 ID`);
      }
      //检查组织机构下是否有用户
      let _usersRes = await this.findUserByOrgId(params.id);
      if(_usersRes.status===-1){
        return _usersRes;
      }
      if(_usersRes.data.length!=0){
        return system.getResult(-1,`该组织机构不能删除`);
      }  
      //检查父节点 下是否有子节点
      let _orgChildren = await this.dao.model.findAll({
        where:{
          pid:this.trim(params.id)
        }
      });
      if(_orgChildren.length!=0){
        return system.getResult(-1,`该组织机构不能删除`);
      }
      //删除
      let res = await _org.destroy();
      return system.getResult(res);
    } catch (error) {
      return system.getResult(-1, `系统错误 错误信息 ${error}`);
    }
  }

  /**
   * 查询列表
   * @param {T} params 
   */
  async listOrg(params) {
    let where = {};
    let pageIndex = params.pageIndex || 1;
    let pageSize = params.pageSize || 10;
    if (params.orgname) {
      where.orgname = this.trim(params.orgname);
    }
    if (params.path) {
      where.path = this.trim(params.path);
    }
    if (params.pid) {
      where.pid = this.trim(params.pid);
    }
    if (params.saas_id) {
      where.saas_id = Number(params.saas_id);
    }
    if (params.hasOwnProperty("is_leaf")) {
      where.is_leaf = Number(params.is_leaf);
    }
    try {
      let orgList = await this.getPageList(pageIndex, pageSize, where);
      return system.getResult(orgList);
    } catch (error) {
      return system.getResult(-1, `系统错误 错误信息 ${error}`);
    }
  }

  /**
   * 根据ID查询该组织机构下的所有用户
   */
  async findUserByOrgId(id){
    if(!Number(id)){
      return system.getResult(-1,`参数错误 组织机构不能为空`);
    }
    try {
      let res =  await this.dao.findUserByOrgId(id);
      return system.getResult(res);
    } catch (error) {
      return system.getResult(-1,`系统错误 错误信息 ${error}`);
    }
  }
  
  async byPid(obj) {
    var list = await this.dao.findAll({
      pid: obj.pid || 0,
    });
    return list;
  }

  async tree() {
    var all = await this.dao.all();
    var pmap = {};
    for (var item of all) {
      var list = pmap[item.pid];
      if (!list) {
        list = [];
      }
      list.push(item);
      pmap[item.pid] = list;
      if (item.pid === 0) {
        tree = item;
      }
      console.log(item.pid);
    }

    for(var item of all) {
      item.childs = pmap[item.id] || [];
    }

    return pmap[0];
  }
}
module.exports = OrgService;