/**
 * ХУКА ДЛЯ ФОРМЫ ПОСТАВЩИКОВ
 *
 * Выделена из direct-supply-creation.tsx
 * Управляет формой создания и валидацией поставщиков
 */

import { useMutation, useQuery } from '@apollo/client'
import { useState, useCallback } from 'react'
import { toast } from 'sonner'

import { CREATE_SUPPLY_SUPPLIER } from '@/graphql/mutations'
import { GET_SUPPLY_SUPPLIERS } from '@/graphql/queries'
import { isValidPhone, formatNameInput } from '@/lib/input-masks'

import type { Supplier, NewSupplier, SupplierErrors, UseSupplierFormReturn } from '../types/direct-supply.types'

const initialSupplier: NewSupplier = {
  name: '',
  contactName: '',
  phone: '',
  market: '',
  address: '',
  place: '',
  telegram: '',
}

const initialErrors: SupplierErrors = {
  name: '',
  contactName: '',
  phone: '',
  telegram: '',
}

export function useSupplierForm(): UseSupplierFormReturn {
  // Состояния
  const [suppliers, setSuppliers] = useState<Supplier[]>([])
  const [showSupplierModal, setShowSupplierModal] = useState(false)
  const [newSupplier, setNewSupplier] = useState<NewSupplier>(initialSupplier)
  const [supplierErrors, setSupplierErrors] = useState<SupplierErrors>(initialErrors)

  // Загрузка поставщиков
  const { refetch: refetchSuppliers } = useQuery(GET_SUPPLY_SUPPLIERS, {
    onCompleted: (data) => {
      if (data?.supplySuppliers) {
        console.warn('Загружаем поставщиков из БД:', data.supplySuppliers)
        setSuppliers(data.supplySuppliers)
      }
    },
  })

  // Мутация создания поставщика
  const [createSupplierMutation] = useMutation(CREATE_SUPPLY_SUPPLIER, {
    onCompleted: (data) => {
      if (data.createSupplySupplier.success) {
        toast.success('Поставщик добавлен успешно!')
        refetchSuppliers()
        resetSupplierForm()
        setShowSupplierModal(false)
      } else {
        toast.error(data.createSupplySupplier.message || 'Ошибка при добавлении поставщика')
      }
    },
    onError: (error) => {
      toast.error('Ошибка при создании поставщика')
      console.error('Error creating supplier:', error)
    },
  })

  // Обновление полей поставщика
  const updateSupplier = useCallback(
    (field: keyof NewSupplier, value: string) => {
      setNewSupplier((prev) => ({
        ...prev,
        [field]: field === 'contactName' || field === 'name' ? formatNameInput(value) : value,
      }))

      // Очистка ошибки при изменении поля
      if (supplierErrors[field as keyof SupplierErrors]) {
        setSupplierErrors((prev) => ({
          ...prev,
          [field]: '',
        }))
      }
    },
    [supplierErrors],
  )

  // Валидация отдельного поля
  const validateSupplierField = useCallback((field: keyof SupplierErrors, value: string): boolean => {
    let error = ''

    switch (field) {
      case 'name':
        if (!value.trim()) error = 'Название обязательно'
        else if (value.length < 2) error = 'Минимум 2 символа'
        break
      case 'contactName':
        if (!value.trim()) error = 'Имя обязательно'
        else if (value.length < 2) error = 'Минимум 2 символа'
        break
      case 'phone':
        if (!value.trim()) error = 'Телефон обязателен'
        else if (!isValidPhone(value)) error = 'Неверный формат телефона'
        break
      case 'telegram':
        if (value && !value.match(/^@[a-zA-Z0-9_]{5,32}$/)) {
          error = 'Формат: @username (5-32 символа)'
        }
        break
    }

    setSupplierErrors((prev) => ({ ...prev, [field]: error }))
    return error === ''
  }, [])

  // Валидация всех полей
  const validateSupplier = useCallback((): boolean => {
    const nameValid = validateSupplierField('name', newSupplier.name)
    const contactNameValid = validateSupplierField('contactName', newSupplier.contactName)
    const phoneValid = validateSupplierField('phone', newSupplier.phone)
    const telegramValid = validateSupplierField('telegram', newSupplier.telegram)

    return nameValid && contactNameValid && phoneValid && telegramValid
  }, [newSupplier, validateSupplierField])

  // Сброс формы
  const resetSupplierForm = useCallback(() => {
    setNewSupplier(initialSupplier)
    setSupplierErrors(initialErrors)
  }, [])

  // Создание поставщика
  const createSupplier = useCallback(async () => {
    if (!validateSupplier()) {
      toast.error('Исправьте ошибки в форме')
      return
    }

    try {
      await createSupplierMutation({
        variables: {
          input: {
            name: newSupplier.name,
            contactName: newSupplier.contactName,
            phone: newSupplier.phone,
            market: newSupplier.market || null,
            address: newSupplier.address || null,
            place: newSupplier.place || null,
            telegram: newSupplier.telegram || null,
          },
        },
      })
    } catch {
      // Ошибка обрабатывается в onError мутации
    }
  }, [newSupplier, validateSupplier, createSupplierMutation])

  return {
    // Состояния
    suppliers,
    showSupplierModal,
    newSupplier,
    supplierErrors,

    // Функции управления
    setShowSupplierModal,
    updateSupplier,
    validateSupplier,
    resetSupplierForm,
    createSupplier,
  }
}
