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

const LANDING_ALLOWED_PATHS = ['/', '/blog', '/privacy', '/admin', '/use-cases', '/features']
const NEXT_METADATA_PATHS = [
  '/favicon.ico',
  '/icon',
  '/apple-icon',
  '/opengraph-image',
  '/twitter-image',
]

function isAllowedLandingPath(pathname: string): boolean {
  if (pathname === '/') return true

  return LANDING_ALLOWED_PATHS
    .filter((path) => path !== '/')
    .some((path) => pathname === path || pathname.startsWith(`${path}/`))
}

function isStaticOrMetadataPath(pathname: string): boolean {
  // Never treat API routes as static paths
  if (pathname.startsWith('/api')) return false

  if (pathname.startsWith('/_next')) return true

  if (/\.[^/]+$/.test(pathname)) return true

  return NEXT_METADATA_PATHS.some(
    (path) => pathname === path || pathname.startsWith(`${path}/`)
  )
}

export function middleware(request: NextRequest) {
  if (process.env.NEXT_PUBLIC_LANDING_ONLY_MODE !== 'true') {
    return NextResponse.next()
  }

  const { pathname } = request.nextUrl

  if (isStaticOrMetadataPath(pathname)) {
    return NextResponse.next()
  }

  if (isAllowedLandingPath(pathname)) {
    return NextResponse.next()
  }

  const redirectUrl = request.nextUrl.clone()
  redirectUrl.pathname = '/'
  redirectUrl.search = ''

  return NextResponse.redirect(redirectUrl, 307)
}

export const config = {
  matcher: '/:path*',
}
