package com.malk.guangming.config;

import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy;
import org.springframework.stereotype.Component;

/**
 * 映射表表名后缀策略:仅对 t_dingtalk_app_mapping 追加可配置后缀(测试环境 _test),
 * 其余表沿用 Spring 默认 snake_case 命名,零副作用。
 *
 * <p>JPA {@code @Table(name=...)} 是编译期常量,无法用 ${} 占位;Spring Boot 会自动采用
 * 上下文里 {@link SpringPhysicalNamingStrategy} 类型的 bean 替换默认策略,
 * 继承它即保留所有列名/其他表的命名转换行为,只在此处对基表名追加后缀。
 *
 * <p>后缀来源:yaml {@code guangming.mapping.table-suffix}(dev/prod 不配置 = 空 = 走原表)。
 */
@Component
public class MappingTableNamingStrategy extends SpringPhysicalNamingStrategy {

    /** 受控基表名;仅此表参与后缀改名 */
    private static final String BASE = "t_dingtalk_app_mapping";

    @Value("${guangming.mapping.table-suffix:}")
    private String tableSuffix;

    @Override
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment ctx) {
        Identifier physical = super.toPhysicalTableName(name, ctx);
        // fixme: 仅精确匹配基表名追加后缀,避免误伤其他表;后缀空则原样返回(dev/prod 行为不变)
        if (physical != null && BASE.equals(physical.getText())
                && tableSuffix != null && !tableSuffix.isEmpty()) {
            return Identifier.toIdentifier(BASE + tableSuffix, physical.isQuoted());
        }
        return physical;
    }
}
