import { useState, useEffect, useCallback } from 'react'

import type { SupplyOrderFromGraphQL, InputValues } from '../types'

// Hook для управления локальными значениями инпутов и обновлениями
export function useInputManagement(
  supplies: SupplyOrderFromGraphQL[],
  onVolumeChange?: (supplyId: string, volume: number | null) => void,
  onPackagesChange?: (supplyId: string, packagesCount: number | null) => void,
  onUpdateComplete?: (supplyId: string, field: 'volume' | 'packages') => void,
) {
  // Локальное состояние для инпутов
  const [inputValues, setInputValues] = useState<InputValues>({})
  // Отслеживание, какие инпуты редактируются (пока не придет ответ от сервера)
  const [pendingUpdates, setPendingUpdates] = useState<Set<string>>(new Set())

  // Синхронизация локального состояния с данными поставок
  useEffect(() => {
    setInputValues(prev => {
      const newValues: InputValues = {}
      supplies.forEach(supply => {
        // Не перезаписываем значения для инпутов с ожидающими обновлениями
        const isVolumePending = pendingUpdates.has(`${supply.id}-volume`)
        const isPackagesPending = pendingUpdates.has(`${supply.id}-packages`)
        
        newValues[supply.id] = {
          volume: isVolumePending ? (prev[supply.id]?.volume ?? '') : (supply.volume?.toString() ?? ''),
          packages: isPackagesPending ? (prev[supply.id]?.packages ?? '') : (supply.packagesCount?.toString() ?? ''),
        }
      })
      
      // Проверяем, нужно ли обновление
      const hasChanges = supplies.some(supply => {
        const isVolumePending = pendingUpdates.has(`${supply.id}-volume`)
        const isPackagesPending = pendingUpdates.has(`${supply.id}-packages`)
        
        if (isVolumePending || isPackagesPending) return false
        
        const volumeChanged = prev[supply.id]?.volume !== (supply.volume?.toString() ?? '')
        const packagesChanged = prev[supply.id]?.packages !== (supply.packagesCount?.toString() ?? '')
        
        return volumeChanged || packagesChanged
      })
      
      return hasChanges ? newValues : prev
    })
  }, [supplies, pendingUpdates])

  // Обработчик изменения объема
  const handleVolumeChange = useCallback((supplyId: string, value: string) => {
    setInputValues(prev => ({
      ...prev,
      [supplyId]: {
        ...prev[supplyId],
        volume: value,
      },
    }))
  }, [])

  // Обработчик изменения количества упаковок
  const handlePackagesChange = useCallback((supplyId: string, value: string) => {
    setInputValues(prev => ({
      ...prev,
      [supplyId]: {
        ...prev[supplyId],
        packages: value,
      },
    }))
  }, [])

  // Обработчик потери фокуса для объема
  const handleVolumeBlur = useCallback((supplyId: string) => {
    const value = inputValues[supplyId]?.volume
    if (!value || value.trim() === '') {
      onVolumeChange?.(supplyId, null)
      return
    }

    const numericValue = parseFloat(value)
    if (!isNaN(numericValue)) {
      // Добавляем в список ожидающих обновлений
      setPendingUpdates(prev => new Set(prev).add(`${supplyId}-volume`))
      onVolumeChange?.(supplyId, numericValue)
      
      // Убираем из списка ожидающих через небольшую задержку (имитация ответа сервера)
      setTimeout(() => {
        setPendingUpdates(prev => {
          const newSet = new Set(prev)
          newSet.delete(`${supplyId}-volume`)
          return newSet
        })
        onUpdateComplete?.(supplyId, 'volume')
      }, 500)
    }
  }, [inputValues, onVolumeChange, onUpdateComplete])

  // Обработчик потери фокуса для количества упаковок
  const handlePackagesBlur = useCallback((supplyId: string) => {
    const value = inputValues[supplyId]?.packages
    if (!value || value.trim() === '') {
      onPackagesChange?.(supplyId, null)
      return
    }

    const numericValue = parseInt(value, 10)
    if (!isNaN(numericValue)) {
      // Добавляем в список ожидающих обновлений
      setPendingUpdates(prev => new Set(prev).add(`${supplyId}-packages`))
      onPackagesChange?.(supplyId, numericValue)
      
      // Убираем из списка ожидающих через небольшую задержку (имитация ответа сервера)
      setTimeout(() => {
        setPendingUpdates(prev => {
          const newSet = new Set(prev)
          newSet.delete(`${supplyId}-packages`)
          return newSet
        })
        onUpdateComplete?.(supplyId, 'packages')
      }, 500)
    }
  }, [inputValues, onPackagesChange, onUpdateComplete])

  return {
    inputValues,
    pendingUpdates,
    handleVolumeChange,
    handlePackagesChange,
    handleVolumeBlur,
    handlePackagesBlur,
  }
}