"""Render paginated table pages into a matplotlib PdfPages object."""
from __future__ import annotations

from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from matplotlib.backends.backend_pdf import PdfPages


def render_table_page_pdfpages(
    pdf: "PdfPages",
    title: str,
    rows: list[list[str]],
    col_labels: list[str],
    max_rows: int = 28,
    figsize: tuple[float, float] = (11.69, 8.27),
    fontsize: int = 8,
    dpi: int = 300,
) -> None:
    """Render rows as paginated table pages into an open PdfPages object.

    Partitions rows into chunks of max_rows and writes one A4-landscape page
    per chunk using matplotlib's table widget. Each page carries the given title.

    Args:
        pdf: An open matplotlib PdfPages context.
        title: Page title shown above the table.
        rows: List of rows, each row is a list of string cell values.
        col_labels: Column header labels.
        max_rows: Maximum rows per page before starting a new page.
        figsize: Figure size in inches (default A4 landscape 11.69x8.27).
        fontsize: Font size for table cells.
        dpi: Resolution used when saving each page.
    """
    import matplotlib
    matplotlib.use("Agg")
    import matplotlib.pyplot as plt

    # Always render at least one page; use a placeholder row when rows is empty
    chunks: list[list[list[str]]] = []
    if not rows:
        chunks = [[]]
    else:
        for start in range(0, len(rows), max_rows):
            chunks.append(rows[start: start + max_rows])

    for chunk in chunks:
        fig, ax = plt.subplots(figsize=figsize)
        ax.axis("off")
        if chunk:
            table = ax.table(cellText=chunk, colLabels=col_labels, loc="center")
            table.auto_set_font_size(False)
            table.set_fontsize(fontsize)
            table.scale(1, 1.3)
        ax.set_title(title, fontsize=14, pad=12)
        pdf.savefig(fig, dpi=dpi)
        plt.close(fig)
