/*
 * tycj_orm - 仓颉语言 ORM 框架
 * 版本 1.0.0
 *
 * 功能特性:
 * - 参数化查询:防止 SQL 注入,使用 ? 占位符
 * - 连接池管理:复用数据库连接,提升性能
 * - 多数据源支持:支持主从、读写分离
 * - 事务传播:嵌套事务、事务回滚
 * - AI 增强查询:自然语言转 SQL(NL2SQL)
 * - SQL 方言支持:MySQL、PostgreSQL、SQLite
 * - 实体映射:JPA 风格的实体注解
 * - 查询构建器:链式 API 构建 SQL
 *
 * 模块导出:
 * - ORM 配置:OrmConfig, OrmContext
 * - 数据源:DataSource, DatabaseConfig, Connection, PreparedStatement
 * - 连接池:ConnectionPool, PoolConfig, ConnectionPoolFactory
 * - 查询构建:SqlBuilder, SelectBuilder, InsertBuilder, UpdateBuilder, DeleteBuilder, ConditionBuilder
 * - 实体映射:Entity, Table, Id, Column, EntityMetadata
 * - 事务管理:TransactionManager, TransactionTemplate, TransactionDefinition, IsolationLevel, Propagation
 * - 驱动管理:Driver, DriverManager, Dialect
 */

package tybb2026::tycj_orm

import std.collection.*

/** 模块版本号 */
public let VERSION: String = "1.0.0"

/** 模块名称 */
public let MODULE_NAME: String = "tycj_orm"

// ============================================================================
// ORM 配置类
// ============================================================================

/**
 * ORM 配置类
 * 用于配置 ORM 框架的全局行为
 */
public class OrmConfig {
    /** 是否打印 SQL 语句 */
    public var showSql: Bool = false
    /** 是否格式化 SQL */
    public var formatSql: Bool = false
    /** 数据库方言 */
    public var dialect: String = "mysql"
    /** 连接池最大大小 */
    public var maxPoolSize: Int64 = 10
    /** 连接超时时间(毫秒) */
    public var connectionTimeout: Int64 = 30000
    /** 空闲连接超时时间(毫秒) */
    public var idleTimeout: Int64 = 600000
    /** 是否启用 AI 增强功能 */
    public var aiEnabled: Bool = false

    /**
     * 获取默认配置
     * @return 默认 ORM 配置
     */
    public static func default(): OrmConfig {
        return OrmConfig()
    }

    /**
     * 设置是否打印 SQL
     * @param show 是否打印
     * @return 当前配置对象(链式调用)
     */
    public func setShowSql(show: Bool): OrmConfig {
        this.showSql = show
        return this
    }

    /**
     * 设置是否格式化 SQL
     * @param format 是否格式化
     * @return 当前配置对象(链式调用)
     */
    public func setFormatSql(format: Bool): OrmConfig {
        this.formatSql = format
        return this
    }

    /**
     * 设置数据库方言
     * @param dialect 方言名称(mysql/postgresql/sqlite)
     * @return 当前配置对象(链式调用)
     */
    public func setDialect(dialect: String): OrmConfig {
        this.dialect = dialect
        return this
    }

    /**
     * 设置连接池最大大小
     * @param size 最大连接数
     * @return 当前配置对象(链式调用)
     */
    public func setMaxPoolSize(size: Int64): OrmConfig {
        this.maxPoolSize = size
        return this
    }

    /**
     * 启用 AI 增强功能
     * @return 当前配置对象(链式调用)
     */
    public func enableAi(): OrmConfig {
        this.aiEnabled = true
        return this
    }
}

// ============================================================================
// ORM 上下文
// ============================================================================

/**
 * ORM 上下文类
 * 管理 ORM 框架的全局状态,包括配置和数据源
 */
public class OrmContext {
    private static var config: OrmConfig = OrmConfig.default()
    private static var dataSource: Option<DataSource> = None
    private static var initialized: Bool = false

    /**
     * 初始化 ORM 上下文
     * @param cfg ORM 配置
     */
    public static func initialize(cfg: OrmConfig): Unit {
        config = cfg
        initialized = true
        println("[${MODULE_NAME}] ORM 上下文已初始化")
    }

    /**
     * 设置数据源
     * @param ds 数据源实例
     */
    public static func setDataSource(ds: DataSource): Unit {
        dataSource = Some(ds)
    }

    /**
     * 获取当前数据源
     * @return 数据源选项
     */
    public static func getDataSource(): Option<DataSource> {
        return dataSource
    }

    /**
     * 获取当前配置
     * @return ORM 配置
     */
    public static func getConfig(): OrmConfig {
        return config
    }

    /**
     * 检查是否已初始化
     * @return 是否已初始化
     */
    public static func isInitialized(): Bool {
        return initialized
    }

    /**
     * 重置上下文(主要用于测试)
     */
    public static func reset(): Unit {
        config = OrmConfig.default()
        dataSource = None
        initialized = false
    }
}

// ============================================================================
// 连接池配置
// ============================================================================

/**
 * 连接池配置类
 * 用于配置数据库连接池的参数
 * @deprecated 请使用 PoolConfig 替代
 */
public class ConnectionPoolConfig {
    /** 最大活跃连接数 */
    public var maxActive: Int64 = 10
    /** 最大空闲连接数 */
    public var maxIdle: Int64 = 5
    /** 最小空闲连接数 */
    public var minIdle: Int64 = 1
    /** 最大等待时间(毫秒) */
    public var maxWaitMillis: Int64 = 30000
    /** 连接验证查询 */
    public var validationQuery: String = "SELECT 1"
    /** 借用时验证 */
    public var testOnBorrow: Bool = true
    /** 归还时验证 */
    public var testOnReturn: Bool = false
    /** 空闲时验证 */
    public var testWhileIdle: Bool = true

    /**
     * 获取默认配置
     * @return 默认连接池配置
     */
    public static func default(): ConnectionPoolConfig {
        return ConnectionPoolConfig()
    }

    /**
     * 转换为 PoolConfig
     * @return PoolConfig 实例
     */
    public func toPoolConfig(): PoolConfig {
        let config = PoolConfig()
        config.minPoolSize = this.minIdle
        config.maxPoolSize = this.maxActive
        config.connectionTimeout = this.maxWaitMillis
        config.connectionTestQuery = this.validationQuery
        config
    }
}

// ============================================================================
// AI 增强查询接口
// ============================================================================

/**
 * AI 查询顾问接口
 * 提供自然语言转 SQL、查询解释、索引建议等功能
 */
public interface AiQueryAdvisor {
    /**
     * 将自然语言问题转换为 SQL
     * @param question 自然语言问题
     * @param schema 数据库结构信息
     * @return 生成的 SQL 语句
     */
    func naturalLanguageToSql(question: String, schema: String): String

    /**
     * 解释 SQL 查询
     * @param sql SQL 语句
     * @return 查询解释
     */
    func explainQuery(sql: String): String

    /**
     * 建议索引
     * @param table 表名
     * @param queryPattern 查询模式
     * @return 索引建议 SQL
     */
    func suggestIndex(table: String, queryPattern: String): String
}

/**
 * 默认 AI 查询顾问实现
 * 提供基础的 AI 查询功能(示例实现)
 */
public class DefaultAiQueryAdvisor <: AiQueryAdvisor {
    private var llmClient: Option<Any> = None  // 实际应为 LlmClient

    public init() {}

    public func naturalLanguageToSql(question: String, schema: String): String {
        // AI 增强:将自然语言转换为 SQL
        // 实际实现需要调用 LLM API
        println("[${MODULE_NAME}] AI NL2SQL: question='${question}'")
        return "SELECT * FROM users WHERE 1=0"
    }

    public func explainQuery(sql: String): String {
        println("[${MODULE_NAME}] AI Explain: ${sql}")
        return "Query explanation placeholder"
    }

    public func suggestIndex(table: String, queryPattern: String): String {
        println("[${MODULE_NAME}] AI Index Suggestion: table='${table}'")
        return "CREATE INDEX idx_suggested ON ${table}(id)"
    }
}