const GENERIC_DEVICE_NAMES = new Set(['browser', 'windows browser', 'новое устройство']);

export function resolveDeviceName(deviceName?: string | null, userAgent?: string | null): string {
  const parsed = formatUserAgentLabel(userAgent);
  if (parsed) return parsed;

  const normalized = deviceName?.trim();
  if (normalized && !GENERIC_DEVICE_NAMES.has(normalized.toLowerCase())) {
    return normalized;
  }

  return normalized || 'Неизвестное устройство';
}

export function formatUserAgentLabel(userAgent?: string | null): string | null {
  if (!userAgent?.trim()) return null;

  const ua = userAgent.trim();
  const browser = detectBrowser(ua);
  const os = detectOs(ua);

  if (browser && os) return `${browser} · ${os}`;
  return browser ?? os;
}

function detectBrowser(ua: string): string | null {
  if (/Edg\//i.test(ua)) return 'Microsoft Edge';
  if (/OPR\//i.test(ua) || /Opera/i.test(ua)) return 'Opera';
  if (/YaBrowser/i.test(ua)) return 'Яндекс Браузер';
  if (/SamsungBrowser/i.test(ua)) return 'Samsung Internet';
  if (/Firefox\//i.test(ua)) return 'Firefox';
  if (/CriOS/i.test(ua)) return 'Chrome';
  if (/Chrome\//i.test(ua) && !/Edg\//i.test(ua)) return 'Chrome';
  if (/Safari/i.test(ua) && !/Chrome/i.test(ua)) return 'Safari';
  return null;
}

function detectOs(ua: string): string | null {
  if (/Windows NT 10/i.test(ua)) return 'Windows';
  if (/Windows NT/i.test(ua)) return 'Windows';
  if (/Android/i.test(ua)) return 'Android';
  if (/iPhone/i.test(ua)) return 'iPhone';
  if (/iPad/i.test(ua)) return 'iPad';
  if (/Mac OS X/i.test(ua)) return 'macOS';
  if (/CrOS/i.test(ua)) return 'ChromeOS';
  if (/Linux/i.test(ua)) return 'Linux';
  return null;
}
