package org.ta.pddserver.model.pddjy.request;

import lombok.Data;
import lombok.EqualsAndHashCode;

import java.io.Serial;
import java.io.Serializable;
import java.util.List;

@EqualsAndHashCode(callSuper = true)
@Data
public class PddServiceConsoOutboundRequest extends JYBaseRequestModel implements Serializable {
    @Serial
    private static final long serialVersionUID = 1L;

    /**
     * 服务商code（必填）
     */
    private String providerCode;

    /**
     * 合包单号（必填）
     */
    private String orderCode;

    /**
     * 派送段（必填）
     * <p>RETURNSELLER：退回卖家；SENDTORECEVER：送往收货人</p>
     */
    private String segmentCode;

    /**
     * 业务发生时间（必填，格式：yyyy-MM-dd HH:mm:ss）
     */
    private String executeTime;

    /**
     * 时区（非必填，默认北京时区：UTC+8）
     */
    private String timeZone;

    /**
     * 是否拆包出库（必填）
     * <p>Y:拆包出库；N:非拆包出库</p>
     */
    private String isSplitOut;

    /**
     * 包裹详情列表（非必填，出库成功时必填）
     * <p>拆包出库时多个包裹；非拆包出库时一个包裹</p>
     */
    private List<PackageInfo> packageInfos;

    /**
     * 寄件人详情（必填）
     */
    private SenderDetail senderDetail;

    /**
     * 收货人详情（必填）
     */
    private ReceiverDetail receiverDetail;

    /**
     * 实操结果信息（必填）
     */
    private Result result;


    /**
     * 包裹详情
     */
    @Data
    public static class PackageInfo {
        /**
         * 出库运单号（必填）
         */
        private String outboundMailNo;

        /**
         * 快递公司编码（必填）
         * <p>1. segmentCode=SENDTORECEVER时：集运服务商入库拼多多生成的编码</p>
         * <p>2. segmentCode=RETURNSELLER时：出库运单号面单对应的编码</p>
         */
        private String expressCode;

        /**
         * 包裹种类（必填）
         * <p>1：木箱；2：纸箱；3：桶装；4：散装；5：托盘；6：包/袋；7：其它</p>
         */
        private String packageType;

        /**
         * 包裹长度（非必填，单位：厘米）
         */
        private Long length;

        /**
         * 包裹宽度（非必填，单位：厘米）
         */
        private Long width;

        /**
         * 包裹高度（非必填，单位：厘米）
         */
        private Long height;

        /**
         * 计费重量（必填，单位：克）
         */
        private Long weight;

        private List<InboundMailDetail> inboundMailDetails;
    }


    /**
     * 寄件人详情
     */
    @Data
    public static class SenderDetail {
        /**
         * 寄件人姓名（必填）
         */
        private String name;

        /**
         * 手机号/固定电话（必填）
         */
        private String telePhone;

        /**
         * 地区/国家（必填）
         */
        private String country;

        /**
         * 省（必填）
         */
        private String province;

        /**
         * 市（必填）
         */
        private String city;

        /**
         * 区（必填）
         */
        private String district;

        /**
         * 详细地址（必填）
         */
        private String detailAddress;
    }


    /**
     * 收货人详情
     */
    @Data
    public static class ReceiverDetail {
        /**
         * 收件人姓名（必填）
         */
        private String name;

        /**
         * 手机号/固定电话（必填）
         */
        private String telePhone;

        /**
         * 地区/国家（必填）
         */
        private String country;

        /**
         * 省（必填）
         */
        private String province;

        /**
         * 市（必填）
         */
        private String city;

        /**
         * 区（必填）
         */
        private String district;

        /**
         * 详细地址（必填）
         */
        private String detailAddress;
    }


    /**
     * 实操结果信息
     */
    @Data
    public static class Result {
        /**
         * 实操结果code（非必填，默认0为成功）
         * <p>0-出库成功；其他code-问题件异常上报（详见附录五）</p>
         */
        private Integer code;

        /**
         * 结果简要描述（必填，code≠0时必填）
         */
        private String desc;

        /**
         * 结果信息描述（必填，code≠0时必填）
         */
        private String remark;
    }

    @Data
    public static class InboundMailDetail {
        private String mailNo;
        private String expressCode;
    }


}
