package jnpf.model.franchisee.req;

import com.fasterxml.jackson.annotation.JsonFormat;
import jnpf.model.franchisee.po.FranchiseeEntity;
import jnpf.util.FtbUtil;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.springframework.format.annotation.DateTimeFormat;

import javax.validation.Valid;
import javax.validation.constraints.DecimalMin;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 加盟商新增请求参数
 */
@Data
public class FranchiseeAddReq implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 加盟商性质（字典类型：franchisee_nature）
     */
    @Length(max = 50, message = "加盟商性质长度不能超过50")
    private String franchiseeNature;

    /**
     * 加盟商名称
     */
    @NotBlank(message = "加盟商名称不能为空")
    @Length(max = 50, message = "加盟商名称长度不能超过50")
    private String franchiseeName;

    /**
     * 营业执照图片
     */
    @Length(max = 500, message = "营业执照图片地址长度不能超过500")
    private String businessLicenseUrl;

    /**
     * 公司名称
     */
    @Length(max = 100, message = "公司名称长度不能超过100")
    private String companyName;

    /**
     * 性别（字典类型：franchisee_gender）
     */
    @Length(max = 20, message = "性别长度不能超过20")
    private String gender;

    /**
     * 负责人身份证正面照片
     */
    @Length(max = 500, message = "负责人身份证正面照片地址长度不能超过500")
    private String idCardFrontUrl;

    /**
     * 负责人身份证号
     */
    @Length(max = 50, message = "负责人身份证号长度不能超过50")
    private String idCardNumber;

    /**
     * 现住址/公司地址
     */
    @Length(max = 254, message = "地址长度不能超过254")
    private String currentAddress;

    /**
     * 银行卡号
     */
    @Length(max = 30, message = "银行卡号长度不能超过30")
    private String bankCardNumber;

    /**
     * 加盟商编号
     */
    @NotBlank(message = "加盟商编号不能为空")
    @Length(max = 15, message = "加盟商编号长度不能超过15")
    private String franchiseeCode;

    /**
     * 手机号
     */
    @NotBlank(message = "手机号不能为空")
    @Length(max = 11, message = "手机号长度不能超过11")
    private String mobilePhone;

    /**
     * 负责人/法定代表人/经营者
     */
    @Length(max = 50, message = "负责人长度不能超过50")
    private String principal;

    /**
     * 负责人身份证反面照片
     */
    @Length(max = 500, message = "负责人身份证反面照片地址长度不能超过500")
    private String idCardBackUrl;

    /**
     * 年龄
     */
    @Min(value = 0, message = "年龄不能小于0")
    private Integer age;

    /**
     * 开户行
     */
    @Length(max = 100, message = "开户行长度不能超过100")
    private String bankName;

    /**
     * 加盟商状态（字典类型：franchisee_status）
     */
    @Length(max = 50, message = "加盟商状态长度不能超过50")
    private String franchiseeStatus;

    /**
     * 加盟方式（字典类型：franchisee_join_type）
     */
    @Length(max = 50, message = "加盟方式长度不能超过50")
    private String joinType;

    /**
     * 加盟日期
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date joinDate;

    /**
     * 成立时间
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date establishDate;

    /**
     * 加盟地区
     */
    private List<FranchiseeJoinRegionReq> joinRegion = new ArrayList<>();

    /**
     * 经营性质（字典类型：franchisee_business_nature）
     */
    @Length(max = 50, message = "经营性质长度不能超过50")
    private String businessNature;

    /**
     * 门店商圈（字典类型：franchisee_store_business_district）
     */
    @Length(max = 100, message = "门店商圈长度不能超过100")
    private String storeBusinessDistrict;

    /**
     * 投资门店数
     */
    @Min(value = 0, message = "投资门店数不能小于0")
    private Integer investStoreCount;

    /**
     * 投资金额
     */
    @DecimalMin(value = "0.00", message = "投资金额不能小于0")
    private BigDecimal investAmount;

    /**
     * 盈利预期（字典类型：franchisee_profit_expectation）
     */
    @Length(max = 50, message = "盈利预期长度不能超过50")
    private String profitExpectation;

    /**
     * 预计员工数
     */
    @Min(value = 0, message = "预计员工数不能小于0")
    private Integer expectedStaffCount;

    /**
     * 年收入（字典类型：franchisee_annual_income）
     */
    @Length(max = 50, message = "年收入长度不能超过50")
    private String annualIncome;

    /**
     * 收入来源（字典类型：franchisee_income_source）
     */
    @Length(max = 50, message = "收入来源长度不能超过50")
    private String incomeSource;

    /**
     * 债务情况（字典类型：franchisee_debt_situation）
     */
    @Length(max = 50, message = "债务情况长度不能超过50")
    private String debtSituation;

    /**
     * 自定义字段列表（JSON 数组字符串）
     * 示例：[{"fieldName": "自定义字段名称,最还使用fieldCode", "fieldValue": "自定义字段值"}]
     */
    private String customFieldList = "[]";

    /**
     * 从业经历列表（最多 5 条）
     */
    @Valid
    @Size(max = 5, message = "从业经历最多填写5条")
    private List<FranchiseeExperienceReq> experienceList = new ArrayList<>();

    /**
     * 转换为实体
     *
     * @return 加盟商主表实体
     */
    public FranchiseeEntity convert() {
        FranchiseeEntity entity = new FranchiseeEntity();
        entity.setId(FtbUtil.getId());
        entity.setFranchiseeNature(trim(this.franchiseeNature));
        entity.setFranchiseeName(trim(this.franchiseeName));
        entity.setBusinessLicenseUrl(trim(this.businessLicenseUrl));
        entity.setCompanyName(trim(this.companyName));
        entity.setGender(trim(this.gender));
        entity.setIdCardFrontUrl(trim(this.idCardFrontUrl));
        entity.setIdCardNumber(trim(this.idCardNumber));
        entity.setCurrentAddress(trim(this.currentAddress));
        entity.setBankCardNumber(trim(this.bankCardNumber));
        entity.setFranchiseeCode(trim(this.franchiseeCode));
        entity.setMobilePhone(trim(this.mobilePhone));
        entity.setPrincipal(trim(this.principal));
        entity.setIdCardBackUrl(trim(this.idCardBackUrl));
        entity.setAge(this.age);
        entity.setBankName(trim(this.bankName));
        entity.setFranchiseeStatus(trim(this.franchiseeStatus));
        entity.setJoinType(trim(this.joinType));
        entity.setJoinDate(this.joinDate);
        entity.setEstablishDate(this.establishDate);
        entity.setBusinessNature(trim(this.businessNature));
        entity.setStoreBusinessDistrict(trim(this.storeBusinessDistrict));
        entity.setInvestStoreCount(this.investStoreCount);
        entity.setInvestAmount(this.investAmount);
        entity.setProfitExpectation(trim(this.profitExpectation));
        entity.setExpectedStaffCount(this.expectedStaffCount);
        entity.setAnnualIncome(trim(this.annualIncome));
        entity.setIncomeSource(trim(this.incomeSource));
        entity.setDebtSituation(trim(this.debtSituation));
        entity.setStoreNum(0);
        entity.setEnabledMark(0);
        return entity;
    }

    private String trim(String value) {
        return value == null ? null : value.trim();
    }
}
