/**
 * Экспорт модулей безопасности данных SFERA
 *
 * Централизованный экспорт всех классов и типов системы безопасности
 * для удобного импорта в резолверах и других частях приложения
 */

// Основные классы безопасности
export { SupplyDataFilter } from './supply-data-filter'
export { ParticipantIsolation } from './participant-isolation'
export { RecipeAccessControl } from './recipe-access-control'
export { CommercialDataAudit } from './commercial-data-audit'

// Типы данных
export type {
  SecurityContext,
  FilteredData,
  DataAccessLevel,
  CommercialAccessType,
  ResourceType,
  AuditParams,
  SecurityAlert,
  GroupedLogisticsOrder,
  SecurityMetrics,
  AlertThresholds,
  SecurityFeatureFlags,
} from './types'

// Функции создания контекста
export { createSecurityContext as createSecurityContextFromTypes } from './types'

// Утилиты и обертки - Временно отключено
// export { createSecureResolver, SecurityHelpers } from './secure-resolver'

// Middleware для автоматической интеграции - Временно отключено
// export {
//   applySecurityMiddleware,
//   wrapResolversWithSecurity,
//   addSecurityConfig,
//   getSecurityConfig,
//   listSecuredResolvers,
// } from './middleware'

// Расширенные компоненты Phase 3 - Временно отключены для устранения ошибок
// export { AdvancedAuditReporting } from './advanced-audit-reporting'
// export { RealTimeSecurityAlerts } from './real-time-security-alerts'
// export { AutomatedThreatDetection } from './automated-threat-detection'
// export { ExternalMonitoringIntegration } from './external-monitoring-integration'

// Security Dashboard GraphQL компоненты - Временно отключены
// export { securityDashboardTypeDefs, securityDashboardResolvers } from './security-dashboard-graphql'

// Вспомогательные функции
export { SecurityLogger } from '../../lib/security-logger'
export { FEATURE_FLAGS, isFeatureEnabled, getActiveFeatures } from '../../config/features'

/**
 * Проверяет, включена ли система безопасности
 */
export function isSecurityEnabled(): boolean {
  return process.env.ENABLE_SUPPLY_SECURITY === 'true'
}

/**
 * Проверяет, включен ли аудит безопасности
 */
export function isAuditEnabled(): boolean {
  return process.env.ENABLE_SECURITY_AUDIT === 'true'
}

/**
 * Проверяет, включен ли строгий режим безопасности
 */
export function isStrictModeEnabled(): boolean {
  return process.env.SECURITY_STRICT_MODE === 'true'
}

/**
 * Создает контекст безопасности из стандартного GraphQL контекста
 */
export function createSecurityContext(context: any): SecurityContext {
  return {
    userId: context.user?.id || '',
    organizationId: context.user?.organizationId || '',
    organizationType: context.user?.organizationType || 'SELLER',
    userRole: context.user?.organizationType || 'SELLER',
    user: {
      id: context.user?.id || '',
      organizationId: context.user?.organizationId || '',
      organizationType: context.user?.organizationType || 'SELLER',
    },
    ipAddress: context.req?.ip || context.req?.socket?.remoteAddress,
    userAgent: context.req?.headers?.['user-agent'],
    request: {
      headers: context.req?.headers || {},
      timestamp: new Date(),
    },
    requestMetadata: {
      timestamp: new Date().toISOString(),
      ipAddress: context.req?.ip || context.req?.socket?.remoteAddress,
      userAgent: context.req?.headers?.['user-agent'],
    },
  }
}

/**
 * Middleware для безопасности GraphQL резолверов
 */
export function securityMiddleware(options: {
  resourceType: ResourceType
  requiredRole?: OrganizationType[]
  auditAction: CommercialAccessType
}) {
  return function (_target: unknown, _propertyName: string, descriptor: PropertyDescriptor) {
    const method = descriptor.value

    descriptor.value = async function (...args: unknown[]) {
      const context = args[2] as any // Стандартный GraphQL context
      const securityContext = createSecurityContext(context)

      // Проверка системы безопасности
      if (!isSecurityEnabled()) {
        return method.apply(this, args)
      }

      // Проверка роли если требуется
      if (options.requiredRole && !options.requiredRole.includes(securityContext.user.organizationType)) {
        throw new GraphQLError('Insufficient permissions', {
          extensions: { code: 'FORBIDDEN' },
        })
      }

      // Логирование доступа
      if (isAuditEnabled()) {
        const { CommercialDataAudit } = await import('./commercial-data-audit')
        await CommercialDataAudit.logAccess(context.prisma as any, {
          userId: securityContext.user.id,
          organizationType: securityContext.user.organizationType,
          action: options.auditAction,
          resourceType: options.resourceType,
          metadata: { args: args[1] }, // GraphQL args
          ipAddress: securityContext.ipAddress,
          userAgent: securityContext.userAgent,
        })
      }

      return method.apply(this, args)
    }
  }
}

// Импортируем типы Prisma для использования в SecurityContext
import { OrganizationType } from '@prisma/client'
import { GraphQLError } from 'graphql'

import type { SecurityContext, ResourceType, CommercialAccessType } from './types'
