/*
 * test_pool.cj - 连接池测试
 */

package tybb2026::tycj_orm

import std.unittest.*

// ============================================================================
// 连接池配置测试
// ============================================================================

@test
func testPoolConfig(): Unit {
    let config = PoolConfig()
    config.setMinPoolSize(2)
    config.setMaxPoolSize(10)
    config.setConnectionTimeout(5000)

    assert(config.minPoolSize == 2)
    assert(config.maxPoolSize == 10)
    assert(config.connectionTimeout == 5000)
}

@test
func testConnectionPoolFactory(): Unit {
    let pool = ConnectionPoolFactory.createMockPool()

    assert(pool is ConnectionPool)

    // 测试获取连接
    let connOpt = pool.getConnection()
    assert(connOpt.isSome())

    // 测试归还连接
    match (connOpt) {
        case Some(conn) => pool.returnConnection(conn)
        case None => ()
    }

    pool.close()
}

@test
func testPoolStats(): Unit {
    let pool = ConnectionPoolFactory.createMockPool()

    let active = pool.getActiveConnections()
    let idle = pool.getIdleConnections()
    let total = pool.getTotalConnections()

    assert(active >= 0)
    assert(idle >= 0)
    assert(total == active + idle)

    pool.close()
}

@test
func testPoolHealthCheck(): Unit {
    let pool = ConnectionPoolFactory.createMockPool()
    let checker = ConnectionPoolHealthChecker(pool)

    let health = checker.checkHealth()

    assert(health.healthy || !health.issues.isEmpty())
    assert(health.totalConnections >= 0)

    pool.close()
}

@test
func testConnectionPoolClose(): Unit {
    let pool = ConnectionPoolFactory.createMockPool()

    // 获取一个连接
    let connOpt = pool.getConnection()

    // 关闭连接池
    pool.close()

    // 关闭后应该无法获取新连接
    let connOpt2 = pool.getConnection()
    assert(connOpt2.isNone())
}

// ============================================================================
// 数据库配置测试
// ============================================================================

@test
func testMySqlConfig(): Unit {
    let config = DatabaseConfig.mysql()
    config.host = "localhost"
    config.port = 3306
    config.database = "test"
    config.username = "root"
    config.password = "password"

    assert(config.dbType == DatabaseType.MySql)
    assert(config.port == 3306)

    let url = config.buildUrl()
    assert(url.contains("mysql"))
}

@test
func testSqliteConfig(): Unit {
    let config = DatabaseConfig.sqlite()
    config.database = "test.db"

    assert(config.dbType == DatabaseType.Sqlite)

    let url = config.buildUrl()
    assert(url.contains("sqlite"))
}

// ============================================================================
// Mock 连接测试
// ============================================================================

@test
func testMockConnection(): Unit {
    let conn = MockConnection()

    // 测试创建预编译语句
    let stmt = conn.prepareStatement("SELECT * FROM users")
    assert(stmt is PreparedStatement)

    // 测试事务操作
    conn.commit()
    conn.rollback()

    // 测试关闭
    conn.close()
}

@test
func testMockPreparedStatement(): Unit {
    let stmt = MockPreparedStatement(sql: "SELECT * FROM users WHERE id = ?")

    // 测试设置参数
    stmt.setInt(1, 123)
    stmt.setString(2, "test")
    stmt.setBool(3, true)
    stmt.setFloat(4, 3.14)

    // 测试执行
    let rs = stmt.executeQuery()
    assert(rs is ResultSet)

    let rows = stmt.executeUpdate()
    assert(rows >= 0)

    stmt.close()
}

@test
func testMockResultSet(): Unit {
    let data = ArrayList<HashMap<String, String>>()
    let row = HashMap<String, String>()
    row["id"] = "1"
    row["name"] = "John"
    data.add(row)

    let rs = MockResultSet(data: data)

    assert(rs.next())
    assert(rs.getString("name") == "John")
    assert(rs.getInt("id") == 1)
    assert(!rs.isNull("name"))

    rs.close()
}