
import { isNotEmpty } from "@/utils"
import { toFixed, toRMB, toFixedForce } from "@/utils/number"
import { slFloat, jeFloat, djFloat } from "@/apps/app-demo/invoice-manage/constant"
/**
 * 普通征税金额计算
 * 
 * 金额不能为空或等于0, 单价和数量可以都为空；当单价和数量有一者为空，单价通过金额/数量获得，数量=金额/单价；当三者都不为空，编辑单价/数量时，金额=编辑后的单价*数量，编辑金额不为0时，数量不变，单价=编辑后的金额/数量。
 * 三者某一项为空，其他项不变
 *  */ 
export function calcPutongPrice(option) {
  let { type, value, index, hsbz, spsl, dj, je, sl, se, tmpJe, tmpHsje, tmpDj, tmpHsdj, updateGoodsForm } = option
  if (type == "spsl") {
      // 数量改变
      spsl = value
      if (spsl == "") {

      } else if (dj && spsl != 0) {
        je = dj * spsl
      } else if (je && spsl != 0) {
        dj = je / spsl
      }
    } else if (type == "dj") {
      // 单价改变 
      dj = value
      if (dj == "") {

      } else if (spsl) {
        je = spsl * dj
      } else if (je && dj != 0) {
        spsl = je / dj
      }
    } else if (type == "je") {
      // 总价改变
      je = value
      if (je == "") {

      } else if (je == 0) {
        dj = ""
        updateGoodsForm && setTimeout(() => {
          // 避免多次输入0时，je一直是""，会引起输入框内容不变
          spsl = toFixed(spsl, slFloat)
          dj = toFixed(dj, djFloat)
          je = ""
          se = ""
          tmpJe = ""
          tmpHsje = ""
          updateGoodsForm({ spsl, dj, je, se, tmpJe, tmpHsje }, index);
        }, 0)
      } else if (spsl && spsl != 0) {
        dj = je / spsl
      } else if (dj && dj != 0) {
        spsl = je / dj
      } 
    }
    // 计算不含税金额、含税金额、不含税单价、含税单价
    if (hsbz) {
      tmpJe = isNotEmpty(je) ? je / (1 + Number(sl)) : ''
      tmpHsje = je
      // 不含税单价
      tmpDj = isNotEmpty(dj) ? dj / (1 + Number(sl)) : ''
      // 含税单价
      tmpHsdj = dj
      // 税额=不含税金额*税率
      // 含税情况下，税额根据界面显示的金额来换算，避免一些四舍五入的临界值导致误差大于或等于0.01
      se = tmpJe * sl
    } else {
      tmpJe = je
      tmpHsje = isNotEmpty(je) ? je * (1 + Number(sl)) : ''
      // 不含税单价
      tmpDj = dj 
      // 含税单价
      tmpHsdj = isNotEmpty(dj) ? dj * (1 + Number(sl)) : ''
      // 税额=不含税金额*税率
      // 不含税情况下，税额根据界面显示的金额来换算，避免一些四舍五入的临界值导致误差大于或等于0.01
      se = toFixedForce(tmpJe, jeFloat) * sl
    }

    // 取小数位并四舍五入
    spsl = toFixed(spsl, slFloat)
    je = toFixedForce(je, jeFloat)
    dj = toFixed(dj, djFloat)
    se = toFixedForce(se, jeFloat)
    tmpJe = toFixedForce(tmpJe, jeFloat)
    tmpHsje = toFixedForce(tmpHsje, jeFloat)
    tmpDj = toFixed(tmpDj, djFloat)
    tmpHsdj = toFixed(tmpHsdj, djFloat)
    return { spsl, dj, je, se, tmpJe, tmpHsje, tmpDj, tmpHsdj }
}

/**
 * 减按征税金额计算
 * 
 * 金额不能为空或等于0, 单价和数量可以都为空；当单价和数量有一者为空，单价通过金额/数量获得，数量=金额/单价；当三者都不为空，编辑单价/数量时，金额=编辑后的单价*数量，编辑金额不为0时，数量不变，单价=编辑后的金额/数量。
 * 三者某一项为空，其他项不变
 *  */ 
export function calcJiananPrice(option) {
  let { type, index, value, spsl, dj, je, sl, se, tmpJe, tmpDj, updateGoodsForm } = option
  if (type == "spsl") {
    // 数量改变
    spsl = value
    if (spsl == "") {

    } else if (dj && spsl != 0) {
      je = dj * spsl
    } else if (je && spsl != 0) {
      dj = je / spsl
    }
  } else if (type == "dj") {
    // 单价改变 
    dj = value
    if (dj == "") {

    } else if (spsl) {
      je = spsl * dj
    } else if (je && dj != 0) {
      spsl = je / dj
    }
  } else if (type == "je") {
    // 总价改变
    je = value
    if (je == "") {

    } else if (je == 0 || je == "") {
      dj = ""
      updateGoodsForm && setTimeout(() => {
        // 避免多次输入0时，je一直是""，会引起输入框内容不变
        spsl = toFixed(spsl, slFloat)
        dj = toFixed(dj, djFloat)
        je = ""
        se = ""
        tmpJe = ""
        updateGoodsForm({ spsl, dj, je, se, tmpJe }, index);
      }, 0)
    } else if (spsl && spsl != 0) {
      dj = je / spsl
    } else if (dj && dj != 0) {
      spsl = je / dj
    } 
  }

  se = ""
  tmpJe = ""
  tmpDj = ""
  if (je > 0) {
    // 税额=含税金额*0.015/(1+5%)
    // 税额根据界面显示的金额来换算，避免一些四舍五入的临界值导致误差大于或等于0.01
    se = toFixedForce(je, jeFloat) * sl / 1.05
    // 不含税金额=含税金额-税额 （减按征收的不含税金额都按含税金额算，提交时也是提交含税金额）
    tmpJe = je - se
    se = toFixedForce(se, jeFloat)
    tmpJe = toFixedForce(tmpJe, jeFloat)
  }
  if (dj > 0) {
    // 不含税单价 （减按征收的不含税金额都按含税金额算，提交时也是提交含税金额）
    tmpDj = toFixedForce(tmpJe, jeFloat) / spsl 
    tmpDj = toFixed(tmpDj, djFloat)
  }

  // 取小数位并四舍五入
  spsl = toFixed(spsl, slFloat)
  je = toFixedForce(je, jeFloat)
  dj = toFixed(dj, djFloat)
  return { spsl, dj, je, se, tmpJe, tmpDj }
}

 /**
 * 差额征税 金额计算
 * 
 * 先算税额，若（含税销售额-扣除额）>0,税额=（含税销售额-扣除额）*（税率或征收率）/（1+税率或征收率），若（含税销售额-扣除额）<=0，则税额=0，再算金额=含税销售额-税额，如果数量不为空，则不含税单价=金额/数量,若数量为空，则不含税单价也为空。
 * 三者某一项为空，其他项不变
 *  */
export function calcChaePrice(option) {
  let { type, value, spsl, dj, je, se, tmpJe, tmpDj } = option
  if (type == "spsl") {
    // 数量改变
    spsl = value
    if (spsl == "") {

    } else if (je && spsl != 0) {
      dj = je / spsl
    }
  } else if (type == "dj") {
    // 单价改变 
    dj = value
    if (dj == "") {

    } else if (je && dj != 0) {
      spsl = je / dj
    }
  }

  // 取小数位并四舍五入
  spsl = toFixed(spsl, slFloat)
  dj = toFixed(dj, djFloat)

  tmpDj = dj

  return { spsl, dj, je, se, tmpJe, tmpDj }
}