import { GraphQLError } from 'graphql'

import { prisma } from '../../../lib/prisma'
import { notifyOrganization } from '../../../lib/realtime'
import { Context } from '../../context'
import { DomainResolvers } from '../shared/types'

// Logistics Consumables Domain Resolvers - управление логистикой расходников (мигрировано из logistics-consumables-v2.ts)

// =============================================================================
// 🔐 AUTHENTICATION HELPERS
// =============================================================================

const withAuth = (resolver: any) => {
  return async (parent: any, args: any, context: Context) => {
    console.log('🔐 LOGISTICS CONSUMABLES DOMAIN AUTH CHECK:', { 
      hasUser: !!context.user, 
      userId: context.user?.id,
      organizationId: context.user?.organizationId, 
    })
    if (!context.user) {
      console.error('❌ AUTH FAILED: No user in context')
      throw new GraphQLError('Требуется авторизация', {
        extensions: { code: 'UNAUTHENTICATED' },
      })
    }
    console.log('✅ AUTH PASSED: Calling resolver')
    try {
      const result = await resolver(parent, args, context)
      console.log('🎯 RESOLVER RESULT TYPE:', typeof result, result === null ? 'NULL RESULT!' : 'Has result')
      return result
    } catch (error) {
      console.error('💥 RESOLVER ERROR:', error)
      throw error
    }
  }
}

const checkLogisticsAccess = async (userId: string) => {
  const user = await prisma.user.findUnique({
    where: { id: userId },
    include: { organization: true },
  })

  if (!user?.organizationId) {
    throw new GraphQLError('Пользователь не привязан к организации', {
      extensions: { code: 'FORBIDDEN' },
    })
  }

  if (!user.organization || user.organization.type !== 'LOGIST') {
    throw new GraphQLError('Только логистические компании могут выполнять эти операции', {
      extensions: { code: 'FORBIDDEN' },
    })
  }

  return user
}

// =============================================================================
// 🚚 LOGISTICS CONSUMABLES DOMAIN RESOLVERS
// =============================================================================

export const logisticsConsumablesResolvers: DomainResolvers = {
  Query: {
    // Получить V2 поставки расходников для логистической компании
    myLogisticsConsumableSupplies: withAuth(async (_: unknown, __: unknown, context: Context) => {
      console.log('🔍 MY_LOGISTICS_CONSUMABLE_SUPPLIES DOMAIN QUERY STARTED:', { userId: context.user?.id })
      try {
        const user = await checkLogisticsAccess(context.user!.id)

        // Получаем поставки где назначена наша логистическая компания
        // или поставки в статусе SUPPLIER_APPROVED (ожидают назначения логистики)
        const supplies = await prisma.fulfillmentConsumableSupplyOrder.findMany({
          where: {
            OR: [
              // Поставки назначенные нашей логистической компании
              {
                logisticsPartnerId: user.organizationId!,
              },
              // Поставки в статусе SUPPLIER_APPROVED (доступные для назначения)
              {
                status: 'SUPPLIER_APPROVED',
                logisticsPartnerId: null,
              },
            ],
          },
          include: {
            fulfillmentCenter: true,
            supplier: true,
            logisticsPartner: true,
            receivedBy: true,
            items: {
              include: {
                product: true,
              },
            },
          },
          orderBy: {
            createdAt: 'desc',
          },
        })

        console.log('✅ MY_LOGISTICS_CONSUMABLE_SUPPLIES DOMAIN SUCCESS:', { count: supplies.length })
        return supplies
      } catch (error) {
        console.error('❌ MY_LOGISTICS_CONSUMABLE_SUPPLIES DOMAIN ERROR:', error)
        return []
      }
    }),
  },

  Mutation: {
    // Подтверждение поставки логистикой
    logisticsConfirmConsumableSupply: withAuth(async (
      _: unknown,
      args: { id: string },
      context: Context,
    ) => {
      console.log('🔍 LOGISTICS_CONFIRM_CONSUMABLE_SUPPLY DOMAIN MUTATION STARTED:', { 
        userId: context.user?.id,
        supplyId: args.id,
      })
      try {
        const user = await checkLogisticsAccess(context.user!.id)

        const supply = await prisma.fulfillmentConsumableSupplyOrder.findUnique({
          where: { id: args.id },
          include: {
            fulfillmentCenter: true,
            supplier: true,
            logisticsPartner: true,
          },
        })

        if (!supply) {
          throw new GraphQLError('Поставка не найдена')
        }

        // Проверяем права доступа
        if (supply.logisticsPartnerId && supply.logisticsPartnerId !== user.organizationId) {
          throw new GraphQLError('Нет доступа к этой поставке')
        }

        // Проверяем статус - может подтвердить SUPPLIER_APPROVED или назначить себя
        if (!['SUPPLIER_APPROVED'].includes(supply.status)) {
          throw new GraphQLError('Поставку можно подтвердить только в статусе SUPPLIER_APPROVED')
        }

        const updatedSupply = await prisma.fulfillmentConsumableSupplyOrder.update({
          where: { id: args.id },
          data: {
            status: 'LOGISTICS_CONFIRMED',
            logisticsPartnerId: user.organizationId, // Назначаем себя если не назначены
          },
          include: {
            fulfillmentCenter: true,
            supplier: true,
            logisticsPartner: true,
            items: {
              include: {
                product: true,
              },
            },
          },
        })

        // Уведомляем фулфилмент-центр о подтверждении логистикой
        await notifyOrganization(supply.fulfillmentCenterId, {
          type: 'supply-order:logistics-confirmed',
          title: 'Логистика подтверждена',
          message: `Логистическая компания "${user.organization!.name}" подтвердила поставку расходников`,
          data: {
            supplyOrderId: supply.id,
            supplyOrderType: 'FULFILLMENT_CONSUMABLES_V2',
            logisticsCompanyName: user.organization!.name,
          },
        })

        // Уведомляем поставщика
        if (supply.supplierId) {
          await notifyOrganization(supply.supplierId, {
            type: 'supply-order:logistics-confirmed',
            title: 'Логистика подтверждена',
            message: `Логистическая компания "${user.organization!.name}" подтвердила поставку`,
            data: {
              supplyOrderId: supply.id,
              supplyOrderType: 'FULFILLMENT_CONSUMABLES_V2',
              logisticsCompanyName: user.organization!.name,
            },
          })
        }

        const result = {
          success: true,
          message: 'Поставка подтверждена логистикой',
          order: updatedSupply,
        }
        console.log('✅ LOGISTICS_CONFIRM_CONSUMABLE_SUPPLY DOMAIN SUCCESS:', { supplyId: updatedSupply.id })
        return result
      } catch (error: any) {
        console.error('❌ LOGISTICS_CONFIRM_CONSUMABLE_SUPPLY DOMAIN ERROR:', error)
        return {
          success: false,
          message: error.message || 'Ошибка подтверждения поставки',
          order: null,
        }
      }
    }),

    // Отклонение поставки логистикой
    logisticsRejectConsumableSupply: withAuth(async (
      _: unknown,
      args: { id: string; reason?: string },
      context: Context,
    ) => {
      console.log('🔍 LOGISTICS_REJECT_CONSUMABLE_SUPPLY DOMAIN MUTATION STARTED:', { 
        userId: context.user?.id,
        supplyId: args.id,
        reason: args.reason,
      })
      try {
        const user = await checkLogisticsAccess(context.user!.id)

        const supply = await prisma.fulfillmentConsumableSupplyOrder.findUnique({
          where: { id: args.id },
          include: {
            fulfillmentCenter: true,
            supplier: true,
            logisticsPartner: true,
          },
        })

        if (!supply) {
          throw new GraphQLError('Поставка не найдена')
        }

        // Проверяем права доступа
        if (supply.logisticsPartnerId && supply.logisticsPartnerId !== user.organizationId) {
          throw new GraphQLError('Нет доступа к этой поставке')
        }

        if (!['SUPPLIER_APPROVED', 'LOGISTICS_CONFIRMED'].includes(supply.status)) {
          throw new GraphQLError('Поставку можно отклонить только в статусе SUPPLIER_APPROVED или LOGISTICS_CONFIRMED')
        }

        const updatedSupply = await prisma.fulfillmentConsumableSupplyOrder.update({
          where: { id: args.id },
          data: {
            status: 'LOGISTICS_REJECTED',
            logisticsNotes: args.reason,
            logisticsPartnerId: null, // Убираем назначение
          },
          include: {
            fulfillmentCenter: true,
            supplier: true,
            logisticsPartner: true,
            items: {
              include: {
                product: true,
              },
            },
          },
        })

        // Уведомляем фулфилмент-центр об отклонении
        await notifyOrganization(supply.fulfillmentCenterId, {
          type: 'supply-order:logistics-rejected',
          title: 'Поставка отклонена логистикой',
          message: `Логистическая компания "${user.organization!.name}" отклонила поставку расходников`,
          data: {
            supplyOrderId: supply.id,
            supplyOrderType: 'FULFILLMENT_CONSUMABLES_V2',
            logisticsCompanyName: user.organization!.name,
            reason: args.reason,
          },
        })

        const result = {
          success: true,
          message: 'Поставка отклонена логистикой',
          order: updatedSupply,
        }
        console.log('✅ LOGISTICS_REJECT_CONSUMABLE_SUPPLY DOMAIN SUCCESS:', { supplyId: updatedSupply.id })
        return result
      } catch (error: any) {
        console.error('❌ LOGISTICS_REJECT_CONSUMABLE_SUPPLY DOMAIN ERROR:', error)
        return {
          success: false,
          message: error.message || 'Ошибка отклонения поставки',
          order: null,
        }
      }
    }),
  },
}

console.warn('🔥 LOGISTICS CONSUMABLES DOMAIN МОДУЛЬ ЭКСПОРТЫ ГОТОВЫ')