import { NextRequest, NextResponse } from "next/server"; export async function GET(request: NextRequest) { try { // Check for Cloudflare's IP header first (production) const cfConnectingIp = request.headers.get("cf-connecting-ip"); const forwardedFor = request.headers.get("x-forwarded-for"); const realIP = request.headers.get("x-real-ip"); // Use Cloudflare IP first, then fall back to other headers let ip = cfConnectingIp || forwardedFor?.split(",")[0]?.trim() || realIP || "127.0.0.1"; // For local development, return XX as country code (Mautic accepts this) if (ip === "127.0.0.1" || ip === "::1" || ip.startsWith("192.168.") || ip.startsWith("10.")) { console.log("[GeoIP] Local/private IP detected:", ip); return NextResponse.json({ country: "Unknown", countryCode: "XX", region: "", city: "", timezone: "", }); } const response = await fetch(`http://ip-api.com/json/${ip}?fields=status,message,country,countryCode,region,regionName,city,timezone`, { headers: { "Accept": "application/json", }, }); if (!response.ok) { throw new Error("GeoIP lookup failed"); } const data = await response.json(); if (data.status !== "success") { console.error("[GeoIP] API error:", data.message, "for IP:", ip); return NextResponse.json({ country: "Unknown", countryCode: "XX", region: "", city: "", timezone: "", }); } console.log("[GeoIP] Success:", data.country, "(" + data.countryCode + ")"); return NextResponse.json({ country: data.country, countryCode: data.countryCode, region: data.regionName, city: data.city, timezone: data.timezone, }); } catch (error) { console.error("[GeoIP] Error:", error); return NextResponse.json({ country: "Unknown", countryCode: "XX", region: "", city: "", timezone: "", }); } }