/**
 * Типы для системы безопасности данных в поставках SFERA
 *
 * Определяет интерфейсы для контекста безопасности, фильтрации данных
 * и уровней доступа между участниками цепочки поставок
 */

import { OrganizationType } from '@prisma/client'

/**
 * Результат фильтрации данных
 */
export interface FilteredData<T> {
  data: T
  filtered: boolean
  removedFields: string[]
  accessLevel: DataAccessLevel
}

/**
 * Уровни доступа к данным
 */
export type DataAccessLevel = 'FULL' | 'PARTIAL' | 'NONE' | 'BLOCKED'

/**
 * Типы доступа к коммерческим данным для аудита
 */
export type CommercialAccessType =
  | 'VIEW_PRICE' // Просмотр закупочных цен
  | 'VIEW_RECIPE' // Просмотр рецептуры
  | 'VIEW_CONTACTS' // Просмотр контактных данных
  | 'VIEW_MARGINS' // Просмотр маржинальности
  | 'BULK_EXPORT' // Массовая выгрузка данных
  | 'APPROVE_ORDER' // Одобрение заказа
  | 'REJECT_ORDER' // Отклонение заказа
  | 'SHIP_ORDER' // Отгрузка заказа

/**
 * Типы ресурсов для контроля доступа
 */
export type ResourceType =
  | 'SUPPLY_ORDER' // Заказ поставки
  | 'PRODUCT' // Товар
  | 'SERVICE' // Услуга
  | 'CONSUMABLE' // Расходник
  | 'ORGANIZATION' // Организация
  | 'PARTNERSHIP' // Партнерство

/**
 * Параметры для аудита доступа
 */
export interface AuditParams {
  userId: string
  organizationType: OrganizationType
  action: CommercialAccessType
  resourceType: ResourceType
  resourceId?: string
  metadata?: Record<string, unknown>
  ipAddress?: string
  userAgent?: string
}

/**
 * Алерт безопасности
 */
export interface SecurityAlert {
  id: string
  type:
    | 'EXCESSIVE_ACCESS'
    | 'UNAUTHORIZED_ATTEMPT'
    | 'DATA_LEAK_RISK'
    | 'SUSPICIOUS_PATTERN'
    | 'BULK_EXPORT_DETECTED'
    | 'RULE_VIOLATION'
  severity: 'LOW' | 'MEDIUM' | 'HIGH' | 'CRITICAL'
  userId: string
  message: string
  metadata: Record<string, unknown>
  timestamp: Date
  resolved: boolean
}

/**
 * Контекст безопасности для фильтрации данных
 */
export interface SecurityContext {
  userId: string
  organizationId: string
  organizationType: OrganizationType
  userRole: OrganizationType
  requestMetadata?: {
    action?: string
    resourceId?: string
    timestamp?: string
    ipAddress?: string
    userAgent?: string
  }
  // Обратная совместимость с существующим кодом
  user?: {
    id: string
    organizationId: string
    organizationType: OrganizationType
  }
  ipAddress?: string
  userAgent?: string
  request?: {
    headers?: Record<string, string>
    timestamp: Date
  }
}

/**
 * Создание контекста безопасности
 */
export function createSecurityContext(params: {
  user: {
    id: string
    organizationId: string
    organizationType: OrganizationType
  }
  req?: {
    ip?: string
    get?: (header: string) => string | undefined
  }
}): SecurityContext {
  const { user, req } = params
  
  return {
    userId: user.id,
    organizationId: user.organizationId,
    organizationType: user.organizationType,
    userRole: user.organizationType,
    user: user,
    ipAddress: req?.ip,
    userAgent: req?.get?.('User-Agent'),
    request: {
      headers: req?.get ? {
        'User-Agent': req.get('User-Agent') || '',
        'X-Forwarded-For': req.get('X-Forwarded-For') || '',
      } : {},
      timestamp: new Date(),
    },
    requestMetadata: {
      timestamp: new Date().toISOString(),
      ipAddress: req?.ip,
      userAgent: req?.get?.('User-Agent'),
    },
  }
}

/**
 * Групповой заказ для логистики (с изоляцией селлеров)
 */
export interface GroupedLogisticsOrder {
  route: {
    from: string
    to: string
  }
  orders: Array<{
    id: string
    packagesCount: number
    volume: number
    // НЕ включаем: organizationId, sellerName и другую коммерческую информацию
  }>
  totalPackages: number
  totalVolume: number
}

/**
 * Метрики безопасности
 */
export interface SecurityMetrics {
  // Performance метрики
  filteringOverhead: number // Процент замедления от фильтрации
  cacheHitRate: number // Эффективность кеша фильтров

  // Security метрики
  unauthorizedAccessAttempts: number // Попытки несанкц. доступа
  dataLeaksPrevented: number // Предотвращенные утечки данных

  // Business метрики
  affectedQueries: number // Количество затронутых запросов
  userComplaints: number // Жалобы пользователей

  // Audit метрики
  auditLogsGenerated: number // Сгенерированные записи аудита
  alertsTriggered: number // Сработавшие алерты
}

/**
 * Конфигурация пороговых значений для алертов
 */
export interface AlertThresholds {
  [key: string]: {
    perHour: number
    perDay: number
  }
}

/**
 * Feature flags для безопасности
 */
export interface SecurityFeatureFlags {
  enabled: boolean // Общий переключатель системы безопасности
  auditEnabled: boolean // Включение аудита доступа
  strictMode: boolean // Строгий режим (блокировка при сомнениях)
  cacheEnabled: boolean // Кеширование результатов фильтрации
  realTimeAlerts: boolean // Real-time алерты
}
