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)
        {
            // 1. Добавляем IsMarked с дефолтом false.
            migrationBuilder.AddColumn<bool>(
                name: "IsMarked",
                schema: "public",
                table: "products",
                type: "boolean",
                nullable: false,
                defaultValue: false);

            // 2. Если TrackingType есть в БД (стейдж) — бэкфиллим и удаляем.
            //    На свежей БД (dev, где migrations 2c2/2c3 не применялись отдельно)
            //    колонки не будет — IF EXISTS защищает от ошибки.
            migrationBuilder.Sql("""
                DO $$
                BEGIN
                    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");
        }
    }
}
