package com.sckw.transport.model.param;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.sckw.transport.model.dto.AddressInfoDto;
import com.sckw.transport.model.dto.LineFreightDto;
import jakarta.validation.constraints.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;

import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;

/**
 * @author lfdc
 * @description 物流订单自建订单v4.2
 * @date 2024-03-05 09:03:01
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class AddLogisticsOrderParam implements Serializable {

    /**
     * 订单类型 托运订单：1/承运订单新建：2
     */
    private String type;
    /**
     * 托运单位
     */
    @NotBlank(message = "托运单位名称不能为空")
    private String consignCompany;
    /**
     * 托运单位id
     */
    @NotBlank(message = "托运单位id不能为空")
    private String consignCompanyId;

    /**
     * 托运联系电话
     */
    @NotBlank(message = "托运联系电话不能为空")
    private String consignContactPhone;

    /**
     * 托运联系人
     */
    @NotBlank(message = "托运联系人不能为空")
    private String consignContacts;

    /**
     * 托运联系人id
     */
    @NotBlank(message = "托运联系人id不能为空")
    private String consignContactsId;

    /**
     * 承运单位
     */
    @NotBlank(message = "承运单位不能为空")
    private String acceptCompany;

    /**
     * 承运单位ID
     */
    @NotBlank(message = "承运单位ID不能为空")
    private String acceptCompanyId;

    /**
     * 承运联系电话
     */
    @NotBlank(message = "承运联系电话不能为空")
    private String acceptContactPhone;


    /**
     * 承运联系人
     */
    @NotBlank(message = "承运联系人id不能为空")
    private String acceptContacts;

    /**
     * 承运联系人id
     */
    @NotBlank(message = "承运联系人id不能为空")
    private String acceptContactsId;


    /**
     * goodsId
     */
//    @NotNull(message = "goodsId不能为空")
    private Long goodsId;

    /**
     * skuId
     */
//    @NotNull(message = "goodsId不能为空")
    private Long skuId;

    /**
     * 货物名称
     */
    @NotNull(message = "货物名称不能为空")
    private String goodsName;

    /**
     * 货物类型
     */
    @NotBlank(message = "货物类型不能为空")
    private String goodsType;

    /**
     * 计费方式
     */
    @NotNull(message = "计费方式不能为空")
    private String billingMode;

    /**
     * 计费方式类型
     */
    @NotNull(message = "计费方式类型不能为空")
    private String billingModeType;

    /**
     * 运价
     */
//    @NotNull(message = "运价不能为空")
//    @Digits(integer = 10, fraction = 2, message = "装货量格式错误")
//    @DecimalMin(value = "0.00", message = "运价最小为{value}")
    private BigDecimal price;

    /**
     * 运价方式
     */
    @NotNull(message = "运价方式不能为空")
    @Min(value = 0, message = "必须大于等于{value}")
    @Max(value = 10, message = "必须小于等于{value}")
    private Long priceType;

    /**
     * 税率
     */
//    @NotNull(message = "税率不能为空")
//    @Digits(integer = 10,fraction = 2,message = "税率格式错误")
//    @DecimalMin(value = "0.00",message = "税率最小为{value}")
    private BigDecimal taxRate;

    /**
     * 税率单位
     */
    @NotBlank(message = "税率单位不能为空")
    private String taxRateUnit;

    /**
     * 总量
     */
    @NotNull(message = "总量不能为空")
    @Digits(integer = 10, fraction = 2, message = "总量格式错误")
    @DecimalMin(value = "0.00", message = "总量最小值为{value}")
    private BigDecimal amount;

    /**
     * 总量单位
     */
    @NotBlank(message = "总量单位不能为空")
    private String amountUnit;

    /**
     * 合理损耗
     */
    @Digits(integer = 5, fraction = 2, message = "合理损耗格式错误")
    @DecimalMin(value = "0.00", message = "合理损耗最小值为{value}")
    private BigDecimal loss;

    /**
     * 合理损耗单位
     */
    @NotBlank(message = "合理损耗单位不能为空")
    private String lossUnit;

    /**
     * 商品价值（扣亏货值）
     */
    @Digits(integer = 5, fraction = 2, message = "扣亏货值格式错误")
    @DecimalMin(value = "0.00", message = "扣亏货值最小值为{value}")
    private BigDecimal goodsPrice;
    /**
     * 商品价值（扣亏货值）单位
     */
    @NotBlank(message = "扣亏货值不能为空")
    private String goodsPriceUnit;

    /**
     * 计划卸货时间
     */
    @NotNull(message = "计划卸货时间不能为空")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate endTime;

    /**
     * 计划发货时间
     */
    @NotNull(message = "计划发货时间不能为空")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate startTime;

    /**
     * 结算周期(周结、月结、季结)
     */
    @Min(value = 0, message = "必须大于等于{value}")
    @Max(value = 5, message = "必须小于等于{value}")
    private Long settlementCycle;

    /**
     * 合同id
     */
    @NotNull(message = "合同id不能为空")
    private String contractId;

    /**
     * 合同编号
     */
    @NotBlank(message = "合同编号不能为空")
    private String contractNo;

    /**
     * 合同名称
     */
    @NotBlank(message = "合同名称不能为空")
    private String contractName;

    /**
     * 支付方式
     */
    @NotNull(message = "支付方式不能为空")
    @Min(value = 0, message = "支付方式必须大于等于{value}")
//    @Max(value = 4, message = "支付方式必须小于等于{value}")
    private Long payment;


    /**
     * 签约方式
     */
    @NotNull(message = "签约方式不能为空")
    @Min(value = 0, message = "签约方式必须大于等于{value}")
    @Max(value = 10, message = "签约方式必须小于等于{value}")
    private String signingWay;

    /**
     * 备注
     */
    @Length(max = 200, message = "单据编号长度错误最大长度:{max}")
    private String remark;

//    /**
//     * 合同信息
//     */
//    @NotNull(message = "合同信息不能为空")
//    private List<ContractDto> contractInfo;

    /**
     * 地址信息
     */
    @NotNull(message = "地址信息不能为空")
    @JsonProperty("addressInfo")
    private List<AddressInfoDto> addressInfo;

//    /**
//     * 辅助单位
//     */
//    @JsonProperty("assistUnit")
//    private List<GoodsUnitParam> assistUnit;

    /**
     * 线路分配
     */
    @JsonProperty("lineFreightList")
    private List<LineFreightDto> lineFreightList;
}
