import json
import os
import sys
from pathlib import Path
from urllib.error import HTTPError
from urllib.parse import quote
from urllib.request import Request, urlopen

api_key = os.environ.get("TEMPLATR_API_KEY")
template_id = os.environ.get("TEMPLATR_TEMPLATE_ID")
if not api_key or not template_id:
    raise SystemExit("Set TEMPLATR_API_KEY and TEMPLATR_TEMPLATE_ID first.")

input_path = Path(sys.argv[1] if len(sys.argv) > 1 else "invoice-data.json")
data = json.loads(input_path.read_text(encoding="utf-8"))
base_url = os.environ.get("TEMPLATR_API_BASE_URL", "https://api.templatr.app")
request = Request(
    f"{base_url}/pdf/{quote(template_id, safe='')}?format=pdf",
    data=json.dumps(data).encode("utf-8"),
    headers={"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"},
    method="POST",
)
try:
    with urlopen(request, timeout=60) as response:
        if response.headers.get_content_type() != "application/pdf":
            raise SystemExit("Expected an application/pdf response.")
        pdf = response.read()
except HTTPError as error:
    raise SystemExit(f"PDF request failed (HTTP {error.code}). Check the API error guide.") from None

if not pdf.startswith(b"%PDF-"):
    raise SystemExit("Response does not contain a PDF.")
output_path = Path(sys.argv[2] if len(sys.argv) > 2 else "invoice.pdf")
output_path.write_bytes(pdf)
print("PDF saved.")
