import { useQuery, useMutation } from '@apollo/client'

import {
  CREATE_GOODS_SUPPLY_ORDER_V2,
  UPDATE_GOODS_SUPPLY_ORDER_STATUS_V2,
  CANCEL_GOODS_SUPPLY_ORDER_V2,
  RECEIVE_GOODS_SUPPLY_ORDER_V2,
} from '@/graphql/mutations/goods-supply-v2'

import type { GoodsSupplyOrderV2 } from '../types/v2-types'

import {
  GET_MY_GOODS_SUPPLY_ORDERS_V2,
  GET_INCOMING_GOODS_SUPPLIES_V2,
  GET_MY_GOODS_SUPPLY_REQUESTS_V2,
} from '@/graphql/queries/goods-supply-v2'

// Hook для получения товарных поставок V2 в зависимости от роли пользователя
export function useGoodsSuppliesV2(userRole: 'SELLER' | 'WHOLESALE' | 'FULFILLMENT' | 'LOGIST') {
  // Определяем какой query использовать на основе роли
  const getQueryByRole = () => {
    switch (userRole) {
      case 'SELLER':
        return GET_MY_GOODS_SUPPLY_ORDERS_V2
      case 'FULFILLMENT':
        return GET_INCOMING_GOODS_SUPPLIES_V2
      case 'WHOLESALE':
        return GET_MY_GOODS_SUPPLY_REQUESTS_V2
      case 'LOGIST':
        return GET_INCOMING_GOODS_SUPPLIES_V2 // Логисты видят входящие поставки
      default:
        return GET_MY_GOODS_SUPPLY_ORDERS_V2
    }
  }

  const { data, loading, error, refetch } = useQuery(getQueryByRole(), {
    errorPolicy: 'all',
    notifyOnNetworkStatusChange: true,
    fetchPolicy: 'cache-and-network',
  })

  // Извлекаем данные в зависимости от роли
  const extractSupplies = (): GoodsSupplyOrderV2[] => {
    if (!data) return []

    switch (userRole) {
      case 'SELLER':
        return data.myGoodsSupplyOrders || []
      case 'FULFILLMENT':
      case 'LOGIST':
        return data.incomingGoodsSupplies || []
      case 'WHOLESALE':
        return data.myGoodsSupplyRequests || []
      default:
        return []
    }
  }

  return {
    supplies: extractSupplies(),
    loading,
    error,
    refetch,
  }
}

// Hook для мутаций товарных поставок V2
export function useGoodsSupplyV2Mutations() {
  // Создание товарной поставки
  const [createGoodsSupplyOrder, { loading: creating }] = useMutation(CREATE_GOODS_SUPPLY_ORDER_V2, {
    onCompleted: (data) => {
      if (data.createGoodsSupplyOrder?.success) {
        console.log('✅ V2 товарная поставка создана:', data.createGoodsSupplyOrder.order?.id)
      }
    },
    onError: (error) => {
      console.error('❌ Ошибка создания V2 товарной поставки:', error)
    },
  })

  // Обновление статуса поставки
  const [updateStatus, { loading: updating }] = useMutation(UPDATE_GOODS_SUPPLY_ORDER_STATUS_V2, {
    onCompleted: (data) => {
      console.log('✅ Статус V2 поставки обновлен:', data.updateGoodsSupplyOrderStatus?.status)
    },
    onError: (error) => {
      console.error('❌ Ошибка обновления статуса V2 поставки:', error)
    },
  })

  // Отмена поставки
  const [cancelOrder, { loading: cancelling }] = useMutation(CANCEL_GOODS_SUPPLY_ORDER_V2, {
    onCompleted: (data) => {
      console.log('✅ V2 поставка отменена:', data.cancelGoodsSupplyOrder?.id)
    },
    onError: (error) => {
      console.error('❌ Ошибка отмены V2 поставки:', error)
    },
  })

  // Приемка поставки
  const [receiveOrder, { loading: receiving }] = useMutation(RECEIVE_GOODS_SUPPLY_ORDER_V2, {
    onCompleted: (data) => {
      console.log('✅ V2 поставка принята:', data.receiveGoodsSupplyOrder?.id)
    },
    onError: (error) => {
      console.error('❌ Ошибка приемки V2 поставки:', error)
    },
  })

  return {
    // Мутации
    createGoodsSupplyOrder,
    updateStatus,
    cancelOrder,
    receiveOrder,
    // Состояния загрузки
    creating,
    updating,
    cancelling,
    receiving,
  }
}

// Hook для действий с товарными поставками V2
export function useGoodsSupplyV2Actions(
  userRole: 'SELLER' | 'WHOLESALE' | 'FULFILLMENT' | 'LOGIST',
  onRefetch?: () => void,
) {
  const { updateStatus, cancelOrder, receiveOrder } = useGoodsSupplyV2Mutations()

  const handleSupplyAction = async (supplyId: string, action: string) => {
    try {
      switch (action) {
        case 'approve':
          if (userRole === 'WHOLESALE') {
            await updateStatus({
              variables: {
                id: supplyId,
                status: 'SUPPLIER_APPROVED',
                notes: 'Одобрено поставщиком',
              },
            })
          }
          break

        case 'reject':
          if (userRole === 'WHOLESALE') {
            await cancelOrder({
              variables: {
                id: supplyId,
                reason: 'Отклонено поставщиком',
              },
            })
          }
          break

        case 'accept':
          if (userRole === 'FULFILLMENT') {
            await updateStatus({
              variables: {
                id: supplyId,
                status: 'LOGISTICS_CONFIRMED',
                notes: 'Принято фулфилментом',
              },
            })
          }
          break

        case 'ship':
          if (userRole === 'LOGIST') {
            await updateStatus({
              variables: {
                id: supplyId,
                status: 'IN_TRANSIT',
                notes: 'Отгружено логистикой',
              },
            })
          }
          break

        case 'receive':
          if (userRole === 'FULFILLMENT') {
            // Приемка требует дополнительных данных о товарах
            // Пока что просто меняем статус
            await updateStatus({
              variables: {
                id: supplyId,
                status: 'RECEIVED',
                notes: 'Товар получен',
              },
            })
          }
          break

        case 'cancel':
          await cancelOrder({
            variables: {
              id: supplyId,
              reason: 'Отменено пользователем',
            },
          })
          break

        default:
          console.warn('⚠️ Неизвестное действие V2:', action)
      }

      // Обновляем данные после успешного действия
      onRefetch?.()

    } catch (error) {
      console.error('❌ Ошибка выполнения действия V2:', action, error)
    }
  }

  return {
    handleSupplyAction,
  }
}