const system = require("../../../system");
const ServiceBase = require("../../sve.base")

/**
 * 订单产品表
 */
class OorderstatusService extends ServiceBase {
  constructor() {
    super("order", ServiceBase.getDaoName(OorderstatusService));

    this.oorderinforegDao = system.getObject("db.order.oorderinforegDao");
    this.oorderdeliverDao = system.getObject("db.order.oorderdeliverDao");
    this.oorderprocessDao = system.getObject("db.order.oorderprocessDao");

    this.osourceDao = system.getObject("db.common.osourceDao");

    this.oproductDao = system.getObject("db.product.oproductDao");
    this.oprocessDao = system.getObject("db.product.oprocessDao");
    this.oproductprocessDao = system.getObject("db.product.oproductprocessDao");
  }

  /***************************************以下是订单处理的分发器***************************************************************** */

  /**
   * 验证订单状态
   * @param params
   * @returns {Promise<{msg: string, data: (*|null), bizmsg: string, status: number}>}
   * @id   订单ID
   * @status 订单下一个状态
   * @other  其他参数
   */
  async handleStatus(params) {
    try {
      let _order = await this.dao.findById(params.id);
      if (!_order) {
        return system.getResult(null, `订单不存在`);
      }
      let _orderStatus = await this.getOrderProcessStatus(_order.id, _order.status);
      let nextList = JSON.parse(_orderStatus.next_status);
      let flag = false;
      let nextNames = [];
      for (var nextItem of nextList) {
        nextNames.push(nextItem.next_name);
        if(nextItem.next_status == params.status) {
          flag = true;
          break;
        }
      }
      if (!flag) {
        nextNames = nextNames.join("或");
        return system.getResult(null, `订单状态错误，下一订单状态应该是${nextNames}`);
      }

      params._order = _order;
      //调用对应的方法 TODO SOMETHING .....

      // 调用func
      return await this[_orderStatus.func](params);
    } catch (error) {
      console.log(error);
      return system.getResult(null, `系统错误 错误信息 ${error}`);
    }

  }


  /**
   * 获取订单状态对象
   * @param order_id
   * @param status
   * @returns {Promise<*|{}>}
   */
  async getOrderProcessStatus(order_id, status) {
    let map = await this.oorderprocessDao.mapByOrderIdsAndStatus([order_id], [status]);
    return map[order_id + "_" + status] || {};
  }

  /*******************************以下是订单处理进度（平台）**************************************************** */


  /**
   * 分配业务员(平台)
   * @param {*} params
   * @id     String  订单ID
   * @bd_id  String  业务员ID
   * @status String 下一个状态码
   * @bd_path String 业务员权限
   * @assign_user_id String 分配人ID
   */
  async platformAassignSalesman(params) {
    if (!params.bd_id) {
      return system.getResult(null, `参数错误 业务员ID不能为空`);
    }
    try {
      //更新订单业务员
      let _order = params._order;
      _order.bd_id = this.trim(params.bd_id);
      _order.status = this.trim(params.status);
      _order.bd_path = this.trim(params.bd_path);
      _order.assign_user_id = this.trim(params.assign_user_id);
      let res = await _order.save();
      return system.getResult(res);
    } catch (error) {
      console.log(error);
      return system.getResult(null, `系统错误 错误信息 ${error}`);
    }
  }


  /**
   * 业务员完善订单信息
   * @param {*} params
   * @id  String 订单ID
   * @status String 下一个状态 
   * @other Object 其他参数 
   */
  async perfectInformation(params){
    //验证参数
    this.verificationPerfectInformation(params);
    let _oorderinforeg=await this.oorderinforegDao.findById(params._order.id);
    if(!_oorderinforeg){
      return system.getResult(null, `订单异常 订单明细不存在，请联系管理员`);
    }

    //更新订单子表
    _oorderinforeg.legal_name= this.trim(params.legal_name);
    _oorderinforeg.id_card= this.trim(params.id_card);
    _oorderinforeg.legal_mobile= this.trim(params.legal_mobile);
    _oorderinforeg.names= this.trim(params.names);
    _oorderinforeg.capital= this.trim(params.capital);
    _oorderinforeg.domicile_id= this.trim(params.domicile_id);
    _oorderinforeg.domicile_name= this.trim(params.domicile_name);
    _oorderinforeg.business_scope_id= this.trim(params.business_scope_id);
    _oorderinforeg.business_type= this.trim(params.business_type);
    _oorderinforeg.business_scope= this.trim(params.business_scope);
    _oorderinforeg.idcard_front= this.trim(params.idcard_front);
    _oorderinforeg.idcard_back= this.trim(params.idcard_back);
    _oorderinforeg.other_file= this.trim(params.other_file);
    _oorderinforeg.guest_mail_addr= this.trim(params.guest_mail_addr);
    _oorderinforeg.guest_mail_to= this.trim(params.guest_mail_to);
    _oorderinforeg.guest_mail_mobile= this.trim(params.guest_mail_mobile);
    //更新主表
    params._order.service_items= this.trim(params.service_items);
    params._order.service_remark= this.trim(params.service_remark);
    params._order.status= this.trim(params.status);

    try {
      //开启事务
      await this.db.transaction(async t=>{
        await _oorderinforeg.save();
        await params._order.save();
      });
      return system.getResultSuccess();
    } catch (error) {
      console.log(error);
      return system.getResult(null, `系统错误 错误信息 ${error}`);
    }
  }

  verificationPerfectInformation(params){
    if(!params.legal_name){
      return system.getResult(null,`参数错误 法人姓名不能为空`);
    }
    if(!params.id_card){
      return system.getResult(null,`参数错误 法人身份证不能为空`);
    }
    if(!params.legal_mobile){
      return system.getResult(null,`参数错误 法人电话不能为空`);
    }
    if(!params.names){
      return system.getResult(null,`参数错误 个体户名称不能为空`);
    }
    if(!params.capital){
      return system.getResult(null,`参数错误 注册资本不能为空`);
    }
    if(!params.domicile_id){
      return system.getResult(null,`参数错误 注册地id不能为空`);
    }
    if(!params.domicile_name){
      return system.getResult(null,`参数错误 注册地名称不能为空`);
    }
    if(!params.business_scope_id){
      return system.getResult(null,`参数错误 经营范围id不能为空`);
    }
    if(!params.business_type){
      return system.getResult(null,`参数错误 经营范围不能为空`);
    }
    if(!params.business_scope){
      return system.getResult(null,`参数错误 经营范围详情不能为空`);
    }
    if(!params.idcard_front){
      return system.getResult(null,`参数错误 身份证正面照片不能为空`);
    }
    if(!params.idcard_back){
      return system.getResult(null,`参数错误 身份证反面照片不能为空`);
    }
    if(!params.other_file){
      return system.getResult(null,`参数错误 其他文件不能为空`);
    }
    if(!params.guest_mail_addr){
      return system.getResult(null,`参数错误 邮寄客户地址不能为空`);
    }
    if(!params.guest_mail_to){
      return system.getResult(null,`参数错误 客户收件人不能为空`);
    }
    if(!params.guest_mail_mobile){
      return system.getResult(null,`参数错误 客户收件人电话不能为空`);
    }

    // if(!params.guest_mail_no){
    //   return system.getResult(null,`参数错误 客户快递单号不能为空`);
    // }
    // if(!params.guest_mail_img){
    //   return system.getResult(null,`参数错误 交付商交付快递单号图片不能为空`);
    // }
    // if(!params.guest_accpet_file){
    //   return system.getResult(null,`参数错误 客户验收文件不能为空`);
    // }

    if(!params.service_items){
      return system.getResult(null,`参数错误 服务项不能为空`);
    }

  }

  /**
   * 分配交付商
   * @param {*} params
   * @id  String 订单ID
   * @deliver_id String 交付商ID
   * @deliver_name String 交付商名称
   * @deliver_deliver String 交付商分成
   * @status String 下一个状态码 
   */
  async assignDeliver(params) {
    //参数验证
    if (!params.id) {
      return system.getResult(null, `参数错误 订单ID不能为空`);
    }
    if (!params.deliver_id) {
      return system.getResult(null, `参数错误 交付商ID不能为空`);
    }
    if (!params.hasOwnProperty(`deliver_divide`)) {
      return system.getResult(null, `参数错误 交付商分成不能为空`);
    }

    try {
      let self = this;
      await this.db.transaction(async t => {
        //创建orderdeliver记录
        await self.oorderdeliverDao.create({
          order_id: self.trim(params.id),
          deliver_id: self.trim(params.deliver_id),
          deliver_name: self.trim(params.deliver_name),
          deliver_divide: self.trim(params.deliver_divide),
        }, t);

        //更新oorder订单记录
        await self.dao.update({
          deliver_id: self.trim(params.deliver_id),
          id: self.trim(params.id),
          status: self.trim(params.status)
        }, t);
      });
      return system.getResultSuccess();
    } catch (error) {
      console.log(error);
      return system.getResult(null, `系统错误 错误信息 ${error}`);
    }
  }


  /**********************************以下是交付商订单业务处理******************************************************** */

  /**
   * 分配业务员(交付商)
   * @param {*} params
   * @id     String  订单ID
   * @operator_id  String  业务员ID
   * @status String 下一个状态码
   */
  async deliverAssignSalesman(params) {
    if (!params.operator_id) {
      return system.getResult(null, `参数错误 业务员ID不能为空`);
    }
    try {
      let _oorderdeliver = await this.oorderdeliverDao.model.findOne({where:{
        order_id:this.trim(params._order.id)
      }});
      if(!_oorderdeliver){
        return system.getResult(null,`参数错误 订单交付信息不存在`);
      }
      await this.db.transaction(async t =>{
        //更新订单交付表业务员ID
        _oorderdeliver.operator_id = this.trim(params.operator_id);
        //更新订单状态
        let _order = params._order;
        _order.status = this.trim(params.status);
        
        await _oorderdeliver.save();
        await _order.save();

      });
      return system.getResultSuccess();
    } catch (error) {
      console.log(error);
      return system.getResult(null, `系统错误 错误信息 ${error}`);
    }
  }






}

module.exports = OorderstatusService;