package com.hdkj.lt.core.bizms.mp;

import com.baomidou.mybatisplus.extension.plugins.handler.TableNameHandler;
import com.hdkj.lt.core.hussar.SpringContextHolder;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;

/**
 * 表名处理工具
 */
public class ArgTableNameHandler implements TableNameHandler {

    // 需要变更表的后缀信息
    private final static ThreadLocal<String> ARG_VALUE = new ThreadLocal<>();

    // 函数方法需要变更表的后缀信息
    private final static ThreadLocal<String> ARG_VALUE_FUNC = new ThreadLocal<>();

    // 分区名信息
    private final static ThreadLocal<String> PARTITION_NAME = new ThreadLocal<>();

    // 配置的需要替换的表信息
    //todo: 配置参数
//    private final static List<String> TABLE_LIST = SpringContextHolder.environment.getProperty("lt.tables", List.class);
    private final static List<String> TABLE_LIST = new ArrayList<>();


    /**
     * 设置参数类值（需要变更表的后缀信息）
     */
    public static void setArgument(String value) {
        ARG_VALUE.set(value);
    }

    /**
     * 设置分区根据分区名
     */
    public static void setPartitionName(String partitionName) {
        PARTITION_NAME.set(partitionName);
    }

    /**
     * 批量参数类值和执行方法（需要变更表的后缀信息）
     */
    public static <T, R> R setArgumentFunc(String value, Function<List<T>, R> function, List<T> arg) {
        try {
            ARG_VALUE_FUNC.set(value);
            return function.apply(arg);
        } finally {
            ARG_VALUE_FUNC.remove();
        }
    }

    /**
     * 获取函数方法变更表后缀信息
     */
    public static String getArgumentFunc() {
        return ARG_VALUE_FUNC.get();
    }

    /**
     * 获取变更表后缀信息
     */
    public static String getArgument() {
        return ARG_VALUE.get();
    }

    /**
     * 删除表后缀、分区名信息
     */
    public static void remove() {
        ARG_VALUE.remove();
        PARTITION_NAME.remove();
    }

    @Override
    public String dynamicTableName(String sql, String tableName) {
        // 未配置表 或者 不包含配置的表时，直接不需要处理
        if (ObjectUtils.isEmpty(TABLE_LIST) || !TABLE_LIST.contains(tableName.toLowerCase())) {
            return tableName;
        }
        // 替换满足配置条件的表名
        StringBuilder stringBuilder = new StringBuilder(tableName);
        if (ObjectUtils.isNotEmpty(ARG_VALUE.get())) {
            stringBuilder.append("_").append(ARG_VALUE.get());
        } else if (ObjectUtils.isNotEmpty(ARG_VALUE_FUNC.get())) {
            stringBuilder.append("_").append(ARG_VALUE_FUNC.get());
        }
        // 设置分区信息
        if (StringUtils.isNotBlank(PARTITION_NAME.get())) {
            stringBuilder.append(" PARTITION (").append(PARTITION_NAME.get()).append(")");
        }
        return stringBuilder.toString();
    }

}
