package com.sckw.transport.model.vo;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.sckw.core.model.constant.Global;
import com.sckw.core.model.enums.TaxRateTypeEnum;
import com.sckw.core.utils.StringUtils;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Date;

/**
 * @author zk
 * @desc 车辆运单-司机端任务列表
 * @date 2023/8/1 0001
 */
@Data
public class WaybillOrderDriverVo {

    /**
     * 主键
     */
    @JsonProperty("wOrderId")
    private Long wOrderId;

    /**
     * 编号
     */
    @JsonProperty("wOrderNo")
    private String wOrderNo;

    /**
     * 主键
     */
    @JsonProperty("lOrderId")
    private Long lOrderId;

    /**
     * 物流订单编号
     */
    @JsonProperty("lOrderNo")
    private String lOrderNo;

    /**
     * 循环/趟次
     */
    private Integer type;

    /**
     * 循环/趟次
     */
    private String typeName;

    /**
     * 承运企业主键ID
     */
    private Long carrierEntId;

    /**
     * 承运企业名称
     */
    private String carrierFirmName;

    /**
     * 商品名称
     */
    private String goodsName;

    /**
     * 计划结束时间
     */
    @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date endTime;

    /**
     * 计划开始时间
     */
    @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date startTime;

    /**
     * 已委托量
     */
    private BigDecimal entrustAmount;


    /**
     * 实际剩余量
     */
    private BigDecimal residueAmount;

    /**
     * 单位（吨、方、箱、件）
     */
    private String unit;

    /**
     * 单位（吨、方、箱、件）
     */
    private String unitName;

    /**
     * 装货地址名称
     */
    private String loadName;

    /**
     * 装货所在地区
     */
    private Integer loadCityCode;

    /**
     * 装货所属区域名称
     */
    private String loadCityName;

    /**
     * 装货详细地址
     */
    private String loadDetailAddress;

    /**
     * 卸货地址名称
     */
    private String unloadName;

    /**
     * 卸货所在地区
     */
    private Integer unloadCityCode;

    /**
     * 卸货所属区域名称
     */
    private String unloadCityName;

    /**
     * 卸货详细地址
     */
    private String unloadDetailAddress;

    /**
     * 装货重量
     */
    private BigDecimal loadAmount;

    /**
     * 卸货重量
     */
    private BigDecimal unloadAmount;

    /**
     * 亏吨重量
     */
    private BigDecimal deficitAmount;

    /**
     * 亏吨扣款（自己承运总亏吨扣款）
     */
    private BigDecimal deficitPrice;

    /**
     * 扣亏量（自己承运总亏吨扣款）
     */
    private BigDecimal deficitLossAmount;

    /**
     * 合理损耗
     */
    private BigDecimal loss;

    /**
     * 合理损耗单位(‰/kG)
     */
    private String lossUnit;

    /**
     * 车牌号
     */
    private String truckNo;

    /**
     * 单据状态
     */
    private Integer status;

    /**
     * 创建人姓名
     */
    private String createByName;

    /**
     * 派车时间-创建时间
     */
    @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;

    /**
     * 操作时间
     */
    @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date operateTime;

    public String getTypeName() {
        return type != null && type == Global.NUMERICAL_ONE ? "趟次" : "循环";
    }

    public BigDecimal getDeficitLossAmount() {
        return deficitLossAmount(loadAmount, deficitAmount, loss, lossUnit);
    }

    /**
     * @param loadAmount    装货量
     * @param deficitAmount 亏吨量
     * @param loss          合理损耗
     * @desc 计算扣亏量
     * @author zk
     * @date 2023/7/27
     **/
    public BigDecimal deficitLossAmount(BigDecimal loadAmount, BigDecimal deficitAmount, BigDecimal loss,String lossUnit) {
        //亏吨<=0
        if (deficitAmount.compareTo(new BigDecimal(Global.AMOUNT)) <= 0) {
            return new BigDecimal(Global.AMOUNT);
        }
        //承运订单亏吨扣款=（承运订单亏吨量 -（承运订单装货量 * 承运订单合理损耗））* 扣亏货值
        loss = loss == null ? new BigDecimal(Global.AMOUNT) : loss;
        if (loss.doubleValue() > 0 && StringUtils.isNotBlank(lossUnit)) {
            if (lossUnit.equals(String.valueOf(TaxRateTypeEnum.PERCENT.getCode()))) {
                loss = loss.divide(new BigDecimal(TaxRateTypeEnum.PERCENT.getValue()));
            }
            if (lossUnit.equals(String.valueOf(TaxRateTypeEnum.MILLIMETER.getCode()))) {
                loss = loss.divide(new BigDecimal(TaxRateTypeEnum.MILLIMETER.getValue()));
            }
        }
        //扣亏量=亏吨量【合理损耗占比为空或为0】
        if (loss.doubleValue() == Global.NUMERICAL_ZERO) {
            return deficitAmount;
        }
        //扣亏量=亏吨量-合理损耗值【要求大于0，如果小于0则扣亏货量取0】
        BigDecimal deficitLossAmount = deficitAmount.subtract(loadAmount.multiply(loss).setScale(2, RoundingMode.HALF_UP));
        if (deficitLossAmount.doubleValue() <= 0) {
            return new BigDecimal(Global.AMOUNT);
        }
        return deficitLossAmount;
    }
}
