package com.easyagents.federation.sql.source;

import java.util.Optional;

/**
 * 常见数据库 JDBC 驱动元数据目录。
 *
 * <p>该枚举仅提供驱动类名、JDBC URL 前缀和可选 Maven 坐标，不引入厂商驱动，
 * 也不表示对应数据库已经通过 Federation Adapter 兼容性验证。</p>
 */
public enum KnownJdbcDriver {

    /** MySQL Connector/J。 */
    MYSQL(
        "com.mysql.cj.jdbc.Driver",
        "jdbc:mysql:",
        "com.mysql:mysql-connector-j"
    ),
    /** PostgreSQL pgJDBC。 */
    POSTGRESQL(
        "org.postgresql.Driver",
        "jdbc:postgresql:",
        "org.postgresql:postgresql"
    ),
    /** Oracle JDBC Thin Driver。 */
    ORACLE(
        "oracle.jdbc.OracleDriver",
        "jdbc:oracle:thin:",
        "com.oracle.database.jdbc:ojdbc11"
    ),
    /** Microsoft JDBC Driver for SQL Server。 */
    SQL_SERVER(
        "com.microsoft.sqlserver.jdbc.SQLServerDriver",
        "jdbc:sqlserver:",
        "com.microsoft.sqlserver:mssql-jdbc"
    ),
    /** 华为 GaussDB 原生 JDBC 驱动。 */
    GAUSSDB(
        "com.huawei.gaussdb.jdbc.Driver",
        "jdbc:gaussdb:",
        null
    ),
    /** 达梦 DM8 JDBC 驱动。 */
    DM8(
        "dm.jdbc.driver.DmDriver",
        "jdbc:dm:",
        "com.dameng:DmJdbcDriver8"
    ),
    /** 南大通用 GBase 8a JDBC 驱动。 */
    GBASE_8A(
        "com.gbase.jdbc.Driver",
        "jdbc:gbase:",
        null
    ),
    /** 南大通用 GBase 8s JDBC 驱动。 */
    GBASE_8S(
        "com.gbasedbt.jdbc.Driver",
        "jdbc:gbasedbt-sqli:",
        null
    ),
    /** OceanBase Connector/J，可识别 MySQL 与 Oracle 两种租户模式。 */
    OCEANBASE(
        "com.oceanbase.jdbc.Driver",
        "jdbc:oceanbase:",
        "com.oceanbase:oceanbase-client"
    );

    /** JDBC 驱动实现类的全限定名称。 */
    private final String driverClassName;
    /** 驱动接受的 JDBC URL 前缀。 */
    private final String jdbcUrlPrefix;
    /** 不包含版本号的 Maven groupId:artifactId，可为空。 */
    private final String mavenCoordinate;

    /**
     * 创建 JDBC 驱动元数据项。
     *
     * @param driverClassName JDBC 驱动实现类的全限定名称
     * @param jdbcUrlPrefix JDBC URL 前缀
     * @param mavenCoordinate 不包含版本号的 Maven 坐标，不公开时传入 {@code null}
     */
    KnownJdbcDriver(
        String driverClassName,
        String jdbcUrlPrefix,
        String mavenCoordinate
    ) {
        this.driverClassName = driverClassName;
        this.jdbcUrlPrefix = jdbcUrlPrefix;
        this.mavenCoordinate = mavenCoordinate;
    }

    /**
     * 返回 JDBC 驱动实现类的全限定名称。
     *
     * @return 驱动类名
     */
    public String driverClassName() {
        return driverClassName;
    }

    /**
     * 返回该驱动接受的 JDBC URL 前缀。
     *
     * @return JDBC URL 前缀
     */
    public String jdbcUrlPrefix() {
        return jdbcUrlPrefix;
    }

    /**
     * 返回不包含版本号的 Maven 坐标。
     *
     * @return 公开 Maven 坐标；厂商驱动未提供公开坐标时为空
     */
    public Optional<String> mavenCoordinate() {
        return Optional.ofNullable(mavenCoordinate);
    }
}
