"""Small IPinfo Lite enrichment example. Does not scan the supplied addresses."""

import ipaddress
import json
import os
import sys
import time
from datetime import datetime, timezone

import requests

CACHE_TTL = 3600
cache = {}


def enrich_ip(value, session, token):
    try:
        address = ipaddress.ip_address(value)
    except ValueError:
        return {"ip": value, "status": "invalid_ip"}
    ip = str(address)
    if not address.is_global:
        return {"ip": ip, "status": "skipped_non_public"}
    if not token:
        return {"ip": ip, "status": "missing_token"}

    now = time.monotonic()
    cached = cache.get(ip)
    if cached and now - cached[0] < CACHE_TTL:
        return {**cached[1], "cache_hit": True}

    try:
        response = session.get(
            f"https://api.ipinfo.io/lite/{ip}",
            headers={"Authorization": f"Bearer {token}"},
            timeout=(3, 10),
            allow_redirects=False,
        )
        if response.status_code != 200:
            return {"ip": ip, "status": "lookup_failed",
                    "http_status": response.status_code}
        data = response.json()
        if not isinstance(data, dict) or data.get("ip") != ip:
            return {"ip": ip, "status": "invalid_response"}
        result = {
            "ip": ip, "status": "ok", "source": "ipinfo_lite",
            "asn": data.get("asn"), "org": data.get("as_name"),
            "country_code": data.get("country_code"),
            "enriched_at": datetime.now(timezone.utc).isoformat(),
            "cache_hit": False,
        }
        cache[ip] = (time.monotonic(), result)
        return result
    except (requests.RequestException, ValueError):
        return {"ip": ip, "status": "lookup_failed"}


if __name__ == "__main__":
    token = os.environ.get("IPINFO_TOKEN", "")
    if not token:
        sys.exit("Set IPINFO_TOKEN before running this example.")
    # Public resolvers are benign examples, not honeypot indicators.
    ips = sys.argv[1:] or ["8.8.8.8", "1.1.1.1"]
    with requests.Session() as session:
        results = []
        for ip in ips:
            results.append(enrich_ip(ip, session, token))
            time.sleep(0.5)
    print(json.dumps(results, indent=2))
