import json
import os
import sys
from urllib.error import HTTPError, URLError
from urllib.parse import urlencode
from urllib.request import Request, urlopen

BASE_URL = os.environ.get("SCRIPTUREFLOW_BASE_URL", "https://scriptureflow-api-preview.pages.dev")
VERSION = os.environ.get("SCRIPTUREFLOW_VERSION", "en-kjv")


def fetch_json(url):
    request = Request(url, headers={"Accept": "application/json", "User-Agent": "ScriptureFlow-Python-Example"})
    try:
        with urlopen(request, timeout=30) as response:
            if not 200 <= response.status < 300:
                raise RuntimeError(f"ScriptureFlow request failed: HTTP {response.status}")
            return json.load(response)
    except HTTPError as error:
        details = error.read().decode("utf-8", errors="replace").strip()
        raise RuntimeError(f"ScriptureFlow request failed: HTTP {error.code} {error.reason}{f' - {details[:200]}' if details else ''}") from error
    except URLError as error:
        raise RuntimeError(f"ScriptureFlow request failed: {error.reason}") from error


def main():
    query = urlencode({"version": VERSION})
    # Quick Verse is selected at request time and may return a different verse between runs.
    data = fetch_json(f"{BASE_URL}/api/quick-verse?{query}")

    if data.get("ok") is not True:
        raise RuntimeError(f"ScriptureFlow API error: {data.get('error', 'unknown error')}")
    if not all(data.get(field) for field in ("reference", "version", "text")):
        raise RuntimeError("ScriptureFlow response is missing reference, version, or text attribution fields.")

    print(f"{data['reference']} ({data['version']})")
    print(data["text"])


if __name__ == "__main__":
    try:
        main()
    except (RuntimeError, json.JSONDecodeError) as error:
        print(error, file=sys.stderr)
        raise SystemExit(1)
