/*
 * query.cj - 完整查询构建器模块
 *
 * 提供链式 SQL 查询构建功能:
 * - SELECT 查询(支持 JOIN、子查询、分组、排序)
 * - INSERT 语句
 * - UPDATE 语句
 * - DELETE 语句
 * - 条件构建器
 * - SQL 注入防护
 *
 * 设计参考 MyBatis-Plus 和 jOOQ。
 */

package tybb2026::tycj_orm

import std.collection.*

// ============================================================================
// SQL 类型枚举
// ============================================================================

public enum SqlType {
    | Select
    | Insert
    | Update
    | Delete
}

// ============================================================================
// 排序方向枚举
// ============================================================================

public enum Direction {
    | Asc
    | Desc
}

// ============================================================================
// JOIN 类型枚举
// ============================================================================

public enum JoinType {
    | Inner
    | Left
    | Right
    | Full
    | Cross
}

// ============================================================================
// 排序规则类
// ============================================================================

public class Order {
    public var property: String
    public var direction: Direction

    public init(property!: String = "", direction!: Direction = Direction.Asc) {
        this.property = property
        this.direction = direction
    }
}

// ============================================================================
// JOIN 子句
// ============================================================================

public class JoinClause {
    public var joinType: JoinType = JoinType.Inner
    public var table: String = ""
    public var alias: String = ""
    public var onCondition: String = ""
    
    public init() {}
    
    public init(joinType: JoinType, table: String, alias: String, onCondition: String) {
        this.joinType = joinType
        this.table = table
        this.alias = alias
        this.onCondition = onCondition
    }
    
    public func toSql(): String {
        let joinKeyword = match (joinType) {
            case JoinType.Inner => "INNER JOIN"
            case JoinType.Left => "LEFT JOIN"
            case JoinType.Right => "RIGHT JOIN"
            case JoinType.Full => "FULL JOIN"
            case JoinType.Cross => "CROSS JOIN"
        }
        
        let tablePart = if (alias.isEmpty()) { table } else { "${table} AS ${alias}" }
        let onPart = if (onCondition.isEmpty()) { "" } else { " ON ${onCondition}" }
        
        "${joinKeyword} ${tablePart}${onPart}"
    }
}

// ============================================================================
// 条件构建器
// ============================================================================

/**
 * ConditionBuilder - 条件构建器
 *
 * 用于构建复杂的 WHERE 条件。
 */
public class ConditionBuilder {
    private var conditions: ArrayList<String> = ArrayList<String>()
    private var parameters: ArrayList<String> = ArrayList<String>()
    
    public init() {}
    
    // 添加条件
    public func add(condition: String): ConditionBuilder {
        conditions.add(condition)
        return this
    }
    
    // 等于条件
    public func eq(column: String, value: String): ConditionBuilder {
        conditions.add("${column} = ?")
        parameters.add(value)
        return this
    }
    
    // 不等于条件
    public func ne(column: String, value: String): ConditionBuilder {
        conditions.add("${column} <> ?")
        parameters.add(value)
        return this
    }
    
    // 大于条件
    public func gt(column: String, value: String): ConditionBuilder {
        conditions.add("${column} > ?")
        parameters.add(value)
        return this
    }
    
    // 大于等于条件
    public func ge(column: String, value: String): ConditionBuilder {
        conditions.add("${column} >= ?")
        parameters.add(value)
        return this
    }
    
    // 小于条件
    public func lt(column: String, value: String): ConditionBuilder {
        conditions.add("${column} < ?")
        parameters.add(value)
        return this
    }
    
    // 小于等于条件
    public func le(column: String, value: String): ConditionBuilder {
        conditions.add("${column} <= ?")
        parameters.add(value)
        return this
    }
    
    // LIKE 条件(自动转义通配符)
    public func like(column: String, value: String): ConditionBuilder {
        conditions.add("${column} LIKE ?")
        parameters.add("%${escapeLikePattern(value)}%")
        return this
    }

    // 转义 LIKE 模式中的通配符
    private func escapeLikePattern(value: String): String {
        var result = ""
        for (i in 0..value.size) {
            let c = value[i]
            // 转义 % _ [ ] 等特殊字符
            if (c == 37u8 || c == 95u8 || c == 91u8 || c == 93u8) { // % _ [ ]
                result = result + "\\" + String.fromUtf8([c])
            } else {
                result = result + String.fromUtf8([c])
            }
        }
        result
    }
    
    // LIKE 左模糊
    public func likeLeft(column: String, value: String): ConditionBuilder {
        conditions.add("${column} LIKE ?")
        parameters.add("%${escapeLikePattern(value)}")
        return this
    }

    // LIKE 右模糊
    public func likeRight(column: String, value: String): ConditionBuilder {
        conditions.add("${column} LIKE ?")
        parameters.add("${escapeLikePattern(value)}%")
        return this
    }
    
    // IS NULL 条件
    public func isNull(column: String): ConditionBuilder {
        conditions.add("${column} IS NULL")
        return this
    }
    
    // IS NOT NULL 条件
    public func isNotNull(column: String): ConditionBuilder {
        conditions.add("${column} IS NOT NULL")
        return this
    }
    
    // IN 条件(限制最大参数数量防止SQL过长)
    public func isIn(column: String, values: ArrayList<String>): ConditionBuilder {
        // 限制IN子句最大参数数量为1000(大多数数据库的限制)
        let maxInParams = 1000
        if (values.size > maxInParams) {
            throw IllegalArgumentException("IN子句参数数量超过最大限制 ${maxInParams}")
        }
        if (values.isEmpty()) {
            // 空列表时添加永假条件
            conditions.add("1=0")
            return this
        }
        let placeholders = ArrayList<String>()
        for (v in values) {
            placeholders.add("?")
            parameters.add(v)
        }
        conditions.add("${column} IN (${joinStrings(placeholders, ", ")})")
        return this
    }

    // NOT IN 条件(限制最大参数数量防止SQL过长)
    public func isNotIn(column: String, values: ArrayList<String>): ConditionBuilder {
        let maxInParams = 1000
        if (values.size > maxInParams) {
            throw IllegalArgumentException("NOT IN子句参数数量超过最大限制 ${maxInParams}")
        }
        if (values.isEmpty()) {
            // 空列表时添加永真条件
            conditions.add("1=1")
            return this
        }
        let placeholders = ArrayList<String>()
        for (v in values) {
            placeholders.add("?")
            parameters.add(v)
        }
        conditions.add("${column} NOT IN (${joinStrings(placeholders, ", ")})")
        return this
    }
    
    // BETWEEN 条件
    public func between(column: String, value1: String, value2: String): ConditionBuilder {
        conditions.add("${column} BETWEEN ? AND ?")
        parameters.add(value1)
        parameters.add(value2)
        return this
    }
    
    // 构建条件字符串
    public func build(): String {
        if (conditions.isEmpty()) {
            return ""
        }
        joinStrings(conditions, " AND ")
    }
    
    // 获取参数
    public func getParameters(): ArrayList<String> {
        parameters
    }
    
    // 清空
    public func clear(): Unit {
        conditions.clear()
        parameters.clear()
    }
    
    // 辅助函数:连接字符串列表
    private func joinStrings(list: ArrayList<String>, separator: String): String {
        if (list.isEmpty()) {
            return ""
        }
        let sb = StringBuilder()
        for (i in 0..list.size) {
            if (i > 0) {
                sb.append(separator)
            }
            sb.append(list[i])
        }
        sb.toString()
    }
}

// ============================================================================
// 子查询构建器
// ============================================================================

/**
 * SubQueryBuilder - 子查询构建器
 * 用于构建嵌套在主查询中的子查询
 */
public class SubQueryBuilder {
    private var selectBuilder: SelectBuilder
    private var alias: String = ""

    public init(alias!: String = "sub") {
        this.selectBuilder = SelectBuilder()
        this.alias = alias
    }

    // 设置子查询别名
    public func setAlias(alias: String): SubQueryBuilder {
        this.alias = alias
        return this
    }

    // 获取内部 SELECT 构建器
    public func getSelectBuilder(): SelectBuilder {
        return selectBuilder
    }

    // 构建子查询 SQL(带别名)
    public func build(): String {
        let sql = selectBuilder.build()
        return "(${sql}) AS ${alias}"
    }

    // 构建子查询 SQL(不带别名,用于 IN 子句)
    public func buildWithoutAlias(): String {
        let sql = selectBuilder.build()
        return "(${sql})"
    }
}

// ============================================================================
// UNION 查询构建器
// ============================================================================

/**
 * UnionBuilder - UNION 查询构建器
 * 用于合并多个 SELECT 查询结果
 */
public class UnionBuilder {
    private var selectBuilders: ArrayList<SelectBuilder> = ArrayList<SelectBuilder>()
    private var isUnionAll: Bool = false
    private var orders: ArrayList<Order> = ArrayList<Order>()
    private var limitValue: Int64 = -1
    private var offsetValue: Int64 = -1

    public init() {}

    // 添加 SELECT 查询
    public func addSelect(builder: SelectBuilder): UnionBuilder {
        selectBuilders.add(builder)
        return this
    }

    // 设置 UNION ALL(保留重复行)
    public func unionAll(): UnionBuilder {
        this.isUnionAll = true
        return this
    }

    // 设置 UNION(去除重复行)
    public func unionDistinct(): UnionBuilder {
        this.isUnionAll = false
        return this
    }

    // ORDER BY
    public func orderBy(property: String, direction!: Direction = Direction.Asc): UnionBuilder {
        orders.add(Order(property: property, direction: direction))
        return this
    }

    // LIMIT
    public func limit(count: Int64): UnionBuilder {
        this.limitValue = count
        return this
    }

    // OFFSET
    public func offset(count: Int64): UnionBuilder {
        this.offsetValue = count
        return this
    }

    // 构建 SQL
    public func build(): String {
        if (selectBuilders.isEmpty()) {
            throw IllegalArgumentException("UNION 查询至少需要一个 SELECT 查询")
        }

        let sb = StringBuilder()
        let unionKeyword = if (isUnionAll) { " UNION ALL " } else { " UNION " }

        for (i in 0..selectBuilders.size) {
            if (i > 0) {
                sb.append(unionKeyword)
            }
            sb.append(selectBuilders[i].build())
        }

        // ORDER BY 子句
        if (!orders.isEmpty()) {
            sb.append(" ORDER BY ")
            for (i in 0..orders.size) {
                if (i > 0) {
                    sb.append(", ")
                }
                let order = orders[i]
                sb.append(order.property)
                sb.append(" ")
                match (order.direction) {
                    case Direction.Asc => sb.append("ASC")
                    case Direction.Desc => sb.append("DESC")
                }
            }
        }

        // LIMIT 和 OFFSET
        if (limitValue >= 0) {
            sb.append(" LIMIT ")
            sb.append(limitValue.toString())
        }
        if (offsetValue >= 0) {
            sb.append(" OFFSET ")
            sb.append(offsetValue.toString())
        }

        sb.toString()
    }

    // 获取所有参数
    public func getParameters(): ArrayList<String> {
        let allParams = ArrayList<String>()
        for (builder in selectBuilders) {
            for (param in builder.getParameters()) {
                allParams.add(param)
            }
        }
        allParams
    }
}

// ============================================================================
// 批量插入构建器
// ============================================================================

/**
 * BatchInsertBuilder - 批量插入构建器
 * 用于构建批量 INSERT 语句
 */
public class BatchInsertBuilder {
    private var tableName: String = ""
    private var insertColumns: ArrayList<String> = ArrayList<String>()
    private var batchValues: ArrayList<ArrayList<String>> = ArrayList<ArrayList<String>>()
    private var parameters: ArrayList<String> = ArrayList<String>()

    public init() {}

    public init(tableName: String) {
        this.tableName = tableName
    }

    // 设置表名
    public func into(table: String): BatchInsertBuilder {
        this.tableName = table
        return this
    }

    // 设置列名
    public func columns(cols: ArrayList<String>): BatchInsertBuilder {
        this.insertColumns = cols
        return this
    }

    // 添加单行数据
    public func addRow(values: ArrayList<String>): BatchInsertBuilder {
        batchValues.add(values)
        for (v in values) {
            parameters.add(v)
        }
        return this
    }

    // 批量添加多行数据
    public func addRows(rows: ArrayList<ArrayList<String>>): BatchInsertBuilder {
        for (row in rows) {
            addRow(row)
        }
        return this
    }

    // 构建 SQL
    public func build(): String {
        if (insertColumns.isEmpty()) {
            throw IllegalArgumentException("批量插入必须指定列名")
        }
        if (batchValues.isEmpty()) {
            throw IllegalArgumentException("批量插入必须至少有一行数据")
        }

        let sb = StringBuilder()

        sb.append("INSERT INTO ")
        sb.append(tableName)
        sb.append(" (")
        sb.append(joinStrings(insertColumns, ", "))
        sb.append(") VALUES ")

        // 构建多行 VALUES
        for (i in 0..batchValues.size) {
            if (i > 0) {
                sb.append(", ")
            }
            sb.append("(")
            let row = batchValues[i]
            let placeholders = ArrayList<String>()
            for (_ in row) {
                placeholders.add("?")
            }
            sb.append(joinStrings(placeholders, ", "))
            sb.append(")")
        }

        sb.toString()
    }

    // 获取参数
    public func getParameters(): ArrayList<String> {
        parameters
    }

    // 获取行数
    public func getRowCount(): Int64 {
        batchValues.size
    }

    private func joinStrings(list: ArrayList<String>, separator: String): String {
        if (list.isEmpty()) {
            return ""
        }
        let sb = StringBuilder()
        for (i in 0..list.size) {
            if (i > 0) {
                sb.append(separator)
            }
            sb.append(list[i])
        }
        sb.toString()
    }
}

// ============================================================================
// 扩展 SelectBuilder 支持子查询
// ============================================================================

/**
 * SelectBuilder 扩展方法
 * 在原有 SelectBuilder 类中添加子查询支持
 */

// 扩展 SelectBuilder 类添加子查询相关方法
public class SelectBuilderExt {
    // 子查询作为表
    public static func fromSubQuery(builder: SelectBuilder, alias: String): String {
        let subSql = builder.build()
        return "(${subSql}) AS ${alias}"
    }

    // 子查询作为列
    public static func columnSubQuery(builder: SelectBuilder, alias: String): String {
        let subSql = builder.build()
        return "(${subSql}) AS ${alias}"
    }

    // 子查询用于 IN 条件
    public static func inSubQuery(column: String, builder: SelectBuilder): String {
        let subSql = builder.build()
        return "${column} IN (${subSql})"
    }

    // 子查询用于 EXISTS 条件
    public static func existsSubQuery(builder: SelectBuilder): String {
        let subSql = builder.build()
        return "EXISTS (${subSql})"
    }

    // 子查询用于 NOT EXISTS 条件
    public static func notExistsSubQuery(builder: SelectBuilder): String {
        let subSql = builder.build()
        return "NOT EXISTS (${subSql})"
    }
}

// ============================================================================
// 扩展 ConditionBuilder 支持子查询
// ============================================================================

/**
 * ConditionBuilder 子查询扩展
 */
public class ConditionBuilderExt {
    // IN 子查询
    public static func inSubQuery(column: String, subBuilder: SelectBuilder): String {
        let subSql = subBuilder.build()
        return "${column} IN (${subSql})"
    }

    // NOT IN 子查询
    public static func notInSubQuery(column: String, subBuilder: SelectBuilder): String {
        let subSql = subBuilder.build()
        return "${column} NOT IN (${subSql})"
    }

    // EXISTS 子查询
    public static func existsSubQuery(subBuilder: SelectBuilder): String {
        let subSql = subBuilder.build()
        return "EXISTS (${subSql})"
    }

    // NOT EXISTS 子查询
    public static func notExistsSubQuery(subBuilder: SelectBuilder): String {
        let subSql = subBuilder.build()
        return "NOT EXISTS (${subSql})"
    }

    // 比较子查询(=, >, <, >=, <=)
    public static func compareSubQuery(column: String, operator_: String, subBuilder: SelectBuilder): String {
        let subSql = subBuilder.build()
        return "${column} ${operator_} (${subSql})"
    }
}

// ============================================================================
// SELECT 查询构建器
// ============================================================================

/**
 * SelectBuilder - SELECT 查询构建器
 */
public class SelectBuilder {
    private var tableName: String = ""
    private var tableAlias: String = ""
    private var selectColumns: ArrayList<String> = ArrayList<String>()
    private var joins: ArrayList<JoinClause> = ArrayList<JoinClause>()
    private var whereClause: String = ""
    private var conditionBuilder: ConditionBuilder = ConditionBuilder()
    private var groupByColumns: ArrayList<String> = ArrayList<String>()
    private var havingCondition: String = ""
    private var orders: ArrayList<Order> = ArrayList<Order>()
    private var limitValue: Int64 = -1
    private var offsetValue: Int64 = -1
    private var isDistinct: Bool = false
    private var isForUpdate: Bool = false
    
    public init() {}
    
    public init(tableName: String) {
        this.tableName = tableName
    }
    
    // 设置表名
    public func from(table: String): SelectBuilder {
        this.tableName = table
        return this
    }
    
    // 设置表别名
    public func alias(alias: String): SelectBuilder {
        this.tableAlias = alias
        return this
    }
    
    // 设置查询字段
    public func select(columns: ArrayList<String>): SelectBuilder {
        this.selectColumns = columns
        return this
    }
    
    // 添加单个字段
    public func column(col: String): SelectBuilder {
        this.selectColumns.add(col)
        return this
    }
    
    // 设置 DISTINCT
    public func distinct(): SelectBuilder {
        this.isDistinct = true
        return this
    }
    
    // WHERE 条件
    public func where_(condition: String): SelectBuilder {
        this.whereClause = condition
        return this
    }
    
    // 使用条件构建器
    public func setWhereCondition(builder: ConditionBuilder): SelectBuilder {
        this.conditionBuilder = builder
        return this
    }
    
    // INNER JOIN
    public func innerJoin(table: String, alias: String, onCondition: String): SelectBuilder {
        joins.add(JoinClause(JoinType.Inner, table, alias, onCondition))
        return this
    }
    
    // LEFT JOIN
    public func leftJoin(table: String, alias: String, onCondition: String): SelectBuilder {
        joins.add(JoinClause(JoinType.Left, table, alias, onCondition))
        return this
    }
    
    // RIGHT JOIN
    public func rightJoin(table: String, alias: String, onCondition: String): SelectBuilder {
        joins.add(JoinClause(JoinType.Right, table, alias, onCondition))
        return this
    }
    
    // GROUP BY
    public func groupBy(columns: ArrayList<String>): SelectBuilder {
        this.groupByColumns = columns
        return this
    }
    
    // HAVING
    public func having(condition: String): SelectBuilder {
        this.havingCondition = condition
        return this
    }
    
    // ORDER BY
    public func orderBy(property: String, direction!: Direction = Direction.Asc): SelectBuilder {
        orders.add(Order(property: property, direction: direction))
        return this
    }
    
    // LIMIT
    public func limit(count: Int64): SelectBuilder {
        this.limitValue = count
        return this
    }
    
    // OFFSET
    public func offset(count: Int64): SelectBuilder {
        this.offsetValue = count
        return this
    }
    
    // FOR UPDATE
    public func setForUpdate(): SelectBuilder {
        this.isForUpdate = true
        return this
    }
    
    // 构建 SQL
    public func build(): String {
        let sb = StringBuilder()
        
        // SELECT 子句
        sb.append("SELECT ")
        if (isDistinct) {
            sb.append("DISTINCT ")
        }
        if (selectColumns.isEmpty()) {
            sb.append("*")
        } else {
            sb.append(joinStrings(selectColumns, ", "))
        }
        
        // FROM 子句
        sb.append(" FROM ")
        sb.append(tableName)
        if (!tableAlias.isEmpty()) {
            sb.append(" AS ")
            sb.append(tableAlias)
        }
        
        // JOIN 子句
        for (join in joins) {
            sb.append(" ")
            sb.append(join.toSql())
        }
        
        // WHERE 子句
        let finalWhere = if (!whereClause.isEmpty()) {
            whereClause
        } else {
            conditionBuilder.build()
        }
        if (!finalWhere.isEmpty()) {
            sb.append(" WHERE ")
            sb.append(finalWhere)
        }
        
        // GROUP BY 子句
        if (!groupByColumns.isEmpty()) {
            sb.append(" GROUP BY ")
            sb.append(joinStrings(groupByColumns, ", "))
        }
        
        // HAVING 子句
        if (!havingCondition.isEmpty()) {
            sb.append(" HAVING ")
            sb.append(havingCondition)
        }
        
        // ORDER BY 子句
        if (!orders.isEmpty()) {
            sb.append(" ORDER BY ")
            for (i in 0..orders.size) {
                if (i > 0) {
                    sb.append(", ")
                }
                let order = orders[i]
                sb.append(order.property)
                sb.append(" ")
                match (order.direction) {
                    case Direction.Asc => sb.append("ASC")
                    case Direction.Desc => sb.append("DESC")
                }
            }
        }
        
        // LIMIT 和 OFFSET
        if (limitValue >= 0) {
            sb.append(" LIMIT ")
            sb.append(limitValue.toString())
        }
        if (offsetValue >= 0) {
            sb.append(" OFFSET ")
            sb.append(offsetValue.toString())
        }
        
        // FOR UPDATE
        if (isForUpdate) {
            sb.append(" FOR UPDATE")
        }
        
        sb.toString()
    }
    
    // 获取参数
    public func getParameters(): ArrayList<String> {
        conditionBuilder.getParameters()
    }
    
    // 辅助函数
    private func joinStrings(list: ArrayList<String>, separator: String): String {
        if (list.isEmpty()) {
            return ""
        }
        let sb = StringBuilder()
        for (i in 0..list.size) {
            if (i > 0) {
                sb.append(separator)
            }
            sb.append(list[i])
        }
        sb.toString()
    }
}

// ============================================================================
// INSERT 构建器
// ============================================================================

/**
 * InsertBuilder - INSERT 语句构建器
 */
public class InsertBuilder {
    private var tableName: String = ""
    private var insertColumns: ArrayList<String> = ArrayList<String>()
    private var insertValues: ArrayList<String> = ArrayList<String>()
    private var parameters: ArrayList<String> = ArrayList<String>()
    
    public init() {}
    
    public init(tableName: String) {
        this.tableName = tableName
    }
    
    // 设置表名
    public func into(table: String): InsertBuilder {
        this.tableName = table
        return this
    }
    
    // 添加列和值
    public func value(column: String, val: String): InsertBuilder {
        insertColumns.add(column)
        insertValues.add("?")
        parameters.add(val)
        return this
    }
    
    // 批量添加列
    public func setColumns(cols: ArrayList<String>): InsertBuilder {
        this.insertColumns = cols
        return this
    }
    
    // 批量添加值
    public func setValues(vals: ArrayList<String>): InsertBuilder {
        for (v in vals) {
            insertValues.add("?")
            parameters.add(v)
        }
        return this
    }
    
    // 构建 SQL
    public func build(): String {
        let sb = StringBuilder()
        
        sb.append("INSERT INTO ")
        sb.append(tableName)
        sb.append(" (")
        sb.append(joinStrings(insertColumns, ", "))
        sb.append(") VALUES (")
        sb.append(joinStrings(insertValues, ", "))
        sb.append(")")
        
        sb.toString()
    }
    
    // 获取参数
    public func getParameters(): ArrayList<String> {
        parameters
    }
    
    private func joinStrings(list: ArrayList<String>, separator: String): String {
        if (list.isEmpty()) {
            return ""
        }
        let sb = StringBuilder()
        for (i in 0..list.size) {
            if (i > 0) {
                sb.append(separator)
            }
            sb.append(list[i])
        }
        sb.toString()
    }
}

// ============================================================================
// UPDATE 构建器
// ============================================================================

/**
 * UpdateBuilder - UPDATE 语句构建器
 */
public class UpdateBuilder {
    private var tableName: String = ""
    private var setClauses: ArrayList<String> = ArrayList<String>()
    private var parameters: ArrayList<String> = ArrayList<String>()
    private var whereClause: String = ""
    private var conditionBuilder: ConditionBuilder = ConditionBuilder()
    
    public init() {}
    
    public init(tableName: String) {
        this.tableName = tableName
    }
    
    // 设置表名
    public func table(name: String): UpdateBuilder {
        this.tableName = name
        return this
    }
    
    // SET 子句
    public func set(column: String, value: String): UpdateBuilder {
        setClauses.add("${column} = ?")
        parameters.add(value)
        return this
    }
    
    // SET 表达式
    public func setExpr(column: String, expr: String): UpdateBuilder {
        setClauses.add("${column} = ${expr}")
        return this
    }
    
    // WHERE 条件
    public func where_(condition: String): UpdateBuilder {
        this.whereClause = condition
        return this
    }
    
    // 使用条件构建器
    public func setWhereCondition(builder: ConditionBuilder): UpdateBuilder {
        this.conditionBuilder = builder
        return this
    }
    
    // 构建 SQL
    public func build(): String {
        let sb = StringBuilder()
        
        sb.append("UPDATE ")
        sb.append(tableName)
        sb.append(" SET ")
        sb.append(joinStrings(setClauses, ", "))
        
        // WHERE 子句
        let finalWhere = if (!whereClause.isEmpty()) {
            whereClause
        } else {
            conditionBuilder.build()
        }
        if (!finalWhere.isEmpty()) {
            sb.append(" WHERE ")
            sb.append(finalWhere)
        }
        
        sb.toString()
    }
    
    // 获取参数
    public func getParameters(): ArrayList<String> {
        let allParams = ArrayList<String>()
        for (p in parameters) {
            allParams.add(p)
        }
        for (p in conditionBuilder.getParameters()) {
            allParams.add(p)
        }
        allParams
    }
    
    private func joinStrings(list: ArrayList<String>, separator: String): String {
        if (list.isEmpty()) {
            return ""
        }
        let sb = StringBuilder()
        for (i in 0..list.size) {
            if (i > 0) {
                sb.append(separator)
            }
            sb.append(list[i])
        }
        sb.toString()
    }
}

// ============================================================================
// DELETE 构建器
// ============================================================================

/**
 * DeleteBuilder - DELETE 语句构建器
 */
public class DeleteBuilder {
    private var tableName: String = ""
    private var whereClause: String = ""
    private var conditionBuilder: ConditionBuilder = ConditionBuilder()
    
    public init() {}
    
    public init(tableName: String) {
        this.tableName = tableName
    }
    
    // 设置表名
    public func from(table: String): DeleteBuilder {
        this.tableName = table
        return this
    }
    
    // WHERE 条件
    public func where_(condition: String): DeleteBuilder {
        this.whereClause = condition
        return this
    }
    
    // 使用条件构建器
    public func setWhereCondition(builder: ConditionBuilder): DeleteBuilder {
        this.conditionBuilder = builder
        return this
    }
    
    // 构建 SQL
    public func build(): String {
        let sb = StringBuilder()
        
        sb.append("DELETE FROM ")
        sb.append(tableName)
        
        // WHERE 子句
        let finalWhere = if (!whereClause.isEmpty()) {
            whereClause
        } else {
            conditionBuilder.build()
        }
        
        // 安全检查:禁止无条件删除
        if (finalWhere.isEmpty()) {
            throw IllegalArgumentException("DELETE 操作必须指定 WHERE 条件,禁止删除表中所有数据")
        }
        
        sb.append(" WHERE ")
        sb.append(finalWhere)
        
        sb.toString()
    }
    
    // 获取参数
    public func getParameters(): ArrayList<String> {
        conditionBuilder.getParameters()
    }
}

// ============================================================================
// SQL 构建器工厂
// ============================================================================

/**
 * SqlBuilder - SQL 构建器工厂
 */
public class SqlBuilder {
    // 创建 SELECT 构建器
    public static func select(columns: ArrayList<String>): SelectBuilder {
        let builder = SelectBuilder()
        builder.select(columns)
        builder
    }
    
    // 创建 SELECT 构建器(指定表)
    public static func selectFrom(table: String): SelectBuilder {
        SelectBuilder(table)
    }
    
    // 创建 INSERT 构建器
    public static func insert(table: String): InsertBuilder {
        InsertBuilder(table)
    }
    
    // 创建 UPDATE 构建器
    public static func update(table: String): UpdateBuilder {
        UpdateBuilder(table)
    }
    
    // 创建 DELETE 构建器
    public static func deleteFrom(table: String): DeleteBuilder {
        DeleteBuilder(table)
    }
    
    // 创建条件构建器
    public static func conditions(): ConditionBuilder {
        ConditionBuilder()
    }
}

// ============================================================================
// 兼容旧版 QueryBuilder
// ============================================================================

/**
 * QueryBuilder - 兼容旧版查询构建器
 */
public class QueryBuilder {
    private var tableName: String = ""
    private var queryColumns: ArrayList<String> = ArrayList<String>()
    private var whereClause: String = ""
    private var orders: ArrayList<Order> = ArrayList<Order>()
    private var limitValue: Int64 = -1
    private var offsetValue: Int64 = -1

    public init(tableName!: String = "") {
        this.tableName = tableName
        this.queryColumns = ArrayList<String>()
        this.orders = ArrayList<Order>()
    }

    public func select(columns: ArrayList<String>): QueryBuilder {
        this.queryColumns = columns
        return this
    }

    public func where_(condition: String): QueryBuilder {
        this.whereClause = condition
        return this
    }

    public func orderBy(property: String, direction!: Direction = Direction.Asc): QueryBuilder {
        orders.add(Order(property: property, direction: direction))
        return this
    }

    public func limit(count: Int64): QueryBuilder {
        this.limitValue = count
        return this
    }

    public func offset(count: Int64): QueryBuilder {
        this.offsetValue = count
        return this
    }

    public func build(): String {
        let sb = StringBuilder()

        sb.append("SELECT ")
        if (queryColumns.isEmpty()) {
            sb.append("*")
        } else {
            for (i in 0..queryColumns.size) {
                if (i > 0) {
                    sb.append(", ")
                }
                sb.append(queryColumns[i])
            }
        }

        sb.append(" FROM ")
        sb.append(tableName)

        if (!whereClause.isEmpty()) {
            sb.append(" WHERE ")
            sb.append(whereClause)
        }

        if (!orders.isEmpty()) {
            sb.append(" ORDER BY ")
            for (i in 0..orders.size) {
                if (i > 0) {
                    sb.append(", ")
                }
                let order = orders[i]
                sb.append(order.property)
                sb.append(" ")
                match (order.direction) {
                    case Direction.Asc => sb.append("ASC")
                    case Direction.Desc => sb.append("DESC")
                }
            }
        }

        if (limitValue >= 0) {
            sb.append(" LIMIT ")
            sb.append(limitValue.toString())
        }
        if (offsetValue >= 0) {
            sb.append(" OFFSET ")
            sb.append(offsetValue.toString())
        }

        sb.toString()
    }
}