const { PrismaClient } = require('@prisma/client')

const prisma = new PrismaClient()

async function simulateSupplyOrderReceive() {
  console.log('🎬 Симулируем прием заказа поставки (как в резолвере fulfillmentReceiveOrder)...')

  try {
    // Найдем организацию фулфилмента
    const fulfillmentOrg = await prisma.organization.findFirst({
      where: { type: 'FULFILLMENT' },
      select: { id: true, name: true }
    })

    if (!fulfillmentOrg) {
      console.log('❌ Организация фулфилмента не найдена')
      return
    }

    // Найдем заказ поставки в статусе SHIPPED
    const existingOrder = await prisma.supplyOrder.findFirst({
      where: {
        fulfillmentCenterId: fulfillmentOrg.id,
        status: 'SHIPPED',
      },
      include: {
        items: {
          include: {
            product: {
              include: {
                category: true,
              },
            },
          },
        },
        organization: true,
        partner: true,
      },
    })

    if (!existingOrder) {
      console.log('❌ Не найден заказ поставки в статусе SHIPPED')
      return
    }

    console.log(`📋 Симулируем прием заказа: ${existingOrder.id}`)
    console.log(`   Тип расходников: ${existingOrder.consumableType}`)
    console.log(`   Элементов: ${existingOrder.items.length}`)

    // 1. ОБНОВЛЯЕМ СТАТУС ЗАКАЗА НА DELIVERED
    console.log('\n1️⃣ Обновляем статус заказа на DELIVERED...')
    const updatedOrder = await prisma.supplyOrder.update({
      where: { id: existingOrder.id },
      data: { status: 'DELIVERED' },
      include: {
        partner: true,
        organization: true,
        fulfillmentCenter: true,
        logisticsPartner: true,
        items: {
          include: {
            product: {
              include: {
                category: true,
                organization: true,
              },
            },
          },
        },
      },
    })

    console.log('✅ Статус заказа обновлен на DELIVERED')

    // 2. СИНХРОНИЗАЦИЯ ОСТАТКОВ ПОСТАВЩИКА
    console.log('\n2️⃣ Обновляем остатки поставщика...')
    for (const item of existingOrder.items) {
      const product = await prisma.product.findUnique({
        where: { id: item.product.id },
      })

      if (product) {
        await prisma.product.update({
          where: { id: item.product.id },
          data: {
            inTransit: Math.max((product.inTransit || 0) - item.quantity, 0),
            sold: (product.sold || 0) + item.quantity,
          },
        })
        console.log(`✅ Товар поставщика "${product.name}" обновлен`)
      }
    }

    // 3. СОЗДАНИЕ/ОБНОВЛЕНИЕ SUPPLY ЗАПИСЕЙ (ИСПРАВЛЕННАЯ ЛОГИКА)
    console.log('\n3️⃣ Обрабатываем Supply записи (исправленная логика)...')

    for (const item of existingOrder.items) {
      console.log(`\n📦 Товар: ${item.product.name}`)
      console.log(`   Артикул: "${item.product.article}"`)
      console.log(`   Количество: ${item.quantity}`)

      // Проверяем артикул
      if (!item.product.article || item.product.article.trim() === '') {
        console.log('   ❌ ОШИБКА: У товара нет артикула! Пропускаем...')
        continue
      }

      // Определяем тип расходника
      const isSellerSupply = existingOrder.consumableType === 'SELLER_CONSUMABLES'
      const supplyType = isSellerSupply ? 'SELLER_CONSUMABLES' : 'FULFILLMENT_CONSUMABLES'
      const sellerOwnerId = isSellerSupply ? existingOrder.organizationId : null
      const targetOrganizationId = fulfillmentOrg.id

      console.log(`   Тип: ${supplyType}`)
      console.log(`   Владелец селлер: ${sellerOwnerId}`)

      // ИСПРАВЛЕННАЯ ЛОГИКА: Ищем по артикулу
      const whereCondition = isSellerSupply
        ? {
            organizationId: targetOrganizationId,
            article: item.product.article, // ИСПРАВЛЕНО: поиск по артикулу
            type: 'SELLER_CONSUMABLES',
            sellerOwnerId: existingOrder.organizationId,
          }
        : {
            organizationId: targetOrganizationId,
            article: item.product.article, // ИСПРАВЛЕНО: поиск по артикулу
            type: 'FULFILLMENT_CONSUMABLES',
            sellerOwnerId: null,
          }

      console.log('   🔍 Условие поиска:')
      console.log('      ', JSON.stringify(whereCondition, null, 8))

      const existingSupply = await prisma.supply.findFirst({
        where: whereCondition,
      })

      if (existingSupply) {
        // ОБНОВЛЯЕМ существующий
        console.log(`   ✅ НАЙДЕН существующий Supply (ID: ${existingSupply.id})`)
        console.log(`      Текущий остаток: ${existingSupply.currentStock}`)
        
        const newCurrentStock = existingSupply.currentStock + item.quantity
        const newTotalQuantity = existingSupply.quantity + item.quantity

        await prisma.supply.update({
          where: { id: existingSupply.id },
          data: {
            currentStock: newCurrentStock,
            quantity: newTotalQuantity,
            status: 'in-stock',
            updatedAt: new Date(),
          },
        })

        console.log(`      📈 ОБНОВЛЕН: остаток ${existingSupply.currentStock} → ${newCurrentStock}`)
        console.log(`      📈 ОБНОВЛЕН: общее количество ${existingSupply.quantity} → ${newTotalQuantity}`)

      } else {
        // СОЗДАЕМ новый
        console.log(`   🆕 НЕ найден - СОЗДАЕМ новый Supply`)
        
        const newSupply = await prisma.supply.create({
          data: {
            name: item.product.name,
            article: item.product.article, // ДОБАВЛЕНО: артикул
            description: item.product.description || `Поставка от ${existingOrder.partner.name}`,
            price: item.price,
            quantity: item.quantity,
            unit: 'шт',
            category: item.product.category?.name || 'Расходники',
            status: 'in-stock',
            date: new Date(),
            supplier: existingOrder.partner.name || existingOrder.partner.fullName || 'Не указан',
            minStock: Math.round(item.quantity * 0.1),
            currentStock: item.quantity,
            usedStock: 0,
            type: supplyType,
            organizationId: targetOrganizationId,
            sellerOwnerId: sellerOwnerId,
          },
        })

        console.log(`      ✅ СОЗДАН новый Supply (ID: ${newSupply.id})`)
        console.log(`      📦 Название: ${newSupply.name}`)
        console.log(`      🏷️  Артикул: ${newSupply.article}`)
        console.log(`      📊 Остаток: ${newSupply.currentStock}`)
        console.log(`      🏢 Тип: ${newSupply.type}`)
      }
    }

    console.log('\n✅ СИМУЛЯЦИЯ ЗАВЕРШЕНА!')
    console.log('\n📊 Проверьте результат:')
    
    // Проверяем итоговые данные
    const finalSupplies = await prisma.supply.findMany({
      where: {
        organizationId: fulfillmentOrg.id,
        type: 'FULFILLMENT_CONSUMABLES',
      },
      select: {
        id: true,
        name: true,
        article: true,
        currentStock: true,
        quantity: true,
        status: true,
        createdAt: true,
      },
      orderBy: { updatedAt: 'desc' },
    })

    console.log(`\n📦 Supply записи после обработки (${finalSupplies.length}):`);
    finalSupplies.forEach((supply, index) => {
      console.log(`  ${index + 1}. "${supply.name}" (артикул: ${supply.article})`)
      console.log(`     Остаток: ${supply.currentStock}, Всего: ${supply.quantity}`)
      console.log(`     Статус: ${supply.status}, ID: ${supply.id}`)
      console.log(`     ---`)
    })

  } catch (error) {
    console.error('❌ ОШИБКА в симуляции:', error)
    console.error('Детали:', error.message)
    if (error.code) {
      console.error('Код ошибки:', error.code)
    }
  } finally {
    await prisma.$disconnect()
  }
}

simulateSupplyOrderReceive()