package com.lin.utils;

import com.lin.helper.DatabaseHelper;
import org.apache.commons.dbcp2.BasicDataSource;

/**
 * 数据库连接配置工具
 * @author lkmc2
 * @since 1.0.0
 */
public final class DBTools {

    /** 数据库连接url **/
    private String url;

    /** 数据库用户名 **/
    private String username;

    /** 数据库密码 **/
    private String password;

    /** 数据库驱动名 **/
    private String driverClassName;

    private DBTools() {
    }

    // 静态单例
    private static final class DBToolsHolder {
        private static final DBTools INSTANCE = new DBTools();
    }

    /**
     * 创建数据库连接配置工具实例,并设置数据库连接url
     * @param url 数据库连接url
     * @return 数据库连接配置工具
     */
    public static DBTools url(String url) {
        return DBToolsHolder.INSTANCE.setUrl(url);
    }

    /**
     * 设置数据库连接url
     * @param url 数据库连接url
     * @return 数据库连接配置工具
     */
    private DBTools setUrl(String url) {
        this.url = url;
        return this;
    }

    /**
     * 创建数据库连接配置工具实例,并设置连接的数据库名
     * @param dbName 数据库名
     * @return 数据库连接配置工具
     */
    public static DBTools dbName(String dbName) {
        return DBToolsHolder.INSTANCE.setDbName(dbName);
    }

    /**
     * 设置连接的数据库名
     * @param dbName 数据库名
     * @return 数据库连接配置工具
     * 默认会加上前缀:jdbc:mysql://localhost:3306/
     */
    private DBTools setDbName(String dbName) {
        if (this.url == null) {
            this.url = "jdbc:mysql://localhost:3306/" + dbName;
        }
        return this;
    }

    /**
     * 设置连接的数据库用户名
     * @param username 数据库用户名
     * @return 数据库连接配置工具
     * 默认值为:root
     */
    public DBTools username(String username) {
        this.username = username;
        return this;
    }

    /**
     * 设置连接的数据库密码
     * @param password 数据库密码
     * @return 数据库连接配置工具
     * 默认值为:123456
     */
    public DBTools password(String password) {
        this.password = password;
        return this;
    }

    /**
     * 设置连接的数据库驱动名
     * @param driverClassName 数据库驱动名
     * @return 数据库连接配置工具
     * 默认值为:com.mysql.jdbc.Driver
     */
    public DBTools driverClassName(String driverClassName) {
        this.driverClassName = driverClassName;
        return this;
    }

    /**
     * 进行数据库连接
     */
    public void connect() {
        // 获取数据库连接池
        BasicDataSource dataSource = DatabaseHelper.getDataSource();

        if (url.isEmpty()) {
            throw new RuntimeException("数据库url不能为空");
        }

        // 对 mysql 数据库进行处理
        if (url.contains("jdbc:mysql")) {
            // 对 url 进行处理
            if (!url.contains("?")) {
                // url 不包括问号时,添加SSL、编码信息、时区等信息
                url += "?useSSL=true&useUnicode=true&characterEncoding=UTF-8&useOldAliasMetadataBehavior=true&autoReconnect=true&serverTimezone=UTC";
            } else if (url.contains("?")) {
                // url 包括问号时,添加SSL、编码信息、时区等信息
                url += "&useSSL=true&useUnicode=true&characterEncoding=UTF-8&useOldAliasMetadataBehavior=true&autoReconnect=true&serverTimezone=UTC";
            }
        }

        // 设置数据库信息
        dataSource.setUrl(url);
        dataSource.setUsername((username != null) ? username : "root");
        dataSource.setPassword((password != null) ? password : "123456");
        dataSource.setDriverClassName((driverClassName != null) ? driverClassName : "com.mysql.jdbc.Driver");

        // 对 Oracle 数据库进行处理
        if (url.contains("jdbc:oracle")) {
            // 修改 Oracle 数据库的日期格式
            DatabaseHelper.executeUpdate("alter session set nls_date_format='yyyy-MM-dd hh24:mi:ss'");
        }
    }

}