"""客户端 IP / 局域网判断。"""

from __future__ import annotations

import ipaddress

from fastapi import Request


def client_ip(request: Request) -> str:
    xff = request.headers.get("x-forwarded-for") or ""
    if xff.strip():
        return xff.split(",")[0].strip()
    if request.client and request.client.host:
        return request.client.host
    return ""


def is_lan_ip(ip: str) -> bool:
    raw = (ip or "").strip()
    if not raw:
        return False
    if raw in ("localhost", "::1"):
        return True
    try:
        addr = ipaddress.ip_address(raw.split("%")[0])
    except ValueError:
        return False
    return bool(addr.is_loopback or addr.is_private)
