const MIN_LEN = 1;
const MAX_LEN = 32;
const ALLOWED_CHARS_RE = /^[A-Za-z0-9_-]+$/;

export function normalizeChannelDisplayName(value) {
  if (value == null) return '';
  return String(value).trim();
}

export function normalizeChannelDescription(value) {
  if (value == null) return '';
  return String(value).trim().replace(/\s+/g, ' ');
}

export function toCanonicalChannelSlug(value) {
  const normalized = normalizeChannelDisplayName(value);
  if (!normalized) return '';

  const lowered = normalized.toLowerCase();
  if (!ALLOWED_CHARS_RE.test(lowered)) return '';
  return lowered;
}

export function validateChannelDisplayName(value) {
  const normalized = normalizeChannelDisplayName(value);
  if (!normalized) {
    return { ok: false, code: 'blank', normalized: '', slug: '' };
  }

  const length = Array.from(normalized).length;
  if (length < MIN_LEN) {
    return { ok: false, code: 'too_short', normalized, slug: '' };
  }
  if (length > MAX_LEN) {
    return { ok: false, code: 'too_long', normalized, slug: '' };
  }
  if (!ALLOWED_CHARS_RE.test(normalized)) {
    return { ok: false, code: 'bad_chars', normalized, slug: '' };
  }
  if (normalized === '0') {
    return { ok: false, code: 'reserved', normalized, slug: '' };
  }

  const slug = toCanonicalChannelSlug(normalized);
  if (!slug) {
    return { ok: false, code: 'bad_chars', normalized, slug: '' };
  }

  return { ok: true, code: '', normalized, slug };
}

export function channelNameErrorText(code) {
  switch (String(code || '').trim()) {
    case 'blank':
      return 'Введите название канала.';
    case 'too_short':
      return 'Название слишком короткое: минимум 1 символ.';
    case 'too_long':
      return 'Название слишком длинное: максимум 32 символа.';
    case 'bad_chars':
      return 'Разрешены только латиница, цифры, _ и -.';
    case 'reserved':
      return 'Название "0" зарезервировано.';
    default:
      return 'Некорректное название канала.';
  }
}

export function channelDescriptionErrorText(value) {
  const normalized = normalizeChannelDescription(value);
  if (new TextEncoder().encode(normalized).length > 200) {
    return 'Описание слишком длинное: максимум 200 байт UTF-8.';
  }
  return '';
}
