import { useState, useCallback } from 'react'

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

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

  const validateBIK = useCallback((bik: string) => {
    // БИК должен состоять из 9 цифр
    const bikRegex = /^\d{9}$/
    return bikRegex.test(bik)
  }, [])

  const validateAccountNumber = useCallback((accountNumber: string) => {
    // Расчетный счет должен состоять из 20 цифр
    const accountRegex = /^\d{20}$/
    return accountRegex.test(accountNumber)
  }, [])

  const validateCorrAccount = useCallback((corrAccount: string) => {
    // Корреспондентский счет должен состоять из 20 цифр
    const corrRegex = /^\d{20}$/
    return corrRegex.test(corrAccount)
  }, [])

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

      // Проверяем название банка
      if (!formData.bankName.trim()) {
        errors.push('Название банка обязательно')
      }

      // Проверяем БИК
      if (!formData.bik || !validateBIK(formData.bik)) {
        errors.push('БИК должен состоять из 9 цифр')
      }

      // Проверяем расчетный счет
      if (!formData.accountNumber || !validateAccountNumber(formData.accountNumber)) {
        errors.push('Расчетный счет должен состоять из 20 цифр')
      }

      // Проверяем корреспондентский счет
      if (!formData.corrAccount || !validateCorrAccount(formData.corrAccount)) {
        errors.push('Корреспондентский счет должен состоять из 20 цифр')
      }

      return {
        isValid: errors.length === 0,
        errors,
      }
    },
    [validateBIK, validateAccountNumber, validateCorrAccount],
  )

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

    // Ограничиваем длину до 20 символов
    return digitsOnly.slice(0, 20)
  }, [])

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

    // Ограничиваем длину до 9 символов
    return digitsOnly.slice(0, 9)
  }, [])

  const handleBankFieldChange = useCallback(
    (
      value: string,
      formData: UserSettingsFormData,
      setFormData: (data: UserSettingsFormData) => void,
      field: 'bankName' | 'bik' | 'accountNumber' | 'corrAccount',
    ) => {
      let formattedValue = value

      // Применяем форматирование в зависимости от поля
      if (field === 'bik') {
        formattedValue = formatBIK(value)
      } else if (field === 'accountNumber' || field === 'corrAccount') {
        formattedValue = formatBankAccount(value)
      }

      setFormData({
        ...formData,
        [field]: formattedValue,
      })
    },
    [formatBIK, formatBankAccount],
  )

  const checkFinancialCompleteness = useCallback((formData: UserSettingsFormData) => {
    const requiredFields = [
      { field: 'bankName', value: formData.bankName },
      { field: 'bik', value: formData.bik },
      { field: 'accountNumber', value: formData.accountNumber },
      { field: 'corrAccount', value: formData.corrAccount },
    ]

    const filledFields = requiredFields.filter((field) => field.value && field.value.trim() !== '').length

    const percentage = Math.round((filledFields / requiredFields.length) * 100)

    const missingFields = requiredFields
      .filter((field) => !field.value || field.value.trim() === '')
      .map((field) => {
        switch (field.field) {
          case 'bankName':
            return 'Название банка'
          case 'bik':
            return 'БИК'
          case 'accountNumber':
            return 'Расчетный счет'
          case 'corrAccount':
            return 'Корреспондентский счет'
          default:
            return field.field
        }
      })

    return {
      percentage,
      missingFields,
      isComplete: percentage === 100,
    }
  }, [])

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

  return {
    validateBIK,
    validateAccountNumber,
    validateCorrAccount,
    validateFinancialData,
    formatBankAccount,
    formatBIK,
    handleBankFieldChange,
    checkFinancialCompleteness,
    saveMessage,
    clearSaveMessage,
  }
}
