package com.jeequan.jeepay.core.model;

import com.alibaba.fastjson.JSON;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.StringUtils;

import java.util.Collections;
import java.util.List;

/***
 * 权限匹配规则model
 *
 * @author terrfly
 * @since 2022/2/15 13:02
 */
@Data
@NoArgsConstructor
public class EntMatchRuleModel {

    /**
     * 商户类型： 例如值： 1
     **/
    private Byte mchType;

    /**
     * 匹配商户级别： 示例值： ['M0']
     **/
    private List<String> mchLevelArray;

    private Boolean epUserEnt;

    /**
     * 仅商户 & 商户以获取分账权限才可见
     **/
    private Boolean mchDivisionEnt;

    /**
     * 仅商户 & 商户分配广告权限才可见
     **/
    private Boolean mchAdvertEnt;

    /**
     * 仅商户 & 商户分配收银台权限才可见
     **/
    private Boolean mchSelfCashierEnt;

    /**
     * 仅商户 & 商户开启收银台配置才可见
     **/
    private Boolean mchMemberEnt;

    /**
     * 用户类型： 示例值： ['USER_TYPE_11_INIT', 'USER_TYPE_12_INIT']
     **/
    private List<String> userEntRules;

    /**
     * 转换对象， 基于数据库的基础标志转换为 待比较对象
     **/
    public static EntMatchRuleModel convertByMch(Byte mchType, String mchLevel, boolean mchDivisionEnt,
                                                 boolean mchAdvertEnt, boolean mchSelfCashierEnt, boolean mchMemberEnt) {

        EntMatchRuleModel result = new EntMatchRuleModel();
        result.setMchType(mchType);
        result.setMchLevelArray(Collections.singletonList(mchLevel));
        result.setMchDivisionEnt(mchDivisionEnt);
        result.setMchAdvertEnt(mchAdvertEnt);
        result.setMchSelfCashierEnt(mchSelfCashierEnt);
        result.setMchMemberEnt(mchMemberEnt);
        return result;
    }


    /**
     * 比较
     * <p>
     * currentInfoConfig : 当前商户/角色的配置项
     * this: 当前菜单条目。
     **/
    public boolean match(EntMatchRuleModel currentInfoConfig) {

        // 比较商户类型
        if (this.mchType != null && !this.mchType.equals(currentInfoConfig.getMchType())) {
            return false;
        }

        // 比较商户级别
        if (this.mchLevelArray != null && !this.mchLevelArray.contains(currentInfoConfig.getMchLevelArray().get(0))) {
            return false;
        }

        // 规则存在 && 商户配置明确为 false( 不支持 ) -- 分账
        if (this.mchDivisionEnt != null && Boolean.FALSE.equals(currentInfoConfig.getMchDivisionEnt())) {
            return false;
        }

        // 规则存在 && 商户配置明确为 false( 不支持 ) -- 广告
        if (this.mchAdvertEnt != null && Boolean.FALSE.equals(currentInfoConfig.getMchAdvertEnt())) {
            return false;
        }

        // 规则存在 && 商户配置明确为 false( 不支持 ) -- 便捷收银台
        if (this.mchSelfCashierEnt != null && !Boolean.TRUE.equals(currentInfoConfig.getMchSelfCashierEnt())) {
            return false;
        }

        // 规则存在 && 商户配置明确为 false( 不支持 ) -- 商户会员功能
        if (this.mchMemberEnt != null && !Boolean.TRUE.equals(currentInfoConfig.getMchMemberEnt())) {
            return false;
        }

        // 匹配成功
        return true;
    }


    // 判断是否匹配上 userEntRules
    public boolean matchUserEntRules(String dbUserEntRules) {

        // 当前菜单不支持 userEntRules 判断。
        if (this.getUserEntRules() == null || this.getUserEntRules().isEmpty()) {
            return false;
        }

        // 用户信息不存在， 不包含
        if (StringUtils.isEmpty(dbUserEntRules)) {
            return false;
        }

        // 判断是否存在
        List<String> list = JSON.parseArray(dbUserEntRules, String.class);
        for (String s : list) {
            if (getUserEntRules().contains(s)) {
                return true;
            }
        }
        return false;
    }


}
