package com.njzscloud.dispose.sys.user.pojo.param;

import cn.hutool.core.util.StrUtil;
import com.njzscloud.common.mvc.validator.Constrained;
import com.njzscloud.common.mvc.validator.Constraint;
import com.njzscloud.common.mvc.validator.ValidRule;
import com.njzscloud.common.security.contant.AuthWay;
import com.njzscloud.common.security.contant.ClientCode;
import com.njzscloud.dispose.cst.customer.constant.IdentityCategory;
import com.njzscloud.dispose.cst.org.constant.OrgCategory;
import com.njzscloud.dispose.sys.user.constant.Gender;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;

import java.time.LocalDate;
import java.util.List;

@Getter
@Setter
@ToString
@Accessors(chain = true)
public class UserRegisterParam implements Constrained {
    @NotNull(message = "鉴权方式不能为空")
    private AuthWay authWay;
    /**
     * 昵称
     */
    @NotBlank(message = "姓名不能为空")
    private String nickname;
    /**
     * 邮箱
     */
    private String email;
    /**
     * 手机号
     */
    @NotBlank(message = "手机号不能为空")
    private String phone;
    /**
     * 头像
     */
    private String avatar;

    /**
     * 性别; 字典代码：gender
     */
    private Gender gender;
    /**
     * 账号信息
     */
    @Valid
    private Account account;

    /**
     * 客户信息
     */
    @Valid
    @NotNull(message = "客户信息不能为空")
    private Customer customer;

    /**
     * 组织信息
     */
    @Valid
    private Org org;

    /**
     * 角色 Id 列表
     */
    private List<Long> roles;

    @Override
    public ValidRule[] rules() {
        return new ValidRule[]{
            ValidRule.of(() -> account != null, "账号信息不能为空"),
            ValidRule.of(() -> !customer.getManager() || org != null, "组织信息不能为空"),
        };
    }

    @Getter
    @Setter
    @Constraint
    @Accessors(chain = true)
    public static class Account implements Constrained {
        /**
         * 用户 Id; sys_user.id
         */
        private Long userId;
        /**
         * 用户名
         */
//        @NotBlank(message = "账号不能为空")
        private String username;
        /**
         * 手机号
         */
        private String phone;
        /**
         * 密码
         */
//        @NotBlank(message = "密码不能为空")
        private String secret;
        /**
         * 微信 openid
         */
        private String wechatCode;
        /**
         * 微信 openid
         */
        private String openid;
        /**
         * 允许登录的客户端; 字典代码：client_code
         */
        private Integer clientCode;

        @Override
        public ValidRule[] rules() {
            return new ValidRule[]{
                ValidRule.of(() -> (StrUtil.isNotBlank(username) && StrUtil.isNotBlank(secret))
                    || (StrUtil.isNotBlank(phone) && StrUtil.isNotBlank(secret))
                    || StrUtil.isNotBlank(wechatCode), "账号信息不能为空"),
                ValidRule.of(() -> clientCode != null, "客户端信息不能为空"),
                ValidRule.of(() -> clientCode > 0 && ClientCode.valid(clientCode), "客户端信息无效"),
            };
        }
    }

    @Getter
    @Setter
    @Constraint
    @Accessors(chain = true)
    public static class Customer implements Constrained {
        private Long userId;

        /**
         * 身份类型；多个身份多条数据，ChanFei-->产废方、YunShu-->运输方、CaiGou-->采购方、SiJi-->司机
         */
        @NotNull(message = "身份类型不能为空")
        private IdentityCategory identityCategory;

        /**
         * 组织信息 Id；cst_org.id
         */
        private Long orgId;

        /**
         * 客户姓名
         */
//        @NotBlank(message = "客户姓名不能为空")
        private String customerName;

        /**
         * 客户联系电话
         */
//        @NotBlank(message = "客户联系电话不能为空")
        private String phone;

        /**
         * 是否管理员；是否为当前的组织管理员，0-->否、1-->是
         */
//        @NotNull(message = "是否为当前组织管理员不能为空")
        private Boolean manager;
    }

    @Getter
    @Setter
    @Constraint
    @Accessors(chain = true)
    public static class Org implements Constrained {

        /**
         * 组织 Id，加入企业时必填
         */
        Long orgId;

        /**
         * 主体类型，GeTiHu-->个体户、QiYe-->企业
         */
//        @NotNull(message = "主体类型不能为空")
        private OrgCategory orgCategory;

        /**
         * 统一社会信用代码
         */
//        @NotBlank(message = "统一社会信用代码不能为空")
        private String uscc;

        /**
         * 组织名称
         */
//        @NotBlank(message = "组织名称不能为空")
        private String orgName;

        /**
         * 营业执照
         */
        private String businessLicense;

        /**
         * 驾驶证图片
         */
        private List<String> drivingLicence;

        /**
         * 营业执照有效期
         */
        private LocalDate licenseStartTime;

        /**
         * 营业执照有效期
         */
        private LocalDate licenseEndTime;

        /**
         * 法人名称
         */
        private String legalRepresentative;

        /**
         * 法人身份证号
         */
        private String idcard;

        /**
         * 法人身份证有效期
         */
//        @NotNull(message = "法人身份证有效期不能为空")
        private LocalDate idcardStartTime;

        /**
         * 法人身份证有效期
         */
//        @NotNull(message = "法人身份证有效期不能为空")
        private LocalDate idcardEndTime;

        /**
         * 法人身份证正面
         */
        private String idcardFront;

        /**
         * 法人身份证反面
         */
        private String idcardBack;

        /**
         * 省；代码
         */
        private String province;

        /**
         * 市；代码
         */
        private String city;

        /**
         * 区县；代码
         */
        private String area;

        /**
         * 乡镇街道；代码
         */
        private String town;

        /**
         * 省；名称
         */
        private String provinceName;

        /**
         * 市；名称
         */
        private String cityName;

        /**
         * 区县；名称
         */
        private String areaName;

        /**
         * 乡镇街道；名称
         */
        private String townName;

        /**
         * 详细地址
         */
        private String address;

        /**
         * 经度
         */
        private Double lng;

        /**
         * 纬度
         */
        private Double lat;

    }

}
