"""Ahrefs API v3 starter: unit-conscious backlink retrieval with bounded retries."""

import csv
import os
import time
from pathlib import Path
from typing import Any

import requests

API_ROOT = "https://api.ahrefs.com/v3"
OUTPUT_PATH = Path("ahrefs-backlinks.csv")
MAX_ATTEMPTS = 4


def request_json(session: requests.Session, url: str, params: dict[str, str | int]) -> dict[str, Any]:
    for attempt in range(MAX_ATTEMPTS):
        response = session.get(url, params=params, timeout=30)
        if response.status_code != 429:
            response.raise_for_status()
            return response.json()
        if attempt == MAX_ATTEMPTS - 1:
            response.raise_for_status()
        retry_after = response.headers.get("Retry-After")
        delay = float(retry_after) if retry_after and retry_after.replace(".", "", 1).isdigit() else 2**attempt
        time.sleep(min(delay, 30))
    raise RuntimeError("Ahrefs request failed after bounded retries.")


def main() -> None:
    api_key = os.environ.get("AHREFS_API_KEY")
    if not api_key:
        raise RuntimeError("Set AHREFS_API_KEY in the server environment.")

    session = requests.Session()
    session.headers.update({"Authorization": f"Bearer {api_key}", "Accept": "application/json"})
    params: dict[str, str | int] = {
        "target": "ahrefs.com/blog",
        "mode": "prefix",
        "limit": 100,
        "select": "url_from,url_rating_source,traffic,anchor,url_to",
    }
    payload = request_json(session, f"{API_ROOT}/site-explorer/all-backlinks", params)
    rows = payload.get("backlinks", [])
    fieldnames = ["url_from", "url_rating_source", "traffic", "anchor", "url_to"]
    with OUTPUT_PATH.open("w", newline="", encoding="utf-8") as handle:
        writer = csv.DictWriter(handle, fieldnames=fieldnames, extrasaction="ignore")
        writer.writeheader()
        writer.writerows(rows)
    print(f"Wrote {len(rows)} rows to {OUTPUT_PATH}")


if __name__ == "__main__":
    main()
