using Microsoft.EntityFrameworkCore.Migrations;

#nullable disable

namespace foodmarket.Infrastructure.Persistence.Migrations
{
    /// <summary>Phase3b сидер ошибочно создавал НОВУЮ запись «Розничная цена»
    /// с IsSystem=true в каждой организации, у которой не было IsSystem=true,
    /// игнорируя факт что фактически системной была другая запись (с реальными
    /// ценами у товаров). В итоге IsSystem оказывался не у той записи.
    ///
    /// Чиним идемпотентно для каждой организации:
    /// 1. Сначала снимаем IsSystem со всех записей.
    /// 2. Помечаем IsSystem той записи, у которой больше всего связанных
    ///    ProductPrice (приоритет — реально использующейся цене); при равенстве
    ///    выбирается самая старая (CreatedAt ASC).
    /// 3. Если в организации вообще нет ни одной PriceType — создаём новую
    ///    «Розничная цена» с IsSystem=true.
    /// 4. У выбранной системной IsRequired ставим true.
    /// </summary>
    public partial class Phase3b_FixPriceTypeIsSystem : Migration
    {
        protected override void Up(MigrationBuilder b)
        {
            b.Sql("""
                -- 1. Снимаем IsSystem со всех записей.
                UPDATE public.price_types SET "IsSystem" = false;

                -- 2. Для каждой организации находим кандидата с max(count(prices))
                --    и помечаем его IsSystem=true, IsRequired=true.
                WITH ranked AS (
                    SELECT
                        pt."Id",
                        pt."OrganizationId",
                        COUNT(pp."Id") AS price_count,
                        pt."CreatedAt",
                        ROW_NUMBER() OVER (
                            PARTITION BY pt."OrganizationId"
                            ORDER BY COUNT(pp."Id") DESC, pt."CreatedAt" ASC, pt."Id" ASC
                        ) AS rn
                    FROM public.price_types pt
                    LEFT JOIN public.product_prices pp ON pp."PriceTypeId" = pt."Id"
                    GROUP BY pt."Id", pt."OrganizationId", pt."CreatedAt"
                )
                UPDATE public.price_types pt
                SET "IsSystem" = true, "IsRequired" = true
                FROM ranked
                WHERE pt."Id" = ranked."Id" AND ranked.rn = 1;

                -- 3. Если у организации ВООБЩЕ нет PriceType — создадим «Розничная цена».
                INSERT INTO public.price_types
                    ("Id", "OrganizationId", "Name", "IsRequired", "IsSystem",
                     "IsDefault", "IsRetail", "SortOrder", "CreatedAt")
                SELECT gen_random_uuid(), o."Id", 'Розничная цена', true, true,
                       true, true, 0, now() AT TIME ZONE 'UTC'
                FROM public.organizations o
                WHERE NOT EXISTS (
                    SELECT 1 FROM public.price_types pt WHERE pt."OrganizationId" = o."Id"
                );
            """);
        }

        protected override void Down(MigrationBuilder b)
        {
            // Невосстанавливаемо — IsSystem-перенос завязан на исторические данные.
        }
    }
}
