using Microsoft.EntityFrameworkCore.Migrations;

#nullable disable

namespace foodmarket.Infrastructure.Persistence.Migrations
{
    /// <summary>Reconciliation migration.
    ///
    /// Предыдущие миграции Phase2c2_MoySkladAlignment и Phase2c3_MsStrict были применены
    /// на стейдже, но их исходные .cs файлы были удалены при откате кода (commit 8fc9ef1
    /// стёр их, но __EFMigrationsHistory уже содержал записи). В результате:
    ///   - snapshot был неактуальным (ссылался на VatRate, IsAlcohol, Kind, и т.п.)
    ///   - БД в состоянии пост-2c3 (поля Vat, VatEnabled, TrackingType; без VatRate,
    ///     без Kind, без IsAlcohol, без Symbol/DecimalPlaces/IsBase)
    ///   - код ожидает IsMarked вместо TrackingType
    ///
    /// Задача этой миграции — добить различие в одной колонке: заменить TrackingType
    /// (добавленный в Phase2c2) на IsMarked. Всё остальное уже совпадает.
    /// EF-scaffold предложил много мусорной работы из-за рассинхрона snapshot'а — это
    /// тело переписано вручную.</summary>
    public partial class Phase2c4_ReconcileStage : Migration
    {
        /// <inheritdoc />
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            // Полностью идемпотентно: на стейдже (старый Phase1Catalog без IsMarked,
            // но с TrackingType) колонку добавим и бэкфилл'нем. На свежей БД, где
            // отрефакторённый Phase1Catalog уже создал IsMarked, — пропускаем.
            // Без этого защитного блока миграция падает с
            // `column "IsMarked" of relation "products" already exists` при первом
            // dotnet ef database update на пустой БД.
            migrationBuilder.Sql("""
                DO $$
                BEGIN
                    IF NOT EXISTS (SELECT 1 FROM information_schema.columns
                                   WHERE table_schema = 'public' AND table_name = 'products'
                                   AND column_name = 'IsMarked') THEN
                        ALTER TABLE public.products
                            ADD COLUMN "IsMarked" boolean NOT NULL DEFAULT false;
                    END IF;

                    IF EXISTS (SELECT 1 FROM information_schema.columns
                               WHERE table_schema = 'public' AND table_name = 'products'
                               AND column_name = 'TrackingType') THEN
                        UPDATE public.products SET "IsMarked" = ("TrackingType" <> 0);
                        ALTER TABLE public.products DROP COLUMN "TrackingType";
                    END IF;
                END $$;
            """);
        }

        /// <inheritdoc />
        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.AddColumn<int>(
                name: "TrackingType",
                schema: "public",
                table: "products",
                type: "integer",
                nullable: false,
                defaultValue: 0);

            migrationBuilder.Sql("""UPDATE public.products SET "TrackingType" = CASE WHEN "IsMarked" THEN 99 ELSE 0 END;""");

            migrationBuilder.DropColumn(
                name: "IsMarked",
                schema: "public",
                table: "products");
        }
    }
}
