/**
 * Интеграция системы безопасности в существующие резолверы
 * 
 * Этот файл демонстрирует, как применить систему безопасности
 * к существующим резолверам без их полной переписки
 */

import { SecurityLogger } from '../../lib/security-logger'
import { wrapResolversWithSecurity } from '../security'
// import { listSecuredResolvers } from '../security' // Функция не экспортируется

/**
 * Пример интеграции с существующими резолверами
 * Можно использовать этот паттерн для любых резолверов
 */
export function integrateSecurityWithExistingResolvers(resolvers: Record<string, any>) {
  SecurityLogger.logFilteringPerformance({
    operation: 'integrateSecurityResolvers',
    duration: 0,
    recordsFiltered: 0,
    fieldsRemoved: 0,
    cacheHit: false,
  })

  console.warn('🔒 SECURITY INTEGRATION: Applying security to resolvers...')
  // console.warn(`🔒 Protected resolvers: ${listSecuredResolvers().join(', ')}`)

  // Применяем middleware безопасности
  const securedResolvers = wrapResolversWithSecurity(resolvers)

  console.warn('✅ SECURITY INTEGRATION: Successfully applied security middleware')
  
  return securedResolvers
}

/**
 * Пример безопасного резолвера с ручной интеграцией
 * Демонстрирует, как добавить безопасность к отдельному резолверу
 */
export const secureSupplyOrderResolver = {
  Query: {
    /**
     * Безопасная версия supplyOrders резолвера
     * Демонстрирует ручную интеграцию системы безопасности
     */
    secureSupplyOrders: async (_: unknown, args: unknown, context: any) => {
      // Импортируем функции безопасности
      const { 
        createSecurityContext, 
        SupplyDataFilter, 
        ParticipantIsolation,
        CommercialDataAudit,
        FEATURE_FLAGS, 
      } = await import('../security')

      // Проверяем включена ли система безопасности
      if (!FEATURE_FLAGS.SUPPLY_DATA_SECURITY.enabled) {
        console.warn('⚠️ SECURITY DISABLED: Falling back to original resolver')
        // Здесь вызывается оригинальный резолвер
        return []
      }

      console.warn('🔒 SECURITY ENABLED: Applying data filtering and audit')

      // Проверяем наличие пользователя
      if (!context.user) {
        throw new Error('Authentication required')
      }

      // Получаем данные пользователя с организацией
      const { PrismaClient } = await import('@prisma/client')
      const prisma = new PrismaClient()
      
      const currentUser = await prisma.user.findUnique({
        where: { id: context.user.id },
        include: { organization: true },
      })

      if (!currentUser?.organization) {
        throw new Error('User organization not found')
      }

      // Создаем контекст безопасности с правильными данными
      const securityContext = createSecurityContext({
        user: {
          id: currentUser.id,
          organizationId: currentUser.organization.id,
          organizationType: currentUser.organization.type,
        },
        req: context.req,
      })

      // Пример фильтрации данных
      const mockOrder = {
        id: 'test-order-1',
        status: 'PENDING',
        organizationId: 'seller-org-1',
        fulfillmentCenterId: 'fulfillment-org-1',
        logisticsPartnerId: 'logistics-org-1',
        deliveryDate: new Date(),
        totalItems: 5,
        productPrice: 1000,
        fulfillmentServicePrice: 200,
        logisticsPrice: 100,
        totalAmount: 1300,
        items: [
          {
            id: 'item-1',
            product: {
              id: 'product-1',
              name: 'Test Product',
              organizationId: 'wholesale-org-1',
            },
            quantity: 2,
            price: 500,
            recipe: {
              services: [{ id: 'service-1', name: 'Test Service', price: 100 }],
              fulfillmentConsumables: [
                { id: 'consumable-1', name: 'Test Consumable', quantity: 1, pricePerUnit: 50, price: 50 },
              ],
              sellerConsumables: [
                { id: 'consumable-2', name: 'Seller Consumable', quantity: 2, pricePerUnit: 25, price: 50 },
              ],
            },
          },
        ],
        routes: [
          {
            from: 'Warehouse A',
            fromAddress: 'Address A',
            to: 'Fulfillment Center B',
            toAddress: 'Address B',
            packagesCount: 2,
            volume: 1.5,
          },
        ],
        packagesCount: 2,
        volume: 1.5,
        readyDate: new Date(),
        notes: 'Test order notes',
      }

      // Применяем фильтрацию данных
      const filteredResult = SupplyDataFilter.filterSupplyOrder(mockOrder, securityContext)

      console.warn('🔍 SECURITY FILTERING:', {
        originalFields: Object.keys(mockOrder).length,
        filteredFields: Object.keys(filteredResult.data).length,
        removedFields: filteredResult.removedFields,
        accessLevel: filteredResult.accessLevel,
      })

      // Логируем аудит доступа
      if (FEATURE_FLAGS.SUPPLY_DATA_SECURITY.auditEnabled) {
        await CommercialDataAudit.logAccess(context.prisma, {
          userId: securityContext.user.id,
          organizationType: securityContext.user.organizationType,
          action: 'VIEW_PRICE',
          resourceType: 'SUPPLY_ORDER',
          metadata: { demo: true },
          ipAddress: securityContext.ipAddress,
          userAgent: securityContext.userAgent,
        })
      }

      return [filteredResult.data]
    },
  },
}

/**
 * Функция для демонстрации работы системы безопасности
 */
export async function demonstrateSecurityFeatures() {
  const { FEATURE_FLAGS, getActiveFeatures } = await import('../security')
  
  console.warn('🔒 SECURITY SYSTEM STATUS:')
  console.warn('- Enabled:', FEATURE_FLAGS.SUPPLY_DATA_SECURITY.enabled)
  console.warn('- Audit:', FEATURE_FLAGS.SUPPLY_DATA_SECURITY.auditEnabled)
  console.warn('- Strict Mode:', FEATURE_FLAGS.SUPPLY_DATA_SECURITY.strictMode)
  console.warn('- Cache:', FEATURE_FLAGS.SUPPLY_DATA_SECURITY.cacheEnabled)
  console.warn('- Real-time Alerts:', FEATURE_FLAGS.SUPPLY_DATA_SECURITY.realTimeAlerts)
  
  const activeFeatures = getActiveFeatures()
  console.warn('🎛️ ACTIVE FEATURES:', Object.keys(activeFeatures))
  
  // const protectedResolvers = listSecuredResolvers() // Функция не доступна
  // console.warn('🛡️ PROTECTED RESOLVERS:', protectedResolvers)
  
  return {
    securityEnabled: FEATURE_FLAGS.SUPPLY_DATA_SECURITY.enabled,
    activeFeatures: Object.keys(activeFeatures),
    protectedResolvers,
    timestamp: new Date().toISOString(),
  }
}

/**
 * Экспорт для использования в основных резолверах
 */
export const securityIntegration = {
  integrateSecurityWithExistingResolvers,
  secureSupplyOrderResolver,
  demonstrateSecurityFeatures,
}