"""
GLAMWalk -- Volume 4: Libraries & Archives
02_gutenberg_fetch_ladder.py

The complete real three-tier Gutenberg fetch pipeline: plain-text, HTML, and EPUB candidate URL lists, in the order a real production script tries them.

Source: Volume Four, Sections 1.1-1.2
Targets Python 3.11.4 -- see Volume One, Chapter 1.5/1.6.

NOTE: This script makes real network requests to a live public API.
It's safe to run as-is, but requires an internet connection.
"""

import requests

def fetch_gutenberg_text(book_id):
    url = f"https://www.gutenberg.org/cache/epub/{book_id}/pg{book_id}.txt"
    response = requests.get(url, timeout=20)
    response.raise_for_status()
    return response.text

text = fetch_gutenberg_text(1661)   # The Adventures of Sherlock Holmes
print(text[:300])


def txt_candidates(gid):
    return [
        f"https://www.gutenberg.org/cache/epub/{gid}/pg{gid}.txt",
        f"https://www.gutenberg.org/files/{gid}/{gid}-0.txt",
        f"https://www.gutenberg.org/files/{gid}/{gid}.txt",
        f"https://www.gutenberg.org/files/{gid}/{gid}-8.txt",
    ]

def html_candidates(gid):
    return [
        f"https://www.gutenberg.org/cache/epub/{gid}/pg{gid}-images.html",
        f"https://www.gutenberg.org/files/{gid}/{gid}-h/{gid}-h.htm",
        f"https://www.gutenberg.org/cache/epub/{gid}/pg{gid}.html",
    ]

def epub_candidates(gid):
    return [
        f"https://www.gutenberg.org/ebooks/{gid}.epub.noimages",
        f"https://www.gutenberg.org/cache/epub/{gid}/pg{gid}.epub.noimages",
    ]


def fetch_first_working(urls, min_bytes):
    for url in urls:
        try:
            response = requests.get(url, timeout=30)
            if response.status_code == 200 and len(response.content) > min_bytes:
                return response.content
        except requests.RequestException:
            continue
    return None
