/**
 * 1 算法文件命名规则 ： calInvoice + 销售方编码
 * 2 如果算法中途出现异常 则需直接return 
 * 3 如果算法顺利执行 返回参数中除包含必须的四个税值外，还需要包含一个累计不含税价字段 字段名称为 "x1" 
 * 4 此文件必须提供 calcInvoice 和 formatParams 方法
 */

const system = require("../../../../system");
const applySve = system.getObject("service.invoice.applySve");
const Decimal = require('decimal.js');
const VAL_TAX = 2; //增值税
const PER_TAX = 1; //个税
/**
 * 增值税 businessmen10(个体工商户) 算法实现
 * 注意：1 由于销售方类型不同 所以算法不同 需要对参数验证单独处理
 */
module.exports.calcInvoice = async (params) => {
  try {
    //校验参数
    verificationParams(params);
    
    //计算累计不含税价
    /** 
     * 累计不含税价
     * @param {*} businessmenId  商户id 
     * @param {*} businessmenType  商户类型 
     * @param {*} businessmenCreditCode  统一社会信用代码 
     * @param {*} taxIncPriRat 不含税价百分比
     * @param {*} invoiceAmount 发票总额
     * @param {*} type          计算类型 1：个税 2：增值税
     * @param {*} valCalWay     增值税计算类型 1：月 2：季度 3:年
     * @param {*} perCalWay     个人所的税计算类型 1：月 2：季度 3:年
     * @param {*} invoiceTime   格式 YYYY-MM-DD hh:mm:ss
    */
    let x3 = await applySve.calAccumulatedPriceExcludingTax(params.businessmenId,params.businessmenType, params.businessmenCreditCode, 
      params.taxIncPriRat, params.invoiceAmount, VAL_TAX, params.valCalWay, null, params.invoiceTime);
    console.log("增值税 累计不含税价总额：" + x3);
    //根据 cumulativeProfitOfvalTax 查找对应梯度的个税税率
    let calRateRangeResForVal = calRateRange(x3, params.valAddTaxRange, VAL_TAX);

    let {valAddTaxRat} = calRateRangeResForVal;
    //计算年累计的增值税
    let cumulativeProfitOfvalTax = await applySve.calCumulativeProfit(params.businessmenId,params.businessmenType, VAL_TAX, params.valCalWay);
    //计算增值税
    let valueAddedTax = calValTax(x3, valAddTaxRat, cumulativeProfitOfvalTax);
    return system.getResult(valueAddedTax);
  } catch (error) {
    return system.getResult(-1,`系统错误 错误信息 ${error}`);
  }
}

/**
 * 计算税率值
 * @param {*} amount    金额
 * @param {*} taxRange  税率范围
 * @param {*} type      类型  1：个税  2 增值税
 */
let calRateRange = (amount, taxRange, type) => {
  let res = {};
  if (type === PER_TAX) {
    for (let item of taxRange) {
      if (item.minValue <= amount && amount <= item.maxValue) {
        res.taxPer = item.rate;
        res.quiCalDed = item.quiCalDed;
        break;
      }
    }
  } else {
    for (let item of taxRange) {
      if (item.minValue <= amount && amount <= item.maxValue) {
        res.valAddTaxRat = item.zengzhiRate;
        res.addTaxRat = item.fujiaRate;
        break;
      }
    }
  }
  return res;
}


/**
 * 计算增值税
 * @param {*} x3                          //累计不含说价
 * @param {*} valAddTaxRat                //增值税率
 * @param {*} cumulativeProfitOfvalTax    //累计缴纳的增值税
 */
let calValTax=(x3, valAddTaxRat, cumulativeProfitOfvalTax)=>{
  if (valAddTaxRat == 0) {
    return 0;
  }
  let res = new Decimal(x3).mul(valAddTaxRat).div(100).sub(cumulativeProfitOfvalTax).toFixed(2);
  return res;
}


/**
 * 校验各种费率 的合法性
 * @param {*} params 
 * params
 */
let verificationParams = (params) => {
  if(params.businessmenType != "10"){
    system.getResult(-1,`参数错误 销售方类型非法`);
  }
  if(!params.businessmenCreditCode){
    system.getResult(-1,`参数错误 销售方统一社会信用代码非法`);
  }
  if(params.taxIncPriRat>1){
    system.getResult(-1,`参数错误 不含税价百分比不能大于1 例如 3% ，请传 0.03`);
  }
  if(!params.invoiceAmount){
    system.getResult(-1,`参数错误 发票金额非法`);
  }
}