package com.ttstd.signaling.config;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import jakarta.annotation.PostConstruct;
import javax.sql.DataSource;

import java.sql.Connection;
import java.sql.Statement;

/**
 * 启动期数据库 schema 自愈：清理历史遗留的废弃表。
 *
 * <p>旧版本曾存在独立的 {@code password_history} 表（含外键
 * {@code fk_pwdhist_user} 指向 {@code app_user.user_id}）。当前代码已将其合并为
 * {@code app_user.password_history} 字段，不再使用该表，但其外键会阻止 Hibernate
 * 在 {@code ddl-auto: update} 下对 {@code app_user.user_id} 列做必要迁移，导致启动失败。
 *
 * <p>本组件在 JPA 执行 DDL 之前（仅依赖 DataSource，不依赖任何 JPA 组件）幂等删除该废弃表。
 * 可通过 {@code security.schema.cleanup-enabled=false} 关闭。
 */
@Component
@Order(0)
@ConditionalOnProperty(name = "security.schema.cleanup-enabled", havingValue = "true", matchIfMissing = true)
public class SchemaCleanup {

    private static final Logger logger = LoggerFactory.getLogger(SchemaCleanup.class);

    private final DataSource dataSource;

    public SchemaCleanup(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    @PostConstruct
    public void cleanup() {
        try (Connection conn = dataSource.getConnection();
             Statement stmt = conn.createStatement()) {
            // 仅清理确已废弃、且代码无任何实体/Repository 引用的遗留表
            stmt.execute("DROP TABLE IF EXISTS password_history");
            logger.info("已清理废弃表 password_history（若存在）");
        } catch (Exception e) {
            // 清理失败不应阻断启动；记录告警，留给人工处理
            logger.warn("清理废弃表 password_history 失败（可忽略，手动 DROP 亦可）: {}", e.toString());
        }
    }
}
