import argparse
from io import BytesIO
from pathlib import Path

from pypdf import PdfReader
from pypdf.errors import PdfReadError


def extract_pages(data):
    reader = PdfReader(BytesIO(data))
    if reader.is_encrypted:
        raise ValueError("Use a PDF you can open without a password for this exercise.")
    return [(number, page.extract_text().strip())
            for number, page in enumerate(reader.pages, start=1)]


def main():
    parser = argparse.ArgumentParser(description="Inspect a PDF's embedded text by page.")
    parser.add_argument("pdf", type=Path)
    parser.add_argument("--page", type=int)
    args = parser.parse_args()

    try:
        pages = extract_pages(args.pdf.read_bytes())
        if args.page is not None:
            if not 1 <= args.page <= len(pages):
                raise ValueError(f"Choose a page from 1 to {len(pages)}.")
            number, text = pages[args.page - 1]
            print(f"Page {number}\n{text or '(no embedded text)'}")
        else:
            for number, text in pages:
                message = f"{len(text)} characters" if text else "no embedded text"
                print(f"Page {number}: {message}")
    except (OSError, ValueError, PdfReadError) as error:
        raise SystemExit(str(error)) from None


if __name__ == "__main__":
    main()
