/*
 * 实体元数据模块
 * 提供 JPA 风格的实体映射定义
 */

package tybb2026::tycj_orm

import std.collection.*

/*
 * 实体基类标记
 * 用于标记类为数据库实体
 */
public abstract class Entity {}

/*
 * 表名注解
 * 用于指定实体对应的数据库表名
 */
public abstract class Table {
    public let name: String

    public init(name!: String = "") {
        this.name = name
    }
}

/*
 * 主键标记
 * 用于标记实体类的主键字段
 */
public abstract class Id {}

/*
 * 列映射注解
 * 用于指定字段对应的数据库列名
 */
public abstract class Column {
    public let name: String

    public init(name!: String = "") {
        this.name = name
    }
}

/*
 * 非持久化标记
 * 标记该字段不映射到数据库列
 */
public abstract class Transient {}

/*
 * 实体元数据类
 * 存储实体的映射信息
 */
public class EntityMetadata {
    /* 表名 */
    public var tableName: String
    /* 字段映射表:字段名 -> 列名 */
    public var fieldMappings: HashMap<String, String>
    /* 主键字段名 */
    public var idField: String

    public init(tableName!: String = "") {
        this.tableName = tableName
        this.fieldMappings = HashMap<String, String>()
        this.idField = ""
    }

    /*
     * 添加字段映射
     * @param fieldName 字段名
     * @param columnName 列名
     * @return 当前对象,支持链式调用
     */
    public func addFieldMapping(fieldName: String, columnName: String): EntityMetadata {
        fieldMappings[fieldName] = columnName
        return this
    }

    /*
     * 获取列名
     * @param fieldName 字段名
     * @return 列名选项
     */
    public func getColumnName(fieldName: String): Option<String> {
        return fieldMappings.get(fieldName)
    }

    /*
     * 获取所有字段名
     * @return 字段名列表
     */
    public func getFieldNames(): ArrayList<String> {
        let result = ArrayList<String>()
        for ((key, _) in fieldMappings) {
            result.add(key)
        }
        return result
    }

    /*
     * 获取所有列名
     * @return 列名列表
     */
    public func getColumnNames(): ArrayList<String> {
        let result = ArrayList<String>()
        for ((_, value) in fieldMappings) {
            result.add(value)
        }
        return result
    }
}