/** User-Agent → browser / OS / device, via ua-parser-js. */
import { UAParser } from 'ua-parser-js';

export interface DeviceInfo {
  browser?: string;
  browserVersion?: string;
  os?: string;
  osVersion?: string;
  deviceVendor?: string;
  deviceModel?: string;
  /** desktop | mobile | tablet | console | smarttv | wearable | embedded */
  deviceType: string;
  engine?: string;
  raw?: string;
}

export function parseUserAgent(ua: string | undefined): DeviceInfo {
  if (!ua) return { deviceType: 'unknown' };
  const r = new UAParser(ua).getResult();
  return {
    browser: r.browser.name,
    browserVersion: r.browser.version,
    os: r.os.name,
    osVersion: r.os.version,
    deviceVendor: r.device.vendor,
    deviceModel: r.device.model,
    // ua-parser leaves `type` undefined for desktops.
    deviceType: r.device.type || 'desktop',
    engine: r.engine.name,
    raw: ua,
  };
}

/** "Chrome 131 on macOS 15 (desktop)" */
export function formatDevice(d: DeviceInfo): string {
  const browser = [d.browser, d.browserVersion?.split('.')[0]].filter(Boolean).join(' ');
  const os = [d.os, d.osVersion].filter(Boolean).join(' ');
  const model = [d.deviceVendor, d.deviceModel].filter(Boolean).join(' ');
  const head = [browser || 'Unknown browser', os && `on ${os}`].filter(Boolean).join(' ');
  return model ? `${head} — ${model}` : `${head} (${d.deviceType})`;
}
