/**
 * ТИПЫ ДЛЯ СОЗДАНИЯ ПОСТАВОК ПОСТАВЩИКОВ
 *
 * Выделены из create-suppliers-supply-page.tsx
 * Согласно rules-complete.md 9.7
 */

// Основные сущности
export interface GoodsSupplier {
  id: string
  inn: string
  name?: string
  fullName?: string
  type: 'FULFILLMENT' | 'SELLER' | 'LOGIST' | 'WHOLESALE'
  address?: string
  phones?: Array<{ value: string }>
  emails?: Array<{ value: string }>
  users?: Array<{ id: string; avatar?: string; managerName?: string }>
  createdAt: string
  rating?: number
  market?: string // Принадлежность к рынку согласно rules-complete.md v10.0
}

export interface GoodsProduct {
  id: string
  name: string
  description?: string
  price: number
  category?: { name: string }
  images: string[]
  mainImage?: string
  article: string // Артикул поставщика
  organization: {
    id: string
    name: string
  }
  quantity?: number
  unit?: string
  weight?: number
  dimensions?: {
    length: number
    width: number
    height: number
  }
}

export interface SelectedGoodsItem {
  id: string
  name: string
  sku: string
  price: number
  selectedQuantity: number
  unit?: string
  category?: string
  supplierId: string
  supplierName: string
  completeness?: string // Комплектность согласно rules2.md 9.7.2
  recipe?: string // Рецептура/состав
  specialRequirements?: string // Особые требования
  parameters?: Array<{ name: string; value: string }> // Параметры товара
}

// Компоненты рецептуры
export interface FulfillmentService {
  id: string
  name: string
  description?: string
  price: number
  category?: string
}

export interface FulfillmentConsumable {
  id: string
  name: string
  price: number
  quantity: number
  unit?: string
}

export interface SellerConsumable {
  id: string
  name: string
  pricePerUnit: number
  warehouseStock: number
  unit?: string
}

export interface WBCard {
  id: string
  title: string
  nmID: string
  vendorCode?: string
  brand?: string
}

export interface ProductRecipe {
  productId: string
  selectedServices: string[]
  selectedFFConsumables: string[]
  selectedSellerConsumables: string[]
  selectedWBCard?: string
}

// Состояния компонента
export interface SupplyCreationState {
  selectedSupplier: GoodsSupplier | null
  selectedGoods: SelectedGoodsItem[]
  searchQuery: string
  productSearchQuery: string
  deliveryDate: string
  selectedLogistics: string
  selectedFulfillment: string
  allSelectedProducts: Array<GoodsProduct & { selectedQuantity: number }>
  productRecipes: Record<string, ProductRecipe>
  productQuantities: Record<string, number>
}

// Действия для управления состоянием
export interface SupplyCreationActions {
  setSelectedSupplier: (supplier: GoodsSupplier | null) => void
  setSelectedGoods: (goods: SelectedGoodsItem[] | ((prev: SelectedGoodsItem[]) => SelectedGoodsItem[])) => void
  setSearchQuery: (query: string) => void
  setDeliveryDate: (date: string) => void
  setSelectedLogistics: (logistics: string) => void
  setSelectedFulfillment: (fulfillment: string) => void
  setAllSelectedProducts: (
    products:
      | Array<GoodsProduct & { selectedQuantity: number }>
      | ((
          prev: Array<GoodsProduct & { selectedQuantity: number }>,
        ) => Array<GoodsProduct & { selectedQuantity: number }>),
  ) => void
  setProductRecipes: (
    recipes: Record<string, ProductRecipe> | ((prev: Record<string, ProductRecipe>) => Record<string, ProductRecipe>),
  ) => void
  setProductQuantities: (
    quantities: Record<string, number> | ((prev: Record<string, number>) => Record<string, number>),
  ) => void
}

// Пропсы для блок-компонентов
export interface SuppliersBlockProps {
  suppliers: GoodsSupplier[]
  selectedSupplier: GoodsSupplier | null
  searchQuery: string
  loading: boolean
  onSupplierSelect: (supplier: GoodsSupplier) => void
  onSearchChange: (query: string) => void
}

export interface ProductCardsBlockProps {
  products: GoodsProduct[]
  selectedSupplier: GoodsSupplier | null
  selectedProducts: Array<GoodsProduct & { selectedQuantity: number }>
  onProductAdd: (product: GoodsProduct) => void
}

export interface DetailedCatalogBlockProps {
  allSelectedProducts: Array<GoodsProduct & { selectedQuantity: number }>
  productRecipes: Record<string, ProductRecipe>
  fulfillmentServices: FulfillmentService[]
  fulfillmentConsumables: FulfillmentConsumable[]
  sellerConsumables: SellerConsumable[]
  deliveryDate: string
  selectedFulfillment: string
  allCounterparties: GoodsSupplier[]
  onQuantityChange: (productId: string, quantity: number) => void
  onRecipeChange: (productId: string, recipe: ProductRecipe) => void
  onDeliveryDateChange: (date: string) => void
  onFulfillmentChange: (fulfillment: string) => void
  onProductRemove: (productId: string) => void
}

export interface CartBlockProps {
  selectedGoods: SelectedGoodsItem[]
  selectedSupplier: GoodsSupplier | null
  deliveryDate: string
  selectedFulfillment: string
  selectedLogistics: string
  allCounterparties: GoodsSupplier[]
  totalAmount: number
  isFormValid: boolean
  isCreatingSupply: boolean
  // Новые поля для расчета с рецептурой
  allSelectedProducts: Array<GoodsProduct & { selectedQuantity: number }>
  productRecipes: Record<string, ProductRecipe>
  fulfillmentServices: FulfillmentService[]
  fulfillmentConsumables: FulfillmentConsumable[]
  sellerConsumables: SellerConsumable[]
  onLogisticsChange: (logistics: string) => void
  onCreateSupply: () => void
  onItemRemove: (itemId: string) => void
}

// Утилиты для расчетов
export interface RecipeCostCalculation {
  services: number
  consumables: number
  total: number
}

export interface SupplyCreationFormData {
  supplierId: string
  fulfillmentCenterId: string
  items: Array<{
    productId: string
    quantity: number
    recipe: ProductRecipe
  }>
  deliveryDate: string
  logistics: string
  specialRequirements?: string
}

// === НОВЫЕ ТИПЫ ДЛЯ МНОГОУРОВНЕВОЙ СИСТЕМЫ ПОСТАВОК ===

// Интерфейс для маршрута поставки
export interface SupplyRoute {
  id: string
  supplyOrderId: string
  logisticsId?: string
  fromLocation: string // Точка забора (рынок/поставщик)
  toLocation: string // Точка доставки (фулфилмент)
  fromAddress?: string // Полный адрес точки забора
  toAddress?: string // Полный адрес точки доставки
  distance?: number // Расстояние в км
  estimatedTime?: number // Время доставки в часах
  price?: number // Стоимость логистики
  status?: string // Статус маршрута
  createdAt: string
  updatedAt: string
  createdDate: string // Дата создания маршрута (уровень 2)
  logistics?: LogisticsRoute // Предустановленный маршрут
}

// Интерфейс для предустановленных логистических маршрутов
export interface LogisticsRoute {
  id: string
  fromLocation: string
  toLocation: string
  priceUnder1m3: number
  priceOver1m3: number
  description?: string
  organizationId: string
}

// Расширенный интерфейс поставки для многоуровневой таблицы
export interface MultiLevelSupplyOrder {
  id: string
  organizationId: string
  partnerId: string
  partner: GoodsSupplier
  deliveryDate: string
  status: SupplyOrderStatus
  totalAmount: number
  totalItems: number
  fulfillmentCenterId?: string
  fulfillmentCenter?: GoodsSupplier
  logisticsPartnerId?: string
  logisticsPartner?: GoodsSupplier
  // Новые поля
  packagesCount?: number // Количество грузовых мест
  volume?: number // Объём товара в м³
  responsibleEmployee?: string // ID ответственного сотрудника ФФ
  employee?: Employee // Ответственный сотрудник
  notes?: string // Заметки
  routes: SupplyRoute[] // Маршруты поставки
  items: MultiLevelSupplyOrderItem[]
  createdAt: string
  updatedAt: string
  organization: GoodsSupplier
}

// Расширенный интерфейс элемента поставки
export interface MultiLevelSupplyOrderItem {
  id: string
  productId: string
  product: GoodsProduct & {
    sizes?: ProductSize[] // Размеры товара
  }
  quantity: number
  price: number
  totalPrice: number
  recipe?: ExpandedProductRecipe // Развернутая рецептура
  createdAt: string
  updatedAt: string
}

// Размеры товара
export interface ProductSize {
  id: string
  name: string // S, M, L, XL или другие
  quantity: number
  price?: number
}

// Развернутая рецептура с детализацией
export interface ExpandedProductRecipe {
  services: FulfillmentService[]
  fulfillmentConsumables: FulfillmentConsumable[]
  sellerConsumables: SellerConsumable[]
  marketplaceCardId?: string
  totalServicesCost: number
  totalConsumablesCost: number
  totalRecipeCost: number
}

// Интерфейс сотрудника
export interface Employee {
  id: string
  firstName: string
  lastName: string
  middleName?: string
  position: string
  department?: string
  avatar?: string
}

// Статусы поставок
export type SupplyOrderStatus = 
  | 'PENDING' // Ожидает одобрения поставщика
  | 'SUPPLIER_APPROVED' // Поставщик одобрил
  | 'LOGISTICS_CONFIRMED' // Логистика подтвердила
  | 'SHIPPED' // Отправлено поставщиком
  | 'IN_TRANSIT' // В пути
  | 'DELIVERED' // Доставлено
  | 'CANCELLED' // Отменено

// Типы для многоуровневой таблицы
export interface MultiLevelTableData {
  supplies: MultiLevelSupplyOrder[]
  totalCount: number
  filters?: SupplyFilters
  sorting?: SupplySorting
}

// Фильтры таблицы поставок
export interface SupplyFilters {
  status?: SupplyOrderStatus[]
  dateFrom?: string
  dateTo?: string
  suppliers?: string[]
  fulfillmentCenters?: string[]
  search?: string
}

// Сортировка таблицы поставок  
export interface SupplySorting {
  field: 'id' | 'deliveryDate' | 'createdAt' | 'totalAmount' | 'status'
  direction: 'asc' | 'desc'
}

// Пропсы для многоуровневой таблицы поставок
export interface MultiLevelSupplyTableProps {
  data: MultiLevelTableData
  loading: boolean
  onFiltersChange: (filters: SupplyFilters) => void
  onSortingChange: (sorting: SupplySorting) => void
  onSupplyCancel: (supplyId: string) => void
  onSupplyEdit: (supplyId: string) => void
}

// Данные для отображения в ячейках таблицы
export interface SupplyTableCellData {
  // Уровень 1: Поставка
  orderNumber: string
  deliveryDate: string
  planned: number // Заказано
  delivered: number // Поставлено  
  defective: number // Брак
  goodsPrice: number // Цена товаров
  servicesPrice: number // Услуги ФФ
  logisticsPrice: number // Логистика до ФФ
  total: number // Итого
  status: SupplyOrderStatus
  
  // Расчетные поля (агрегированные данные)
  isExpanded: boolean
  hasRoutes: boolean
  hasItems: boolean
  canCancel: boolean
  canEdit: boolean
}
