using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using foodmarket.Infrastructure.Persistence;

#nullable disable

namespace foodmarket.Infrastructure.Persistence.Migrations
{
    /// <summary>Phase5g — приводим схему products в соответствие с текущим domain
    /// и кодом контроллеров.
    ///
    /// Расхождение: в БД остались рудименты от старой попытки вынести VAT в
    /// отдельную таблицу <c>vat_rates</c> (FK products.VatRateId → vat_rates.Id),
    /// а также legacy-флаг IsAlcohol. Domain Product (см. food-market.domain/
    /// Catalog/Product.cs) теперь хранит ставку напрямую как <c>decimal Vat</c>
    /// + <c>bool VatEnabled</c>, vat_rates никем не используется. Любой INSERT
    /// в products падает 42703 «column "Vat" of relation "products" does not
    /// exist», что блокирует создание товаров и весь dataflow приёмка→продажа.
    ///
    /// Миграция:
    /// 1. Дропаем FK products.VatRateId → vat_rates.
    /// 2. Дропаем колонку products.VatRateId.
    /// 3. Дропаем рудиментную колонку products.IsAlcohol.
    /// 4. Дропаем пустую таблицу vat_rates.
    /// 5. Добавляем products.Vat numeric(5,2) NOT NULL DEFAULT 12
    ///    (12% — ставка НДС по умолчанию для KZ; конкретный товар может быть 0%).
    /// 6. Добавляем products.VatEnabled boolean NOT NULL DEFAULT true.
    ///
    /// Все шаги идемпотентны (на стейдже могло быть применено вручную).</summary>
    [DbContext(typeof(AppDbContext))]
    [Migration("20260523130000_Phase5g_ProductVatRealign")]
    public partial class Phase5g_ProductVatRealign : Migration
    {
        protected override void Up(MigrationBuilder b)
        {
            b.Sql(@"
                DO $$
                BEGIN
                    -- 1. FK products.VatRateId -> vat_rates
                    IF EXISTS (SELECT 1 FROM information_schema.table_constraints
                               WHERE table_schema='public' AND table_name='products'
                               AND constraint_name='FK_products_vat_rates_VatRateId') THEN
                        ALTER TABLE public.products DROP CONSTRAINT ""FK_products_vat_rates_VatRateId"";
                    END IF;

                    -- 2. products.VatRateId column
                    IF EXISTS (SELECT 1 FROM information_schema.columns
                               WHERE table_schema='public' AND table_name='products'
                               AND column_name='VatRateId') THEN
                        DROP INDEX IF EXISTS public.""IX_products_VatRateId"";
                        ALTER TABLE public.products DROP COLUMN ""VatRateId"";
                    END IF;

                    -- 3. products.IsAlcohol rudiment
                    IF EXISTS (SELECT 1 FROM information_schema.columns
                               WHERE table_schema='public' AND table_name='products'
                               AND column_name='IsAlcohol') THEN
                        ALTER TABLE public.products DROP COLUMN ""IsAlcohol"";
                    END IF;

                    -- 4. vat_rates table
                    IF EXISTS (SELECT 1 FROM information_schema.tables
                               WHERE table_schema='public' AND table_name='vat_rates') THEN
                        DROP TABLE public.vat_rates CASCADE;
                    END IF;

                    -- 5. products.Vat numeric(5,2)
                    IF NOT EXISTS (SELECT 1 FROM information_schema.columns
                                   WHERE table_schema='public' AND table_name='products'
                                   AND column_name='Vat') THEN
                        ALTER TABLE public.products
                            ADD COLUMN ""Vat"" numeric(5,2) NOT NULL DEFAULT 12;
                    END IF;

                    -- 6. products.VatEnabled boolean
                    IF NOT EXISTS (SELECT 1 FROM information_schema.columns
                                   WHERE table_schema='public' AND table_name='products'
                                   AND column_name='VatEnabled') THEN
                        ALTER TABLE public.products
                            ADD COLUMN ""VatEnabled"" boolean NOT NULL DEFAULT true;
                    END IF;
                END $$;");
        }

        protected override void Down(MigrationBuilder b)
        {
            // Без vat_rates восстановить семантически невозможно — это деструктивная
            // миграция, откат вернёт только структуру.
            b.Sql(@"
                CREATE TABLE IF NOT EXISTS public.vat_rates (
                    ""Id""        uuid PRIMARY KEY,
                    ""Code""      varchar(10) NOT NULL,
                    ""Rate""      numeric(5,2) NOT NULL,
                    ""CreatedAt"" timestamp with time zone NOT NULL
                );

                ALTER TABLE public.products
                    DROP COLUMN IF EXISTS ""VatEnabled"",
                    DROP COLUMN IF EXISTS ""Vat"",
                    ADD COLUMN IF NOT EXISTS ""IsAlcohol"" boolean NOT NULL DEFAULT false;");
        }
    }
}
