using Jiaowu.Api.Infrastructure.Persistence;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;

#nullable disable

namespace Jiaowu.Api.Infrastructure.Persistence.Migrations.MySql;

[DbContext(typeof(AppDbContext))]
[Migration("20260726170000_CourseSelectionWaitlist")]
public partial class CourseSelectionWaitlist : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.Sql("""
            SET @waitlisted_column_exists = (
                SELECT COUNT(*)
                FROM `INFORMATION_SCHEMA`.`COLUMNS`
                WHERE `TABLE_SCHEMA` = DATABASE()
                  AND `TABLE_NAME` = 'CourseEnrollments'
                  AND `COLUMN_NAME` = 'WaitlistedAt'
            );
            """);
        migrationBuilder.Sql("""
            SET @add_waitlisted_column_sql = IF(
                @waitlisted_column_exists = 0,
                'ALTER TABLE `CourseEnrollments` ADD COLUMN `WaitlistedAt` datetime(6) NULL',
                'SELECT 1'
            );
            """);
        migrationBuilder.Sql(
            "PREPARE add_waitlisted_column_stmt FROM @add_waitlisted_column_sql;");
        migrationBuilder.Sql("EXECUTE add_waitlisted_column_stmt;");
        migrationBuilder.Sql("DEALLOCATE PREPARE add_waitlisted_column_stmt;");

        migrationBuilder.Sql("""
            SET @waitlist_index_exists = (
                SELECT COUNT(*)
                FROM `INFORMATION_SCHEMA`.`STATISTICS`
                WHERE `TABLE_SCHEMA` = DATABASE()
                  AND `TABLE_NAME` = 'CourseEnrollments'
                  AND `INDEX_NAME` = 'IX_CE_Offering_Status_WaitlistedAt'
            );
            """);
        migrationBuilder.Sql("""
            SET @add_waitlist_index_sql = IF(
                @waitlist_index_exists = 0,
                'CREATE INDEX `IX_CE_Offering_Status_WaitlistedAt` ON `CourseEnrollments` (`CourseSelectionOfferingId`, `Status`, `WaitlistedAt`)',
                'SELECT 1'
            );
            """);
        migrationBuilder.Sql(
            "PREPARE add_waitlist_index_stmt FROM @add_waitlist_index_sql;");
        migrationBuilder.Sql("EXECUTE add_waitlist_index_stmt;");
        migrationBuilder.Sql("DEALLOCATE PREPARE add_waitlist_index_stmt;");
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.Sql("""
            SET @waitlist_index_exists = (
                SELECT COUNT(*)
                FROM `INFORMATION_SCHEMA`.`STATISTICS`
                WHERE `TABLE_SCHEMA` = DATABASE()
                  AND `TABLE_NAME` = 'CourseEnrollments'
                  AND `INDEX_NAME` = 'IX_CE_Offering_Status_WaitlistedAt'
            );
            """);
        migrationBuilder.Sql("""
            SET @drop_waitlist_index_sql = IF(
                @waitlist_index_exists > 0,
                'DROP INDEX `IX_CE_Offering_Status_WaitlistedAt` ON `CourseEnrollments`',
                'SELECT 1'
            );
            """);
        migrationBuilder.Sql(
            "PREPARE drop_waitlist_index_stmt FROM @drop_waitlist_index_sql;");
        migrationBuilder.Sql("EXECUTE drop_waitlist_index_stmt;");
        migrationBuilder.Sql("DEALLOCATE PREPARE drop_waitlist_index_stmt;");

        migrationBuilder.Sql("""
            SET @waitlisted_column_exists = (
                SELECT COUNT(*)
                FROM `INFORMATION_SCHEMA`.`COLUMNS`
                WHERE `TABLE_SCHEMA` = DATABASE()
                  AND `TABLE_NAME` = 'CourseEnrollments'
                  AND `COLUMN_NAME` = 'WaitlistedAt'
            );
            """);
        migrationBuilder.Sql("""
            SET @drop_waitlisted_column_sql = IF(
                @waitlisted_column_exists > 0,
                'ALTER TABLE `CourseEnrollments` DROP COLUMN `WaitlistedAt`',
                'SELECT 1'
            );
            """);
        migrationBuilder.Sql(
            "PREPARE drop_waitlisted_column_stmt FROM @drop_waitlisted_column_sql;");
        migrationBuilder.Sql("EXECUTE drop_waitlisted_column_stmt;");
        migrationBuilder.Sql("DEALLOCATE PREPARE drop_waitlisted_column_stmt;");
    }
}
