package com.easyagents.federation.sql.federation;

import java.io.Serializable;

/**
 * 查询范围内一张逻辑表到物理 Binding 表的不可变映射。
 *
 * @param logicalName 查询方可见的全局唯一逻辑表名
 * @param bindingName 物理数据源 Binding 名称
 * @param schemaName Binding 内的查询逻辑 Schema 名称
 * @param sourceTableName 数据源 Definition 中的实际表名
 */
public record FederationLogicalTableDefinition(
    String logicalName,
    String bindingName,
    String schemaName,
    String sourceTableName
) implements Serializable {

    /**
     * 校验逻辑表映射的必填字段。
     */
    public FederationLogicalTableDefinition {
        requireText(logicalName, "logicalName");
        requireText(bindingName, "bindingName");
        requireText(schemaName, "schemaName");
        requireText(sourceTableName, "sourceTableName");
    }

    /**
     * 创建逻辑表映射。
     *
     * @param logicalName 查询方可见逻辑表名
     * @param bindingName 物理数据源 Binding 名称
     * @param schemaName 查询逻辑 Schema 名称
     * @param sourceTableName 数据源中的实际表名
     * @return 逻辑表映射
     */
    public static FederationLogicalTableDefinition of(
        String logicalName,
        String bindingName,
        String schemaName,
        String sourceTableName
    ) {
        return new FederationLogicalTableDefinition(
            logicalName,
            bindingName,
            schemaName,
            sourceTableName
        );
    }

    /**
     * 校验映射字段包含有效文本。
     *
     * @param value 字段值
     * @param field 字段名称
     * @throws IllegalArgumentException 字段为空时抛出
     */
    private static void requireText(String value, String field) {
        if (value == null || value.isBlank()) {
            throw new IllegalArgumentException(field + " must not be blank");
        }
    }
}
