/**
 * Detects non-human traffic based on User-Agent string.
 * Used to skip bot/crawler visits from being recorded in the DB and sent to Telegram.
 */

const BOT_UA_PATTERNS: RegExp[] = [
  // Search engine crawlers
  /(?:googlebot|adsbot-google|google-inspectiontool|google-safety|googleother)/i,
  /(?:bingbot|bingpreview|msnbot)/i,
  /(?:yandexbot|yandex\.com\/bots|yandexmetrika)/i,
  /(?:baiduspider|baidubot)/i,
  /(?:duckduckbot|duckduckgo-favicons-bot)/i,
  /(?:slurp|yahoo!?\s*slurp)/i,
  /(?:facebookexternalhit|facebot|facebookcatalog)/i,
  /(?:twitterbot|pinterest|linkedinbot)/i,
  /(?:applebot|apple-news)/i,

  // General bot/crawler/spider keywords
  /\b(?:bot|crawler|spider|scraper|archiver|fetcher|indexer)\b/i,

  // SEO / analytics tools
  /(?:ahrefsbot|semrushbot|mj12bot|dotbot|blexbot|petalbot|bytespider)/i,
  /(?:sogou|exabot|ia_archiver|archive\.org_bot|wayback)/i,
  /(?:screaming\s*frog|sitebulb|seobility|majestic)/i,

  // Monitoring / uptime checkers
  /(?:uptimerobot|pingdom|newrelic|datadog|statuscake|freshping)/i,
  /(?:nagios|zabbix|prometheus|grafana)/i,

  // HTTP automation / CLI tools
  /(?:wget|curl|libcurl|httpie|got\b|node-fetch|axios|undici)/i,
  /(?:python-requests|python-urllib|aiohttp|httpx|requests\b)/i,
  /(?:go-http-client|java\/)/i,
  /(?:okhttp|volley|android-async-http)/i,
  /(?:perl\b|ruby|php\/|lua-resty)/i,

  // Scanners / pentest tools  
  /(?:nmap|masscan|zgrab|nuclei|nikto|nessus|burpsuite|acunetix|sqlmap|wpscan)/i,
  /(?:dirbuster|gobuster|ffuf|feroxbuster|hydra)/i,

  // Headless browsers (automation)
  /(?:headlesschrome|phantomjs|selenium|puppeteer|playwright|cypress)/i,
  /(?:chrome-lighthouse|googleweblight)/i,

  // Feed readers / aggregators
  /(?:feedly|feedburner|rss|newsblur|inoreader|theoldreader)/i,

  // Empty or obviously fake UA
  /^(?:-)?\s*$/,
  /^Mozilla\/\d+\.\d+\s*$/,
];

export function isBot(userAgent?: string | null): boolean {
  if (!userAgent) return true;
  const ua = userAgent.trim();
  if (!ua) return true;
  return BOT_UA_PATTERNS.some((pattern) => pattern.test(ua));
}
