use sea_orm_migration::prelude::*;

/// 修复 dead_letter_events 表名不一致（backport 自 io_erp m20260614_000197）。
///
/// 历史迁移 m20260428_000091 的 enum 名为 `DeadLetterEvent`（单数），DeriveIden
/// 派生时 Table 变体取 enum 名的蛇形 → 实际创建的表是 `dead_letter_event`（单数）。
/// 但 erp-core entity `dead_letter_event.rs` 的 `table_name = "dead_letter_events"`
/// （复数），导致 consume_with_retry 的 insert_dead_letter 查询「关系 dead_letter_events
/// 不存在」，dead-letter 兜底功能自基座以来从未生效。
///
/// 本迁移将表 rename 为复数形式，与 entity 对齐。生产库若已存在单数表则 rename，
/// 若不存在（新建库，091 迁移刚建的单数表）同样 rename。
#[derive(DeriveMigrationName)]
pub struct Migration;

#[async_trait::async_trait]
impl MigrationTrait for Migration {
    async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
        // 先确认当前表名（单数存在 / 复数已存在 / 都不存在）
        let singular_exists = manager
            .has_table("dead_letter_event")
            .await
            .unwrap_or(false);
        let plural_exists = manager
            .has_table("dead_letter_events")
            .await
            .unwrap_or(false);

        if singular_exists && !plural_exists {
            // 标准情况：091 迁移建了单数表，rename 为复数
            manager
                .get_connection()
                .execute_unprepared("ALTER TABLE \"dead_letter_event\" RENAME TO \"dead_letter_events\"")
                .await?;
        }
        // 若 plural_exists：已修复（幂等，no-op）
        // 若都不存在：091 迁移未跑或被回滚，无需处理
        Ok(())
    }

    async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
        // 回滚为单数（恢复 091 迁移的原始错误表名）
        let plural_exists = manager
            .has_table("dead_letter_events")
            .await
            .unwrap_or(false);
        let singular_exists = manager
            .has_table("dead_letter_event")
            .await
            .unwrap_or(false);
        if plural_exists && !singular_exists {
            manager
                .get_connection()
                .execute_unprepared("ALTER TABLE \"dead_letter_events\" RENAME TO \"dead_letter_event\"")
                .await?;
        }
        Ok(())
    }
}
