// Единые правила валидации форм с русскоязычными сообщениями.
// Используется в публичных формах сайта; для админки есть свой парный модуль
// (food-market.web/src/lib/validation.ts), идентичный по логике.

const STRICT_EMAIL = /^[^@\s]+@[^@\s]+\.[A-Za-z]{2,}$/

export const emailMsg = {
  required: 'Email обязателен',
  format: 'Некорректный формат email. Пример: user@example.kz',
  noTld: 'Email должен содержать доменную зону (например, .kz, .com)',
}

export function validateEmail(value: string): string | null {
  if (!value) return emailMsg.required
  if (!/^[^@\s]+@[^@\s]+$/.test(value)) return emailMsg.format
  if (!/\.[A-Za-z]{2,}$/.test(value)) return emailMsg.noTld
  if (!STRICT_EMAIL.test(value)) return emailMsg.format
  return null
}

export function validatePassword(value: string): string | null {
  // На клиенте — только базовая проверка длины. Все правила сложности
  // (заглавные, цифры, спецсимволы) проверяет серверный ASP.NET Identity
  // и возвращает конкретное сообщение в общий error-bar формы. Дублировать
  // правила на фронте опасно: они расходятся с серверной политикой и
  // блокируют ввод валидных паролей.
  if (!value) return 'Это поле обязательно для заполнения'
  if (value.length < 8) return 'Пароль должен быть не менее 8 символов'
  return null
}

export function validatePhone(value: string): string | null {
  if (!value || value.trim() === '') return 'Телефон обязателен для заполнения'
  // Казахстан: +7 7XX XXX XX XX (мобильные коды KZ начинаются с 77,
  // 79 — это РФ, исключаем). Принимаем любое форматирование (пробелы,
  // скобки, дефисы), нормализуем к 11 цифрам, ведущая «8» = «7».
  let digits = value.replace(/\D/g, '')
  if (digits.length === 11 && digits.startsWith('8')) digits = '7' + digits.slice(1)
  if (!/^77\d{9}$/.test(digits)) return 'Введите корректный номер Казахстана. Пример: +7 700 123 45 67'
  return null
}

export function validateRequired(value: unknown, label = 'Это поле'): string | null {
  if (value === null || value === undefined) return `${label} обязательно для заполнения`
  if (typeof value === 'string' && value.trim() === '') return `${label} обязательно для заполнения`
  return null
}

// Подсказки для нативных HTML-валидаторов — на случай форм без JS.
export function localizeNativeValidation(input: HTMLInputElement) {
  const update = () => {
    const v = input.validity
    let msg = ''
    if (v.valueMissing) msg = 'Это поле обязательно для заполнения'
    else if (v.typeMismatch && input.type === 'email') msg = emailMsg.format
    else if (v.typeMismatch && input.type === 'url') msg = 'Введите корректный URL (например, https://example.kz)'
    else if (v.typeMismatch) msg = 'Введите корректное значение'
    else if (v.patternMismatch) msg = input.title || 'Формат не соответствует требуемому'
    else if (v.tooShort) msg = `Минимум ${input.minLength} символов`
    else if (v.tooLong) msg = `Максимум ${input.maxLength} символов`
    else if (v.rangeUnderflow) msg = `Значение должно быть не меньше ${input.min}`
    else if (v.rangeOverflow) msg = `Значение должно быть не больше ${input.max}`
    else if (v.badInput) msg = 'Введите корректное значение'
    else if (v.stepMismatch) msg = 'Значение не соответствует допустимому шагу'
    input.setCustomValidity(msg)
  }
  input.addEventListener('invalid', update)
  input.addEventListener('input', () => input.setCustomValidity(''))
}
