// Единые правила валидации форм с русскоязычными сообщениями.
// Парный модуль: food-market.public/src/lib/validation.ts.

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

export const messages = {
  required: 'Это поле обязательно для заполнения',
  emailFormat: 'Некорректный формат email. Пример: user@example.kz',
  emailNoTld: 'Email должен содержать доменную зону (например, .kz, .com)',
  passwordShort: 'Пароль должен быть не менее 8 символов',
  passwordNoUpper: 'Пароль должен содержать хотя бы одну заглавную букву',
  passwordNoDigit: 'Пароль должен содержать хотя бы одну цифру',
  phoneFormat: 'Введите корректный телефон. Пример: +7 700 123 45 67',
  urlFormat: 'Введите корректный URL (например, https://example.kz)',
  iinBin: 'Введите 12-значный ИИН или БИН',
  iik: 'ИИК должен начинаться с KZ и содержать 20 знаков',
  generic: 'Введите корректное значение',
}

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

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

export function validatePhone(value: string): string | null {
  if (!value) return null
  const digits = value.replace(/\D/g, '')
  if (!/^[78]\d{10}$/.test(digits)) return messages.phoneFormat
  return null
}

export function validateRequired(value: unknown): string | null {
  if (value === null || value === undefined) return messages.required
  if (typeof value === 'string' && value.trim() === '') return messages.required
  return null
}

// Подсказки для нативных HTML-валидаторов (когда форма не управляется JS).
export function localizeNativeValidation(input: HTMLInputElement) {
  const update = () => {
    const v = input.validity
    let msg = ''
    if (v.valueMissing) msg = messages.required
    else if (v.typeMismatch && input.type === 'email') msg = messages.emailFormat
    else if (v.typeMismatch && input.type === 'url') msg = messages.urlFormat
    else if (v.typeMismatch) msg = messages.generic
    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 = messages.generic
    else if (v.stepMismatch) msg = 'Значение не соответствует допустимому шагу'
    input.setCustomValidity(msg)
  }
  input.addEventListener('invalid', update)
  input.addEventListener('input', () => input.setCustomValidity(''))
}
