package org.ta.pddserver.entity;

import lombok.Data;
import org.ta.pddserver.entity.TraceObjectEntity;

@Data
public class TraceObject {
    /**
     * 运单号（必填，快递公司运单号）
     */
    private String trackingNumber;

    /**
     * 物流号（选填，每次订阅生成的唯一ID）
     */
    private String trackingOrderNo;

    /**
     * 数据id（必填，由java.util.UUID生成）
     */
    private String id;

    /**
     * 状态（必填，如：GOT，详见3.2物流状态与状态描述对照表）
     */
    private String status;

    /**
     * 轨迹详情描述（必填，如：上海青浦区白鹤镇公司 已收件）
     */
    private String description;

    /**
     * 操作时间（必填，格式：yyyy-MM-dd HH:mm:ss）
     */
    private String operationTime;

    /**
     * 是否转单（必填，0：否；1：是）
     */
    private Integer transferFlag;

    /**
     * 转单单号（条件必填，transferFlag=1时必填）
     */
    private String transferNo;

    /**
     * 转单快递公司ID（条件必填，transferFlag=1时必填，映射不到用180，详见附录3.2）
     */
    private String transferPartnerId;

    /**
     * 时区（必填，默认：+08:00）
     */
    private String timeZone = "+08:00";

    /**
     * 扫描站点名称（必填）
     * <p>status为IN_CABINET、OUT_CABINET、SIGN_ON_BEHALF时为自提点/自提柜名称</p>
     */
    private String siteName;

    /**
     * 扫描站点类型（必填）
     * <p>1:网点；2:中转中心；3:代收点；4:仓库；5:干线；6:清关</p>
     * <p>status为IN_CABINET、OUT_CABINET、SIGN_ON_BEHALF时固定传3</p>
     */
    private Integer siteType;

    /**
     * 扫描站点编码（必填）
     * <p>1. 站点编号；2. 代收点ID（status为IN_CABINET等状态时）；无代收点ID则传站点ID</p>
     */
    private String siteNo;

    /**
     * 下一站点名称（条件必填，status为DEPARTURE、TRUCK_OUT时必填）
     */
    private String nextSiteName;

    /**
     * 下一站类型（条件必填，status为DEPARTURE、TRUCK_OUT时必填）
     * <p>1:网点；2:中转中心；3:代收点；4:仓库；5:干线；6:清关</p>
     */
    private Integer nextSiteType;

    /**
     * 下一站点编号（条件必填，status为DEPARTURE、TRUCK_OUT时必填）
     */
    private String nextSiteNo;

    /**
     * 问题原因code（条件必填）
     * <p>status为ARRIVAL、DEPARTURE、FAIL、REJECTION、IN_CABINET、OUT_CABINET、SIGN_ON_BEHALF、CLEARANCE_START、CLEARANCE_FINISH时必填，详见3.2二级状态对照表</p>
     */
    private String failReason;

    /**
     * 重量（选填，单位：克(g)）
     */
    private Double weight;

    /**
     * 国家/地区二字码（必填，默认CN，其他详见3.4）
     */
    private String country = "CN";

    /**
     * 省份名称（必填）
     */
    private String province;

    /**
     * 扫描城市编码（必填，从2.4接口获取并缓存）
     */
    private String city;

    /**
     * 三级地址（区/县，选填）
     */
    private String district;

    /**
     * 操作员名称（条件必填）
     * <p>1. status为SEND、IN_CABINET、OUT_CABINET（二级状态OUT_CABINET_502/503）、SIGN_ON_BEHALF时必填</p>
     */
    private String contact;

    /**
     * 操作员联系方式（条件必填）
     * <p>1. status为SEND、OUT_CABINET（OUT_CABINET_502/503）时为操作员手机号</p>
     * <p>2. status为IN_CABINET、OUT_CABINET（OUT_CABINET_501）时为代收点电话</p>
     * <p>3. status为SIGN_ON_BEHALF时，优先代收点电话，无则传操作员手机号</p>
     */
    private String contactInfo;

    /**
     * 签收人姓名/类型（条件必填，SIGN、SIGN_ON_BEHALF状态必填，如：本人签收、XXX代收点）
     */
    private String signerName;

    /**
     * 代收点地址（条件必填，IN_CABINET、OUT_CABINET、SIGN_ON_BEHALF状态必填）
     */
    private String address;

    /**
     * 备注信息（条件必填，扩展字段格式：<标签>内容</标签>，多个追加，详见附录3.6）
     */
    private String remark;


    public static TraceObject createFromTraceEntity(TraceObjectEntity traceObjectEntity) {
        TraceObject traceObject = new TraceObject();

        traceObject.setCity(traceObjectEntity.getCity());
        traceObject.setContact(traceObjectEntity.getContact());
        traceObject.setContactInfo(traceObjectEntity.getContactInfo());
        traceObject.setCountry(traceObjectEntity.getCountry());
        traceObject.setOperationTime(traceObjectEntity.getOperationTime());
        traceObject.setDescription(traceObjectEntity.getDescription());
        traceObject.setDistrict(traceObjectEntity.getDistrict());
        traceObject.setId(traceObjectEntity.getId());
        traceObject.setProvince(traceObjectEntity.getProvince());
        traceObject.setRemark(traceObjectEntity.getRemark());
        traceObject.setSiteName(traceObjectEntity.getSiteName());
        traceObject.setSiteNo(traceObjectEntity.getSiteNo());
        traceObject.setSiteType(traceObjectEntity.getSiteType());
        traceObject.setStatus(String.valueOf(traceObjectEntity.getStatus()));
        traceObject.setTimeZone(traceObjectEntity.getTimeZone());
        traceObject.setTrackingNumber(traceObjectEntity.getTrackingNumber());
        traceObject.setTransferFlag(traceObjectEntity.getTransferFlag());

        return traceObject;
    }
}
