import { useQuery } from '@apollo/client'
import { useCallback } from 'react'

import {
  GET_MY_COUNTERPARTIES,
  GET_SUPPLY_ORDERS,
  GET_WAREHOUSE_PRODUCTS,
  GET_SELLER_SUPPLIES_ON_WAREHOUSE,
  GET_MY_FULFILLMENT_SUPPLIES,
  GET_FULFILLMENT_WAREHOUSE_STATS,
} from '@/graphql/queries'
import { useRealtime } from '@/hooks/useRealtime'

import type { UseWarehouseDataReturn } from '../types'

/**
 * Хук для управления всеми GraphQL запросами дашборда склада
 * 
 * Функциональность:
 * - Выполняет все 6 GraphQL запросов с настройкой fetchPolicy
 * - Обрабатывает real-time события через WebSocket
 * - Предоставляет unified интерфейс для загрузки/ошибок/данных
 * - Управляет refetch операциями для всех запросов
 */
export function useWarehouseData(): UseWarehouseDataReturn {
  // === GraphQL ЗАПРОСЫ ===

  const {
    data: counterpartiesData,
    loading: counterpartiesLoading,
    error: counterpartiesError,
    refetch: refetchCounterparties,
  } = useQuery(GET_MY_COUNTERPARTIES, {
    fetchPolicy: 'cache-and-network', // Всегда проверяем актуальные данные
  })

  const {
    data: ordersData,
    loading: ordersLoading,
    error: ordersError,
    refetch: refetchOrders,
  } = useQuery(GET_SUPPLY_ORDERS, {
    fetchPolicy: 'cache-and-network',
  })

  const {
    data: warehouseData,
    loading: productsLoading,
    error: productsError,
    refetch: refetchWarehouse,
  } = useQuery(GET_WAREHOUSE_PRODUCTS, {
    fetchPolicy: 'cache-and-network',
  })

  // Загружаем расходники селлеров на складе фулфилмента
  const {
    data: sellerSuppliesData,
    loading: sellerSuppliesLoading,
    error: sellerSuppliesError,
    refetch: refetchSellerSupplies,
  } = useQuery(GET_SELLER_SUPPLIES_ON_WAREHOUSE, {
    fetchPolicy: 'cache-and-network',
  })

  // Загружаем расходники фулфилмента
  const {
    data: fulfillmentSuppliesData,
    loading: fulfillmentSuppliesLoading,
    error: fulfillmentSuppliesError,
    refetch: refetchFulfillmentSupplies,
  } = useQuery(GET_MY_FULFILLMENT_SUPPLIES, {
    fetchPolicy: 'cache-and-network',
  })

  // Загружаем статистику склада с изменениями за сутки
  const {
    data: warehouseStatsData,
    loading: warehouseStatsLoading,
    error: warehouseStatsError,
    refetch: refetchStats,
  } = useQuery(GET_FULFILLMENT_WAREHOUSE_STATS, {
    fetchPolicy: 'no-cache', // Принудительно обходим кеш
  })

  // === АГРЕГИРОВАННЫЕ СОСТОЯНИЯ ===

  const loading = 
    counterpartiesLoading || 
    ordersLoading || 
    productsLoading || 
    sellerSuppliesLoading || 
    fulfillmentSuppliesLoading ||
    warehouseStatsLoading

  const error = 
    counterpartiesError?.message ||
    ordersError?.message ||
    productsError?.message ||
    sellerSuppliesError?.message ||
    fulfillmentSuppliesError?.message ||
    warehouseStatsError?.message ||
    null

  // === REFETCH ФУНКЦИИ ===

  const refetchAll = useCallback(async () => {
    await Promise.all([
      refetchCounterparties(),
      refetchOrders(),
      refetchWarehouse(),
      refetchSellerSupplies(),
      refetchFulfillmentSupplies(),
      refetchStats(),
    ])
  }, [
    refetchCounterparties,
    refetchOrders, 
    refetchWarehouse,
    refetchSellerSupplies,
    refetchFulfillmentSupplies,
    refetchStats,
  ])

  // === REAL-TIME СОБЫТИЯ ===

  // Real-time: обновляем ключевые блоки при событиях поставок/склада
  useRealtime({
    onEvent: (evt) => {
      switch (evt.type) {
        case 'supply-order:new':
        case 'supply-order:updated':
          refetchOrders()
          refetchStats()
          refetchWarehouse()
          refetchSellerSupplies()
          refetchFulfillmentSupplies()
          break
        case 'warehouse:changed':
          refetchStats()
          refetchFulfillmentSupplies()
          break
      }
    },
  })

  // === DEBUG ЛОГИРОВАНИЕ ===

  // Логируем статистику склада для отладки (сохраняем из оригинала)
  console.warn('📊 WAREHOUSE STATS DEBUG:', {
    loading: warehouseStatsLoading,
    error: warehouseStatsError?.message,
    data: warehouseStatsData?.getFulfillmentWarehouseStats,
  })

  return {
    // Данные
    counterpartiesData,
    ordersData,
    warehouseData,
    sellerSuppliesData,
    fulfillmentSuppliesData,
    warehouseStatsData,
    
    // Состояния
    loading,
    error,
    
    // Действия
    refetchAll,
    refetchCounterparties,
    refetchOrders,
    refetchWarehouse,
    refetchSellerSupplies,
    refetchFulfillmentSupplies,
    refetchStats,
  }
}