package cn.com.capcloud.core.noentitydb;

import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 检测应用程序当前连接的数据库类型
 *
 * @Author LiaoJiaHui
 * @Create 2024/9/26 18:24
 */
@Component
public class DBCheck {

    private static final org.slf4j.Logger logger = LoggerFactory.getLogger(DBCheck.class);

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Value("${spring.datasource.url}")
    private String datasourceUrl;
    @Value("${rzth.mongodb.isCreateMongoDBConnect:N}")
    private String isCreateMongoDBConnect;
    @Value("${spring.jpa.database}")
    private String springJpaDatabase;
    private static String cachedJpaDatabase ="";
    private static String dbType ="";
    private static String identifierQuoteChar ="";
    private static String databaseName ="";
    private static String databaseId ="";
    private static boolean isMongoDB =false;

    // 数据库类型常量
    public static final String MYSQL = "MySQL";
    public static final String KINGBASE = "Kingbase";
    public static final String H2 = "H2";

    @PostConstruct
    public void checkDatabaseType() {
        if (datasourceUrl.contains("mysql")) {
            dbType = "MySQL";
            identifierQuoteChar = "`";
            String regex = "jdbc:mysql://[^/]+/([^?]+)";// 定义正则表达式，匹配数据库名
            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(datasourceUrl);
            if (matcher.find()) {// 如果匹配成功，提取数据库名
                databaseName = matcher.group(1);
            }
        } else if (datasourceUrl.contains("kingbase")) {
            dbType = "Kingbase";
            identifierQuoteChar = "\"";
        } else if (datasourceUrl.contains("h2")) {
            dbType = "H2";
            identifierQuoteChar = "\"";
        }else{
            dbType = "Unknown Database";//未在CCUI备案的数据库
        }
        if(!dbType.equals("Unknown Database")){
            try {
                databaseId=jdbcTemplate.queryForObject("SELECT id FROM tbl_data_db WHERE database_name='"+dbType+"'",String.class);
            } catch (DataAccessException e) {
                // 未在tbl_data_db配置该数据库
            }
        }
        if(isCreateMongoDBConnect.equals("Y")){
            isMongoDB=true;
        }
        cachedJpaDatabase=springJpaDatabase.toLowerCase();
        logger.info("数据库类型: " + dbType);
        if(!dbType.toLowerCase().equals(cachedJpaDatabase)){
            logger.info("兼容数据库: " + cachedJpaDatabase);
        }
        logger.info("如需启用相关组件，请参考文档进行配置: https://docs.capcloud.kanhouchu.com/web/#/p/5cc0be01509f99ca16ec40f40c063540");
    }

    // 获取数据库的字段修饰符
    public static String getColumnWithModifier(String columnName) {
        return getColumnWithModifier(columnName,databaseName);  // 数据库字段修饰符
    }

    /*
    数据库字段修饰符
    如果在处理数据库字段名时使用变量来构建修饰符，需要注意不同数据库使用的修饰符方式。
    像 SQL Server 使用的是不对称修饰符（方括号 []），而其他数据库如 MySQL、SQLite、MariaDB 使用对称修饰符（反引号 `）。
    因此，处理字段名时要根据数据库类型选择正确的修饰符。
     */
    public static String getColumnWithModifier(String columnName,String dbType) {
        if(dbType.equals("MySQL")){
            return "`" + columnName + "`";
        }
        if(dbType.equals("Kingbase")&&getCachedJpaDatabase().equals("oracle")){
            //如果是Kingbase 并且数据库兼容模式是oracle则使用双引号
            return "\"" + columnName + "\"";
        }
        return "`" + columnName + "`"; // 默认使用反引号（如 MySQL）
    }

    public static String getDbType() {
        return dbType;
    }
    public static String getIdentifierQuoteChar() {
        return identifierQuoteChar;
    }
    public static String getDatabaseName() {
        return databaseName;
    }
    public static String getDatabaseId() {
        return databaseId;
    }
    public static String getCachedJpaDatabase() {
        return cachedJpaDatabase;
    }

    // 判断是否是 MySQL 数据库
    public static boolean isMySQL() {
        return MYSQL.equals(dbType);
    }

    // 判断是否是 Kingbase 数据库
    public static boolean isKingbase() {
        return KINGBASE.equals(dbType);
    }

    // 判断是否是 Kingbase 数据库
    public static boolean isH2() {
        return H2.equals(dbType);
    }

    // 判断是否是创建 MongoDB 连接（是否使用MongoDB）
    public static boolean isMongoDB() {
        return isMongoDB;
    }
}

