package com.slodon.b2b2c.core.express;

import com.slodon.b2b2c.core.constant.ExpressConst;
import com.slodon.b2b2c.core.util.StringUtil;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.math.BigDecimal;

/**
 * 封装快递100参数
 *
 * @author wuxy
 * @date 2022.06.15 16:23
 */
@Data
public class ExpressInfo {

    @ApiModelProperty(value = "打印类型，NON：只下单不打印（默认）；IMAGE:生成图片短链；HTML:生成html短链； CLOUD:使用快递100云打印机打印，使用CLOUD时siid必填", required = true)
    private String printType;
    @ApiModelProperty(value = "电子面单客户账户或月结账号", required = true)
    private String partnerId;
    @ApiModelProperty("电子面单密码")
    private String partnerKey;
    @ApiModelProperty("电子面单密钥")
    private String partnerSecret;
    @ApiModelProperty("电子面单客户账户名称")
    private String partnerName;
    @ApiModelProperty("收件网点名称,若使用淘宝授权填入（taobao），使用菜鸟授权填入（cainiao), 使用京东授权填入（jdalpha),使用拼多多授权填入(pinduoduoWx)")
    private String net;
    @ApiModelProperty("电子面单承载编号")
    private String code;
    @ApiModelProperty("电子面单承载快递员名")
    private String checkMan;
    @ApiModelProperty("在使用菜鸟/淘宝/拼多多授权电子面单时，若月结账号下存在多个网点，则tbNet=\"网点名称,网点编号\" ，注意此处为英文逗号")
    private String tbNet;
    @ApiModelProperty(value = "快递公司的编码，一律用小写字母", required = true)
    private String kuaidicom;
    @ApiModelProperty(value = "物品名称,例：文件", required = true)
    private String cargo;
    @ApiModelProperty(value = "包裹总数量", required = true)
    private Integer count;
    @ApiModelProperty("物品总重量KG，例：1.5，单位kg。极兔速递必填，其他快递公司非必填")
    private BigDecimal weight;
    @ApiModelProperty("支付方式： SHIPPER：寄方付（默认） CONSIGNEE：到付 MONTHLY：月结 THIRDPARTY：第三方支付")
    private String payType;
    @ApiModelProperty("产品类型： 如标准快递（默认） 顺丰标快（陆运） EMS经济")
    private String expType;
    @ApiModelProperty("备注")
    private String remark;
    @ApiModelProperty("打印设备，通过打印机输出的设备码进行获取，printType为CLOUD时必填")
    private String siid;
    @ApiModelProperty("打印方向， 0：正方向（默认）； 1：反方向；只有printType为CLOUD时该参数生效")
    private String direction;
    @ApiModelProperty(value = "主单模板，通过管理后台的快递公司模板V2信息获取", required = true)
    private String tempId;
    @ApiModelProperty("子单模板，部分快递公司需指定。通过管理后台的快递公司模板V2信息获取")
    private String childTempId;
    @ApiModelProperty("回单模板，部分快递公司需指定。通过管理后台的快递公司模板V2信息获取")
    private String backTempId;
    @ApiModelProperty("平台导入返回的订单id：如平台类加密订单，使用此下单为必填")
    private String thirdOrderId;
    @ApiModelProperty("淘宝订单收件人ID (Open Addressee ID)，长度不超过128个字符，淘宝订单加密情况用于解密")
    private String oaid;
    @ApiModelProperty("第三方平台明文订单直连平台面单模板生成电子面单，默认值为空，如为第三方明文订单，需设置为1才可以按照thirdTemplateURL对应模板返回，否则按照tempid对应模板返回")
    private String thirdPrint;
    @ApiModelProperty("第三方平台面单基础模板链接，如为第三方平台导入订单选填，如不填写，默认返回两联面单模板")
    private String thirdTemplateURL;
    @ApiModelProperty("订单编号")
    private String orderId;
    @ApiModelProperty("是否需要子单： 1：需要 0：不需要(默认)")
    private String needChild;
    @ApiModelProperty(value = "收件人信息", required = true)
    private RecManInfo recMan;
    @ApiModelProperty(value = "寄件人信息", required = true)
    private SendManInfo sendMan;

    @Data
    public static class RecManInfo {
        @ApiModelProperty(value = "收件人姓名", required = true)
        private String name;
        @ApiModelProperty(value = "收件人的手机号，手机号和电话号二者其一必填", required = true)
        private String mobile;
        @ApiModelProperty(value = "收件人的电话号，手机号和电话号二者其一必填", required = true)
        private String tel;
        @ApiModelProperty(value = "收件人所在完整地址", required = true)
        private String printAddr;
        @ApiModelProperty("收件人所在公司名称")
        private String company;
    }

    @Data
    public static class SendManInfo {
        @ApiModelProperty(value = "寄件人姓名", required = true)
        private String name;
        @ApiModelProperty(value = "寄件人的手机号，手机号和电话号二者其一必填", required = true)
        private String mobile;
        @ApiModelProperty(value = "寄件人的电话号，手机号和电话号二者其一必填", required = true)
        private String tel;
        @ApiModelProperty(value = "寄件人所在完整地址", required = true)
        private String printAddr;
        @ApiModelProperty("寄件人所在公司名称")
        private String company;
    }

    public static String dealPayTypeValue(Integer payType) {
        if (StringUtil.isNullOrZero(payType)) {
            return ExpressConst.PAY_TYPE_VALUE_1;
        }
        switch (payType) {
            case ExpressConst.PAY_TYPE_2:
                return ExpressConst.PAY_TYPE_VALUE_2;
            case ExpressConst.PAY_TYPE_3:
                return ExpressConst.PAY_TYPE_VALUE_3;
            case ExpressConst.PAY_TYPE_4:
                return ExpressConst.PAY_TYPE_VALUE_4;
            case ExpressConst.PAY_TYPE_1:
            default:
                return ExpressConst.PAY_TYPE_VALUE_1;
        }
    }
}
