import logging
from fastapi import Request

logger = logging.getLogger("app.utils.ip_extractor")

def extract_client_ip(request: Request) -> str | None:
    """
    Extracts client IP address from HTTP request headers or direct connection host.
    Checks X-Forwarded-For header first (first entry if comma-separated list),
    falling back to direct client.host IP.
    
    Note: X-Forwarded-For should be trusted only when running behind a trusted proxy/load balancer.
    """
    user_agent = request.headers.get("user-agent", "Unknown")
    forwarded_for = request.headers.get("x-forwarded-for")
    cf_connecting_ip = request.headers.get("cf-connecting-ip")
    x_real_ip = request.headers.get("x-real-ip")
    client_host = request.client.host if request.client else None

    client_ip = None
    if forwarded_for:
        # X-Forwarded-For may be a comma-separated list of proxy IPs (e.g. "client, proxy1, proxy2")
        client_ip = forwarded_for.split(",")[0].strip() or None

    if not client_ip and client_host:
        client_ip = client_host

    print(
        f"[IP_DEBUG] UA='{user_agent[:60]}' | "
        f"X-Forwarded-For='{forwarded_for}' | "
        f"CF-Connecting-IP='{cf_connecting_ip}' | "
        f"X-Real-IP='{x_real_ip}' | "
        f"Client.Host='{client_host}' | "
        f"Resolved_IP='{client_ip}'",
        flush=True
    )

    return client_ip
