package com.hzs.member.self.vo;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.hzs.common.core.constant.msg.MemberMsgConstants;
import jdk.nashorn.internal.ir.annotations.Ignore;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.validation.constraints.Size;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class OrderParam implements Serializable {

    /**
     * 订单编号
     */
    private String orderCode;

    /**
     * 会员编号
     */
    private Long pkMember;

    /**
     * 会员编号
     */
    private String memberCode;

    /**
     * 会员姓名
     */
    private String memberName;

    /**
     * 会员类型（0.正常 1.空单 2.死点 4.嗨粉 5.商城小程序游客）
     */
    private Integer customerType;

    /**
     * 等级
     */
    private Integer pkGrade;

    /**
     * 手机号码
     */
    @Size(min = 1, max = 30, message = MemberMsgConstants.PHONE_LENGTH)
    private String phone;

    /**
     * 证件号码
     */
    private String idCard;

    /**
     * 性别（0=未知,1=男,2=女）
     */
    private Integer sex;

    /**
     * 自然国家
     */
    private Integer pkCountry;

    /**
     * 结算国家
     */
    private Integer pkSettleCountry;

    /**
     * 创建人结算国家，用于跨国报单
     */
    @JsonIgnore
    private Integer pkLoginSettleCountry;

    /**
     * 推荐人编号
     */
    private String parent;

    @JsonIgnore
    private Long parentId;
    /**
     * 推荐人ID，为防止之前业务有问题，不使用上面的字段
     */
    private Long pkParent;
    /**
     * 会员ID，为防止之前业务有问题，新添加会员ID字段
     */
    private Long pkMemberId;

    /**
     * 推荐人姓名
     */
    private String parentName;

    /**
     * 安置人编号
     */
    private String placeParent;

    @JsonIgnore
    private Long placeParentId;

    /**
     * 安置人姓名
     */
    private String placeParentName;

    /**
     * 安置人部门
     */
    private Integer placeDept;

    /**
     * 报单中心编号
     */
    private Long centerCodeId;

    /**
     * 报单中心名称
     */
    private String centerName;

    /**
     * 升级会员编号，需要验证安置线，只能给自己的安置以下升级
     */
    private String upgradeMemberCode;

    /**
     * 复购会员编号，需要验证安置线，只能给自己的安置以下升级
     */
    private String repurchaseMemberCode;

    /**
     * 会员升级姓名
     */
    private String upgradeMemberName;

    /**
     * 数据来源（1=PC端,2=APP,3=H5）
     */
    private Integer source;

    /**
     * 收货人
     */
    private String recName;

    /**
     * 收货电话
     */
    private String recPhone;

    /**
     * 收货省
     */
    private Integer recProvince;

    /**
     * 收货市
     */
    private Integer recCity;

    /**
     * 收货县
     */
    private Integer recCounty;

    /**
     * 收货地址
     */
    private String recAddress;

    /**
     * 备注
     */
    private String remark;

    /**
     * 配送中心
     */
    private Integer deliveryCenter;

    /**
     * 配送省
     */
    private Integer deliveryProvince;

    /**
     * 配送市
     */
    private Integer deliveryCity;

    /**
     * 配送县
     */
    private Integer deliveryCounty;

    /**
     * 发货方式
     */
    private Integer deliveryWay;

    /**
     * 运输类型 1=陆运，2=空运，3=海运
     */
    private Integer transType;
    /**
     * 运输类型 1=陆运，2=空运，3=海运
     */
    private Integer tranType;

    /**
     * 登录密码
     */
    @JsonIgnore
    private String loginPwd;

    /**
     * 支付密码
     */
    private String payPwd;

    /**
     * 邮箱
     */
    private String email;

    /**
     * 所属专区
     */
    private Integer specialArea;

    /**
     * 银行
     */
    private Integer pkBank;
    /**
     * 支行名称
     */
    private String subBankName;
    /**
     * 银行卡号
     */
    private String cardNumber;

    /**
     * 会员店铺
     */
    private Integer pkMemberStore;

    /**
     * 仓库
     */
    private Integer pkStorehouse;

    /**
     * 邮费
     */
    private BigDecimal postage = BigDecimal.ZERO;
    /**
     * 特殊邮费（处理不参与复购300包邮的邮费）
     */
    private BigDecimal specialPostage = BigDecimal.ZERO;
    /**
     * 特殊邮费金额（处理不参与复购300包邮的邮费）
     */
    private BigDecimal specialPostageAmount = BigDecimal.ZERO;

    /**
     * 订单商品明细
     */
    private List<OrderItemsParam> orderItemsParams;

    /**
     * 是否首单
     */
    private Boolean isFirst = false;

    /**
     * 是否海粉订单
     */
    @JsonIgnore
    private Boolean isHaiFun = false;

    /**
     * 显示默认，0=快速注册，1=普通注册
     */
    private Integer displayDefault;

    /**
     * 验证保存的必输字段
     */
    @JsonIgnore
    public List<String> getValidSaveField() {
        List<String> fieldList = getValidConfirmField();
        fieldList.add("payPwd");
        return fieldList;
    }

    @JsonIgnore
    public List<String> getFunValidConfirmField() {
        List<String> fieldList = getList();
        fieldList.add("memberName");
        fieldList.add("phone");
        fieldList.add("parent");
        return fieldList;
    }

    @JsonIgnore
    public List<String> getValidConfirmField() {
        List<String> fieldList = getFunValidConfirmField();
        fieldList.add("placeParent");
        fieldList.add("placeDept");
        return fieldList;
    }

    @Ignore
    private List<String> getList() {
        return new ArrayList<>();
    }
}
