import { useCallback, useState } from 'react'

import type { UseTableStateReturn, StoreData, StoreDataField } from '../types'

/**
 * Хук для управления состояниями таблицы дашборда
 * 
 * Функциональность:
 * - Управление состоянием поиска и сортировки
 * - Управление expand/collapse состояниями для магазинов и товаров  
 * - Переключение отображения дополнительных значений
 * - Предоставляет обработчики событий для UI компонентов
 */
export function useTableState(): UseTableStateReturn {
  
  // === СОСТОЯНИЯ ПОИСКА И СОРТИРОВКИ ===
  
  const [searchTerm, setSearchTerm] = useState('')
  const [sortField, setSortField] = useState<StoreDataField>('name')
  const [sortOrder, setSortOrder] = useState<'asc' | 'desc'>('asc')
  
  // === СОСТОЯНИЯ EXPAND/COLLAPSE ===
  
  const [expandedStores, setExpandedStores] = useState<Set<string>>(new Set())
  const [expandedItems, setExpandedItems] = useState<Set<string>>(new Set())
  
  // === СОСТОЯНИЕ ОТОБРАЖЕНИЯ ===
  
  const [showAdditionalValues, setShowAdditionalValues] = useState(true)

  // === ОБРАБОТЧИКИ СОБЫТИЙ ===

  const handleSort = useCallback((field: StoreDataField) => {
    if (sortField === field) {
      // Переключаем порядок сортировки для того же поля
      setSortOrder(sortOrder === 'asc' ? 'desc' : 'asc')
    } else {
      // Новое поле - устанавливаем ascending по умолчанию
      setSortField(field)
      setSortOrder('asc')
    }
  }, [sortField, sortOrder])

  const toggleStore = useCallback((storeId: string) => {
    setExpandedStores(prev => {
      const newSet = new Set(prev)
      if (newSet.has(storeId)) {
        newSet.delete(storeId)
      } else {
        newSet.add(storeId)
      }
      return newSet
    })
  }, [])

  const toggleItem = useCallback((itemId: string) => {
    setExpandedItems(prev => {
      const newSet = new Set(prev)
      if (newSet.has(itemId)) {
        newSet.delete(itemId)
      } else {
        newSet.add(itemId)
      }
      return newSet
    })
  }, [])

  const toggleAdditionalValues = useCallback(() => {
    setShowAdditionalValues(prev => !prev)
  }, [])

  return {
    // Состояния
    searchTerm,
    sortField,
    sortOrder,
    expandedStores,
    expandedItems,
    showAdditionalValues,
    
    // Действия
    setSearchTerm,
    handleSort,
    toggleStore,
    toggleItem,
    toggleAdditionalValues,
  }
}