package com.persagy.dmp.mybatis.utils;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.persagy.dmp.common.constant.CommonConstant;
import com.persagy.dmp.common.context.AppContext;
import com.persagy.dmp.common.model.entity.BaseEntity;

import java.util.ArrayList;
import java.util.List;

/**
 * 查询条件 通用工具
 * @author Charlie Yu
 * @date 2021-06-25
 */
public class ConditionUtil {

    /**
     * 确认项目范围条件
     * @param wrapper 查询条件
     */
    public static <T extends BaseEntity> void ensureProjectCriteria(QueryWrapper<T> wrapper) {
        List<String> inSql = new ArrayList<>();
        // 0-平台级数据
        inSql.add(CommonConstant.DEFAULT_ID);
        // groupCode-集团级数据
        if(StrUtil.isNotBlank(AppContext.getContext().getGroupCode())) {
            inSql.add(AppContext.getContext().getGroupCode());
        }
        // projectId-项目级数据
        if(StrUtil.isNotBlank(AppContext.getContext().getProjectId())) {
            inSql.add(AppContext.getContext().getProjectId());
        }
        wrapper.in(StrUtil.toUnderlineCase(AppContext.PROJECT_ID), inSql);
    }

    /**
     * 非层级管控数据拼接项目条件 - 当projectId为空时查所有
     * @param wrapper
     * @param <T>
     */
    public static <T extends BaseEntity> void ensureProjectCriteriaDirectly(QueryWrapper<T> wrapper) {
        String projectId = AppContext.getContext().getProjectId();
        wrapper.eq(StrUtil.isNotBlank(projectId), StrUtil.toUnderlineCase(AppContext.PROJECT_ID), projectId);
    }

    /**
     * 确认项目范围条件
     * @param wrapper 查询条件
     */
    public static <T extends BaseEntity> void ensureProjectCriteria(QueryWrapper<T> wrapper, String projectId) {
        List<String> inSql = new ArrayList<>();
        // 0-平台级数据
        inSql.add(CommonConstant.DEFAULT_ID);
        // groupCode-集团级数据
        if(!CommonConstant.DEFAULT_ID.equalsIgnoreCase(projectId)) {
            inSql.add(AppContext.getContext().getGroupCode());
        }
        if(StrUtil.isNotBlank(projectId)) {
            inSql.add(projectId);
        }
        wrapper.in(StrUtil.toUnderlineCase(AppContext.PROJECT_ID), inSql);
    }

    /**
     * 确认项目范围条件
     * @param wrapper 查询条件
     * @param column 项目ID列
     */
    public static <T extends BaseEntity> void ensureProjectCriteria(LambdaQueryWrapper<T> wrapper, SFunction<T, ?> column) {
        List<String> inSql = new ArrayList<>();
        // 0-平台级数据
        inSql.add(CommonConstant.DEFAULT_ID);
        // groupCode-集团级数据
        if(StrUtil.isNotBlank(AppContext.getContext().getGroupCode())) {
            inSql.add(AppContext.getContext().getGroupCode());
        }
        // projectId-项目级数据
        if(StrUtil.isNotBlank(AppContext.getContext().getProjectId())) {
            inSql.add(AppContext.getContext().getProjectId());
        }
        wrapper.in(column, inSql);
    }

    /**
     * 确认项目范围条件
     * @param wrapper 查询条件
     * @param column 项目ID列
     * @param projectId 项目ID值
     */
    public static <T extends BaseEntity> void ensureProjectCriteria(LambdaQueryWrapper<T> wrapper, SFunction<T, ?> column, String projectId) {
        List<String> inSql = new ArrayList<>();
        // 0-平台级数据
        inSql.add(CommonConstant.DEFAULT_ID);
        // groupCode-集团级数据
        if(!CommonConstant.DEFAULT_ID.equalsIgnoreCase(projectId)) {
            inSql.add(AppContext.getContext().getGroupCode());
        }
        if(StrUtil.isNotBlank(projectId)) {
            inSql.add(projectId);
        }
        wrapper.in(column, inSql);
    }

    /**
     * 获取数据范围ID
     * @return 0-平台级数据,groupCode-集团级数据,projectId-项目级数据
     */
    public static String getProjectId() {
        // projectId-项目级数据
        if(StrUtil.isNotBlank(AppContext.getContext().getProjectId())) {
            return AppContext.getContext().getProjectId();
        } else if(StrUtil.isNotBlank(AppContext.getContext().getGroupCode())) {
            // groupCode-集团级数据
            return AppContext.getContext().getGroupCode();
        } else {
            return CommonConstant.DEFAULT_ID;
        }
    }
}
