/**
 * ХУКА ДЛЯ УПРАВЛЕНИЯ ПОСТАВКОЙ
 *
 * Выделена из direct-supply-creation.tsx
 * Управляет элементами поставки, расчетами и валидацией
 */

import { useState } from 'react'
import { toast } from 'sonner'

import { WildberriesCard } from '@/types/supplies'

import type { SupplyItem, UseSupplyManagementReturn, VolumeCalculation } from '../types/direct-supply.types'

export function useSupplyManagement(): UseSupplyManagementReturn {
  const [supplyItems, setSupplyItems] = useState<SupplyItem[]>([])

  // Добавление товара в поставку
  const addToSupply = (card: WildberriesCard, quantity: number, supplierId: string) => {
    // Проверяем, есть ли уже такой товар
    const existingItem = supplyItems.find((item) => item.card.nmID === card.nmID)

    if (existingItem) {
      // Обновляем существующий
      updateItemQuantity(card.nmID, quantity)
      return
    }

    const newItem: SupplyItem = {
      card,
      quantity: quantity || 0,
      pricePerUnit: 0,
      totalPrice: 0,
      supplierId: supplierId || '',
      priceType: 'perUnit',
    }

    setSupplyItems((prev) => [...prev, newItem])
    toast.success('Товар добавлен в поставку')
  }

  // Удаление товара из поставки
  const removeItem = (cardId: number) => {
    setSupplyItems((prev) => prev.filter((item) => item.card.nmID !== cardId))
    toast.success('Товар удален из поставки')
  }

  // Обновление количества товара
  const updateItemQuantity = (cardId: number, quantity: number) => {
    setSupplyItems((prev) =>
      prev.map((item) => {
        if (item.card.nmID === cardId) {
          const updatedItem = { ...item, quantity }

          // Пересчитываем totalPrice в зависимости от типа цены
          if (updatedItem.priceType === 'perUnit') {
            updatedItem.totalPrice = updatedItem.quantity * updatedItem.pricePerUnit
          } else {
            updatedItem.totalPrice = updatedItem.pricePerUnit
          }

          return updatedItem
        }
        return item
      }),
    )
  }

  // Обновление цены товара
  const updateItemPrice = (cardId: number, price: number, priceType: 'perUnit' | 'total') => {
    setSupplyItems((prev) =>
      prev.map((item) => {
        if (item.card.nmID === cardId) {
          const updatedItem = {
            ...item,
            pricePerUnit: price,
            priceType,
          }

          // Пересчитываем totalPrice в зависимости от типа цены
          if (updatedItem.priceType === 'perUnit') {
            updatedItem.totalPrice = updatedItem.quantity * updatedItem.pricePerUnit
          } else {
            updatedItem.totalPrice = updatedItem.pricePerUnit
          }

          return updatedItem
        }
        return item
      }),
    )
  }

  // Функция для расчета объема одного товара в м³
  const calculateItemVolume = (card: WildberriesCard): number => {
    if (!card.dimensions) return 0

    const { length, width, height } = card.dimensions

    // Проверяем что все размеры указаны и больше 0
    if (!length || !width || !height || length <= 0 || width <= 0 || height <= 0) {
      return 0
    }

    // Переводим из сантиметров в метры и рассчитываем объем
    const volumeInM3 = (length / 100) * (width / 100) * (height / 100)

    return volumeInM3
  }

  // Расчет общей стоимости товаров
  const getTotalItemsCost = (): number => {
    return supplyItems.reduce((sum, item) => sum + item.totalPrice, 0)
  }

  // Расчет общего объема всех товаров в поставке
  const getTotalVolume = (): number => {
    return supplyItems.reduce((totalVolume, item) => {
      const itemVolume = calculateItemVolume(item.card)
      return totalVolume + itemVolume * item.quantity
    }, 0)
  }

  // Расчет общего количества товаров
  const getTotalQuantity = (): number => {
    return supplyItems.reduce((sum, item) => sum + item.quantity, 0)
  }

  // Расширенная статистика по объему (не используется)
  const _getVolumeCalculation = (): VolumeCalculation => {
    let totalVolume = 0
    let itemsWithDimensions = 0
    let itemsWithoutDimensions = 0

    supplyItems.forEach((item) => {
      if (item.card.dimensions) {
        itemsWithDimensions++
        const itemVolume = calculateItemVolume(item.card)
        totalVolume += itemVolume * item.quantity
      } else {
        itemsWithoutDimensions++
      }
    })

    return {
      totalVolume,
      itemsWithDimensions,
      itemsWithoutDimensions,
    }
  }

  return {
    supplyItems,
    addToSupply,
    updateItemQuantity,
    updateItemPrice,
    removeItem,
    getTotalItemsCost,
    getTotalVolume,
    getTotalQuantity,
  }
}
