/*
 * test_enterprise.cj - 企业级功能测试
 */

package tybb2026::tycj_orm

import std.collection.*
import std.unittest.*

// ============================================================================
// SQL 执行统计测试
// ============================================================================

@test
func testRecordExecution(): Unit {
    let stats = SqlExecutionStats("hash123", "SELECT * FROM users")

    stats.recordExecution(100, 10, 50)
    stats.recordExecution(200, 20, 50)

    assert(stats.executionCount == 2)
    assert(stats.totalRowsAffected == 30)
    assert(stats.maxExecutionTime == 200)
    assert(stats.minExecutionTime == 100)
    assert(stats.avgExecutionTime == 150)
}

@test
func testRecordError(): Unit {
    let stats = SqlExecutionStats("hash123", "SELECT * FROM users")

    stats.recordError()
    stats.recordError()

    assert(stats.errorCount == 2)
}

@test
func testStatsToJson(): Unit {
    let stats = SqlExecutionStats("hash123", "SELECT * FROM users")
    stats.recordExecution(100, 10, 1000)

    let json = stats.toJson()

    assert(json.contains("sqlHash"))
    assert(json.contains("executionCount"))
    assert(json.contains("avgExecutionTime"))
}

// ============================================================================
// 慢查询日志测试
// ============================================================================

@test
func testLogQuery(): Unit {
    let logger = SlowQueryLogger(threshold: 50, maxSize: 10)

    let params = ArrayList<String>()
    params.add("param1")

    // 记录一个慢查询
    logger.logQuery("SELECT * FROM users", 100, params)

    let logs = logger.getLogs()
    assert(logs.size == 1)
    assert(logger.getSlowQueryCount() == 1)
}

@test
func testLogQueryBelowThreshold(): Unit {
    let logger = SlowQueryLogger(threshold: 1000, maxSize: 10)

    let params = ArrayList<String>()
    logger.logQuery("SELECT * FROM users", 50, params)

    // 低于阈值不应该记录
    assert(logger.getSlowQueryCount() == 0)
}

@test
func testClearLogs(): Unit {
    let logger = SlowQueryLogger(threshold: 50, maxSize: 10)

    let params = ArrayList<String>()
    logger.logQuery("SELECT * FROM users", 100, params)

    logger.clear()

    assert(logger.getSlowQueryCount() == 0)
}

@test
func testMaxLogSize(): Unit {
    let logger = SlowQueryLogger(threshold: 1, maxSize: 3)

    let params = ArrayList<String>()
    for (i in 0..5) {
        logger.logQuery("SELECT * FROM users", 100, params)
    }

    // 日志数量应该被限制
    assert(logger.getSlowQueryCount() <= 3)
}

// ============================================================================
// SQL 注入检测测试
// ============================================================================

@test
func testDetectDangerousKeyword(): Unit {
    let detector = SqlInjectionDetector()

    let result = detector.detect("SELECT * FROM users; DROP TABLE users--")
    assert(!result.isEmpty())
}

@test
func testDetectDangerousPattern(): Unit {
    let detector = SqlInjectionDetector()

    let result = detector.detect("SELECT * FROM users -- comment")
    assert(!result.isEmpty())
}

@test
func testSafeSql(): Unit {
    let detector = SqlInjectionDetector()

    let result = detector.detect("SELECT * FROM users WHERE id = 1")
    assert(result.isEmpty())
}

@test
func testValidateParamSafe(): Unit {
    let detector = SqlInjectionDetector()

    assert(detector.validateParam("safe_value"))
    assert(detector.validateParam("123"))
    assert(detector.validateParam(""))
}

@test
func testValidateParamUnsafe(): Unit {
    let detector = SqlInjectionDetector()

    // 包含单引号后跟OR的注入模式
    assert(!detector.validateParam("' OR 1=1--"))
}

// ============================================================================
// SQL 执行监控测试
// ============================================================================

@test
func testStartAndEndMonitoring(): Unit {
    let monitor = SqlExecutionMonitor()
    monitor.setEnableInjectionCheck(false)

    let params = ArrayList<String>()
    let context = monitor.startMonitoring("SELECT * FROM users", params)

    monitor.endMonitoring(context, 10)

    let stats = monitor.getSqlStats()
    assert(stats.size >= 0)
}

@test
func testInjectionCheck(): Unit {
    let monitor = SqlExecutionMonitor()
    monitor.setEnableInjectionCheck(true)

    let params = ArrayList<String>()

    // 尝试注入应该抛出异常
    try {
        monitor.startMonitoring("SELECT * FROM users; DROP TABLE users", params)
        assert(false) // 应该抛出异常
    } catch (_: OrmException) {
        assert(true)
    }
}

@test
func testRecordExecutionError(): Unit {
    let monitor = SqlExecutionMonitor()
    monitor.setEnableInjectionCheck(false)

    monitor.recordExecutionError("SELECT * FROM users")

    let stats = monitor.getSqlStats()
    assert(stats.size >= 0)
}

@test
func testSetThreshold(): Unit {
    let monitor = SqlExecutionMonitor()
    monitor.setSlowQueryThreshold(500)

    // 阈值设置成功即可
    assert(true)
}

// ============================================================================
// ORM 异常测试
// ============================================================================

@test
func testExceptionMessage(): Unit {
    let message = "Test error message"
    try {
        throw OrmException(message)
    } catch (_: OrmException) {
        assert(true)
    }
}