-- =============================================================================
-- 📦 МИГРАЦИЯ ДЛЯ СИСТЕМЫ ПОСТАВОК РАСХОДНИКОВ СЕЛЛЕРА
-- =============================================================================
-- Создание: Новые таблицы для селлерских поставок расходников
-- Автор: Claude Code AI Assistant
-- Дата: $(date)

-- Создание нового enum для статусов селлера (5-статусная система)
CREATE TYPE "SellerSupplyOrderStatus" AS ENUM (
  'PENDING',      -- Ожидает одобрения поставщика  
  'APPROVED',     -- Одобрено поставщиком
  'SHIPPED',      -- Отгружено
  'DELIVERED',    -- Доставлено
  'COMPLETED',    -- Завершено  
  'CANCELLED'     -- Отменено
);

-- Основная таблица поставок расходников селлера
CREATE TABLE "seller_consumable_supply_orders" (
  -- === БАЗОВЫЕ ПОЛЯ ===
  "id" TEXT NOT NULL,
  "status" "SellerSupplyOrderStatus" NOT NULL DEFAULT 'PENDING',
  "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
  "updatedAt" TIMESTAMP(3) NOT NULL,
  
  -- === ДАННЫЕ СЕЛЛЕРА (создатель) ===
  "sellerId" TEXT NOT NULL,                             -- кто заказывает (FK: Organization SELLER)
  "fulfillmentCenterId" TEXT NOT NULL,                  -- куда доставлять (FK: Organization FULFILLMENT)
  "requestedDeliveryDate" TIMESTAMP(3) NOT NULL,        -- когда нужно
  "notes" TEXT,                                         -- заметки селлера
  
  -- === ДАННЫЕ ПОСТАВЩИКА ===
  "supplierId" TEXT,                                    -- кто поставляет (FK: Organization WHOLESALE)
  "supplierApprovedAt" TIMESTAMP(3),                    -- когда одобрил
  "packagesCount" INTEGER,                              -- количество грузомест
  "estimatedVolume" DECIMAL(8,3),                       -- объем груза в м³
  "supplierContractId" TEXT,                            -- номер договора
  "supplierNotes" TEXT,                                 -- заметки поставщика
  
  -- === ДАННЫЕ ЛОГИСТИКИ ===
  "logisticsPartnerId" TEXT,                            -- кто везет (FK: Organization LOGIST) 
  "estimatedDeliveryDate" TIMESTAMP(3),                 -- план доставки
  "routeId" TEXT,                                       -- маршрут (FK: LogisticsRoute)
  "logisticsCost" DECIMAL(10,2),                        -- стоимость доставки
  "logisticsNotes" TEXT,                                -- заметки логистики
  
  -- === ДАННЫЕ ОТГРУЗКИ ===
  "shippedAt" TIMESTAMP(3),                             -- факт отгрузки
  "trackingNumber" TEXT,                                -- номер отслеживания
  
  -- === ДАННЫЕ ПРИЕМКИ ===
  "deliveredAt" TIMESTAMP(3),                           -- факт доставки в ФФ
  "receivedById" TEXT,                                  -- кто принял в ФФ (FK: User)
  "actualQuantity" INTEGER,                             -- принято количество
  "defectQuantity" INTEGER,                             -- брак
  "receiptNotes" TEXT,                                  -- заметки приемки
  
  -- === ЭКОНОМИКА (для будущего раздела экономики) ===
  "totalCostWithDelivery" DECIMAL(12,2),                -- общая стоимость с доставкой
  "estimatedStorageCost" DECIMAL(10,2),                 -- оценочная стоимость хранения
  
  CONSTRAINT "seller_consumable_supply_orders_pkey" PRIMARY KEY ("id")
);

-- Позиции в поставке расходников селлера
CREATE TABLE "seller_consumable_supply_items" (
  "id" TEXT NOT NULL,
  "supplyOrderId" TEXT NOT NULL,                        -- связь с поставкой
  "productId" TEXT NOT NULL,                            -- какой расходник (FK: Product)
  
  -- === КОЛИЧЕСТВА ===
  "requestedQuantity" INTEGER NOT NULL,                 -- запросили
  "approvedQuantity" INTEGER,                           -- поставщик одобрил
  "shippedQuantity" INTEGER,                            -- отгрузили
  "receivedQuantity" INTEGER,                           -- приняли в ФФ
  "defectQuantity" INTEGER DEFAULT 0,                   -- брак
  
  -- === ЦЕНЫ ===
  "unitPrice" DECIMAL(10,2) NOT NULL,                   -- цена за единицу от поставщика
  "totalPrice" DECIMAL(12,2) NOT NULL,                  -- общая стоимость
  
  "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
  "updatedAt" TIMESTAMP(3) NOT NULL,
  
  CONSTRAINT "seller_consumable_supply_items_pkey" PRIMARY KEY ("id")
);

-- === СОЗДАНИЕ ИНДЕКСОВ ===
CREATE UNIQUE INDEX "seller_consumable_supply_items_supplyOrderId_productId_key" 
ON "seller_consumable_supply_items"("supplyOrderId", "productId");

-- === СОЗДАНИЕ ВНЕШНИХ КЛЮЧЕЙ ===

-- Seller Supply Orders связи
ALTER TABLE "seller_consumable_supply_orders" 
ADD CONSTRAINT "seller_consumable_supply_orders_sellerId_fkey" 
FOREIGN KEY ("sellerId") REFERENCES "organizations"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

ALTER TABLE "seller_consumable_supply_orders" 
ADD CONSTRAINT "seller_consumable_supply_orders_fulfillmentCenterId_fkey" 
FOREIGN KEY ("fulfillmentCenterId") REFERENCES "organizations"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

ALTER TABLE "seller_consumable_supply_orders" 
ADD CONSTRAINT "seller_consumable_supply_orders_supplierId_fkey" 
FOREIGN KEY ("supplierId") REFERENCES "organizations"("id") ON DELETE SET NULL ON UPDATE CASCADE;

ALTER TABLE "seller_consumable_supply_orders" 
ADD CONSTRAINT "seller_consumable_supply_orders_logisticsPartnerId_fkey" 
FOREIGN KEY ("logisticsPartnerId") REFERENCES "organizations"("id") ON DELETE SET NULL ON UPDATE CASCADE;

ALTER TABLE "seller_consumable_supply_orders" 
ADD CONSTRAINT "seller_consumable_supply_orders_receivedById_fkey" 
FOREIGN KEY ("receivedById") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE;

-- Seller Supply Items связи
ALTER TABLE "seller_consumable_supply_items" 
ADD CONSTRAINT "seller_consumable_supply_items_supplyOrderId_fkey" 
FOREIGN KEY ("supplyOrderId") REFERENCES "seller_consumable_supply_orders"("id") ON DELETE CASCADE;

ALTER TABLE "seller_consumable_supply_items" 
ADD CONSTRAINT "seller_consumable_supply_items_productId_fkey" 
FOREIGN KEY ("productId") REFERENCES "products"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

-- === ДОБАВЛЕНИЕ СВЯЗЕЙ В СУЩЕСТВУЮЩИЕ ТАБЛИЦЫ ===

-- Добавление связей в organizations (если они еще не существуют)
DO $$
BEGIN
    -- Проверяем существование колонок перед добавлением
    IF NOT EXISTS (
        SELECT 1 FROM information_schema.columns 
        WHERE table_name = 'organizations' 
        AND column_name = 'sellerSupplyOrdersAsSeller'
    ) THEN
        -- Добавляем связи будут созданы автоматически через Prisma при следующем generate
        RAISE NOTICE 'Связи для селлерских поставок будут созданы автоматически при prisma generate';
    END IF;
END
$$;

-- Комментарии к таблицам
COMMENT ON TABLE "seller_consumable_supply_orders" IS 'Поставки расходников селлера - заказы от селлеров для доставки в фулфилмент-центры';
COMMENT ON TABLE "seller_consumable_supply_items" IS 'Позиции в поставках расходников селлера';

-- Комментарии к ключевым полям
COMMENT ON COLUMN "seller_consumable_supply_orders"."sellerId" IS 'Селлер-заказчик (тип SELLER)';  
COMMENT ON COLUMN "seller_consumable_supply_orders"."fulfillmentCenterId" IS 'Фулфилмент-получатель (тип FULFILLMENT)';
COMMENT ON COLUMN "seller_consumable_supply_orders"."supplierId" IS 'Поставщик товаров (тип WHOLESALE)';
COMMENT ON COLUMN "seller_consumable_supply_orders"."totalCostWithDelivery" IS 'Для будущего раздела экономики селлера';

RAISE NOTICE 'Система поставок расходников селлера успешно создана!';