import { useCallback, useState } from 'react'

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

/**
 * Хук для управления состояниями UI интерфейса рекламной статистики
 */
export function useUIState(): UseUIStateReturn {
  // Состояния раскрытия элементов
  const [expandedDays, setExpandedDays] = useState<Set<string>>(new Set())
  const [expandedProducts, setExpandedProducts] = useState<Set<string>>(new Set())
  const [expandedCampaigns, setExpandedCampaigns] = useState<Set<number>>(new Set())

  // Состояния фильтрации графиков
  const [showWbAds, setShowWbAds] = useState(true)
  const [showExternalAds, setShowExternalAds] = useState(true)

  // Состояния форм и модальных окон
  const [showAddForm, setShowAddForm] = useState<string | null>(null)
  const [newExternalAd, setNewExternalAd] = useState({
    name: '',
    url: '',
    cost: '',
  })

  // Обработчики раскрытия элементов
  const onToggleDay = useCallback((date: string) => {
    setExpandedDays(prev => {
      const newSet = new Set(prev)
      if (newSet.has(date)) {
        newSet.delete(date)
      } else {
        newSet.add(date)
      }
      return newSet
    })
  }, [])

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

  const onToggleCampaign = useCallback((campaignId: number) => {
    setExpandedCampaigns(prev => {
      const newSet = new Set(prev)
      if (newSet.has(campaignId)) {
        newSet.delete(campaignId)
      } else {
        newSet.add(campaignId)
      }
      return newSet
    })
  }, [])

  // Обработчики фильтрации графиков
  const onToggleWbAds = useCallback((show: boolean) => {
    setShowWbAds(show)
  }, [])

  const onToggleExternalAds = useCallback((show: boolean) => {
    setShowExternalAds(show)
  }, [])

  // Обработчики форм
  const onShowAddForm = useCallback((key: string | null) => {
    setShowAddForm(key)
    if (key === null) {
      // Сброс формы при закрытии
      setNewExternalAd({
        name: '',
        url: '',
        cost: '',
      })
    }
  }, [])

  const onUpdateNewExternalAd = useCallback((ad: { name: string; url: string; cost: string }) => {
    setNewExternalAd(ad)
  }, [])

  return {
    // Состояния раскрытия
    expandedDays,
    expandedProducts,
    expandedCampaigns,
    
    // Состояния фильтрации
    showWbAds,
    showExternalAds,
    
    // Состояния форм
    showAddForm,
    newExternalAd,
    
    // Обработчики раскрытия
    onToggleDay,
    onToggleProduct,
    onToggleCampaign,
    
    // Обработчики фильтрации
    onToggleWbAds,
    onToggleExternalAds,
    
    // Обработчики форм
    onShowAddForm,
    onUpdateNewExternalAd,
  }
}