import { useCallback, useEffect, useState } from 'react'
import { dailyConditionsApi, elementApi, laboratoriesApi } from './api'
import { ConditionType, DailyCondition, Laboratory } from './types'

// Хук для загрузки лабораторий
export function useLaboratories() {
  const [data, setData] = useState<Laboratory[]>([])
  const [isLoading, setIsLoading] = useState(true)
  const [isError, setIsError] = useState(false)

  useEffect(() => {
    const loadData = async () => {
      try {
        setIsLoading(true)
        setIsError(false)
        const laboratories = await laboratoriesApi.getAll()
        setData(laboratories)
      } catch (error) {
        setIsError(true)
        console.error('Ошибка загрузки лабораторий:', error)
      } finally {
        setIsLoading(false)
      }
    }

    loadData()
  }, [])

  return { data, isLoading, isError }
}

// Хук для работы с ежедневными условиями
export function useDailyConditions(laboratoryId?: string, date?: string) {
  const [data, setData] = useState<DailyCondition | null>(null)
  const [isLoading, setIsLoading] = useState(false)
  const [isError, setIsError] = useState(false)
  const [isSaving, setIsSaving] = useState(false)

  useEffect(() => {
    if (!laboratoryId || !date) {
      setData(null)
      return
    }

    const loadData = async () => {
      try {
        setIsLoading(true)
        setIsError(false)
        const conditions = await elementApi.getDailyConditions(
          laboratoryId,
          date
        )
        setData(conditions)
      } catch (error) {
        setIsError(true)
        console.error('Ошибка загрузки ежедневных условий:', error)
      } finally {
        setIsLoading(false)
      }
    }

    loadData()
  }, [laboratoryId, date])

  const saveConditions = useCallback(
    async (conditions: Record<string, any>) => {
      if (!laboratoryId || !date) {
        throw new Error('Не указаны лаборатория или дата')
      }

      try {
        setIsSaving(true)
        const savedCondition = await elementApi.saveElementConditions({
          laboratoryId,
          date,
          conditions,
          existingConditionId: data?.id,
        })
        setData(savedCondition)
        return savedCondition
      } catch (error) {
        console.error('Ошибка сохранения условий:', error)
        throw error
      } finally {
        setIsSaving(false)
      }
    },
    [laboratoryId, date, data?.id]
  )

  return {
    data,
    isLoading,
    isError,
    isSaving,
    saveConditions,
  }
}

// Хук для получения данных лаборатории с типами условий
export function useLaboratoryConditions(laboratoryId?: string) {
  const [data, setData] = useState<{
    laboratory: Laboratory
    conditionTypes: ConditionType[]
  } | null>(null)
  const [isLoading, setIsLoading] = useState(false)
  const [isError, setIsError] = useState(false)

  useEffect(() => {
    if (!laboratoryId) {
      setData(null)
      return
    }

    const loadData = async () => {
      try {
        setIsLoading(true)
        setIsError(false)
        const result = await elementApi.getLaboratoryData(laboratoryId)
        setData(result)
      } catch (error) {
        setIsError(true)
        console.error('Ошибка загрузки условий лаборатории:', error)
      } finally {
        setIsLoading(false)
      }
    }

    loadData()
  }, [laboratoryId])

  return { data, isLoading, isError }
}

// Хук для получения конкретной лаборатории
export function useLaboratory(laboratoryId?: string) {
  const [data, setData] = useState<Laboratory | null>(null)
  const [isLoading, setIsLoading] = useState(false)
  const [isError, setIsError] = useState(false)

  useEffect(() => {
    if (!laboratoryId) {
      setData(null)
      return
    }

    const loadData = async () => {
      try {
        setIsLoading(true)
        setIsError(false)
        const laboratory = await laboratoriesApi.getById(laboratoryId)
        setData(laboratory)
      } catch (error) {
        setIsError(true)
        console.error('Ошибка загрузки лаборатории:', error)
      } finally {
        setIsLoading(false)
      }
    }

    loadData()
  }, [laboratoryId])

  return { data, isLoading, isError }
}

// Хук для управления ежедневными условиями с расширенным функционалом
export function useDailyConditionsManager() {
  const [isLoading, setIsLoading] = useState(false)
  const [isError, setIsError] = useState(false)

  const loadConditions = useCallback(
    async (filters: {
      laboratoryId?: string
      startDate?: string
      endDate?: string
    }) => {
      try {
        setIsLoading(true)
        setIsError(false)
        const conditions = await dailyConditionsApi.get({
          laboratory_id: filters.laboratoryId,
          start_date: filters.startDate,
          end_date: filters.endDate,
        })
        return conditions
      } catch (error) {
        setIsError(true)
        console.error('Ошибка загрузки условий:', error)
        throw error
      } finally {
        setIsLoading(false)
      }
    },
    []
  )

  const deleteConditions = useCallback(async (conditionId: string) => {
    try {
      setIsLoading(true)
      setIsError(false)
      await dailyConditionsApi.delete(conditionId)
    } catch (error) {
      setIsError(true)
      console.error('Ошибка удаления условий:', error)
      throw error
    } finally {
      setIsLoading(false)
    }
  }, [])

  return {
    isLoading,
    isError,
    loadConditions,
    deleteConditions,
  }
}
