import { useState, useCallback } from 'react'

import { formatPhone } from '@/lib/utils'

import type { UserSettingsFormData, SaveMessage } from '../types/user-settings.types'

export function useContactsSettings() {
  const [saveMessage, setSaveMessage] = useState<SaveMessage | null>(null)

  const formatPhoneInput = useCallback((value: string) => {
    // Удаляем все символы кроме цифр
    const digitsOnly = value.replace(/\D/g, '')

    // Если начинается с 7, заменяем на +7
    if (digitsOnly.startsWith('7')) {
      return formatPhone(`+${digitsOnly}`)
    }

    // Если начинается с 8, заменяем на +7
    if (digitsOnly.startsWith('8')) {
      return formatPhone(`+7${digitsOnly.slice(1)}`)
    }

    // Если нет префикса, добавляем +7
    if (digitsOnly.length > 0 && !value.startsWith('+')) {
      return formatPhone(`+7${digitsOnly}`)
    }

    return formatPhone(value)
  }, [])

  const validatePhone = useCallback((phone: string) => {
    const digitsOnly = phone.replace(/\D/g, '')
    return digitsOnly.length >= 11 && digitsOnly.length <= 12
  }, [])

  const validateEmail = useCallback((email: string) => {
    const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
    return emailRegex.test(email)
  }, [])

  const validateTelegram = useCallback((telegram: string) => {
    if (!telegram) return true // Необязательное поле

    // Telegram username должен начинаться с @ и содержать только допустимые символы
    const telegramRegex = /^@[a-zA-Z0-9_]{5,32}$/
    return telegramRegex.test(telegram)
  }, [])

  const validateWhatsApp = useCallback((whatsapp: string) => {
    if (!whatsapp) return true // Необязательное поле

    const digitsOnly = whatsapp.replace(/\D/g, '')
    return digitsOnly.length >= 11 && digitsOnly.length <= 12
  }, [])

  const validateContactsData = useCallback(
    (formData: UserSettingsFormData) => {
      const errors: string[] = []

      // Проверяем обязательные поля
      if (!formData.orgPhone || !validatePhone(formData.orgPhone)) {
        errors.push('Некорректный телефон организации')
      }

      if (!formData.managerName.trim()) {
        errors.push('Имя управляющего обязательно')
      }

      if (!formData.email || !validateEmail(formData.email)) {
        errors.push('Некорректный email')
      }

      // Проверяем необязательные поля, если они заполнены
      if (formData.telegram && !validateTelegram(formData.telegram)) {
        errors.push('Некорректный Telegram (должен начинаться с @)')
      }

      if (formData.whatsapp && !validateWhatsApp(formData.whatsapp)) {
        errors.push('Некорректный WhatsApp')
      }

      return {
        isValid: errors.length === 0,
        errors,
      }
    },
    [validatePhone, validateEmail, validateTelegram, validateWhatsApp],
  )

  const handlePhoneChange = useCallback(
    (
      value: string,
      formData: UserSettingsFormData,
      setFormData: (data: UserSettingsFormData) => void,
      field: 'orgPhone' | 'whatsapp',
    ) => {
      const formattedPhone = formatPhoneInput(value)
      setFormData({
        ...formData,
        [field]: formattedPhone,
      })
    },
    [formatPhoneInput],
  )

  const handleTelegramChange = useCallback(
    (value: string, formData: UserSettingsFormData, setFormData: (data: UserSettingsFormData) => void) => {
      // Автоматически добавляем @ если его нет
      let formattedValue = value
      if (value && !value.startsWith('@')) {
        formattedValue = `@${value}`
      }

      setFormData({
        ...formData,
        telegram: formattedValue,
      })
    },
    [],
  )

  const clearSaveMessage = useCallback(() => {
    setSaveMessage(null)
  }, [])

  return {
    formatPhoneInput,
    validatePhone,
    validateEmail,
    validateTelegram,
    validateWhatsApp,
    validateContactsData,
    handlePhoneChange,
    handleTelegramChange,
    saveMessage,
    clearSaveMessage,
  }
}
