/**
 * AI Referrer Detection — drop-in for Next.js 15 middleware.
 *
 * MIT License · https://coreindustry.de/open-source
 *
 * Usage:
 *   import { detectAiSource, attachAiSourceCookie } from './lib/ai-referrer'
 *
 *   export function middleware(req: NextRequest) {
 *     const res = NextResponse.next()
 *     const source = detectAiSource(req)
 *     if (source && !req.cookies.get('__ai_src')) {
 *       attachAiSourceCookie(res, source)
 *     }
 *     return res
 *   }
 */

import { NextRequest, NextResponse } from 'next/server'

const AI_REFERRERS: Array<{ pattern: RegExp; source: string }> = [
  { pattern: /\bchat\.openai\.com$/i, source: 'chatgpt' },
  { pattern: /\bchatgpt\.com$/i, source: 'chatgpt' },
  { pattern: /\bperplexity\.ai$/i, source: 'perplexity' },
  { pattern: /\.perplexity\.ai$/i, source: 'perplexity' },
  { pattern: /\bclaude\.ai$/i, source: 'claude' },
  { pattern: /\bgemini\.google\.com$/i, source: 'gemini' },
  { pattern: /\baistudio\.google\.com$/i, source: 'gemini' },
  { pattern: /\bcopilot\.microsoft\.com$/i, source: 'copilot' },
  { pattern: /\bbing\.com\/copilot$/i, source: 'copilot' },
  { pattern: /\byou\.com$/i, source: 'you' },
  { pattern: /\bphind\.com$/i, source: 'phind' },
  { pattern: /\bkagi\.com$/i, source: 'kagi' },
]

export function detectAiSource(req: NextRequest): string | null {
  const referer = req.headers.get('referer') ?? ''
  if (!referer) return null
  try {
    const host = new URL(referer).hostname.toLowerCase()
    for (const { pattern, source } of AI_REFERRERS) {
      if (pattern.test(host)) return source
    }
  } catch {
    // malformed referer — ignore
  }
  return null
}

export function attachAiSourceCookie(res: NextResponse, source: string): NextResponse {
  res.cookies.set('__ai_src', source, {
    maxAge: 60 * 60 * 24 * 7, // 7 days
    sameSite: 'lax',
    secure: true,
    path: '/',
    // httpOnly intentionally omitted — client components need to read this
    // for contextual UX (welcome banner, etc.)
  })
  res.headers.set('x-ai-source', source)
  return res
}
