"""BAST PDF generator — Berita Acara Serah Terima."""

import io
from datetime import datetime

from reportlab.lib import colors
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import ParagraphStyle, getSampleStyleSheet
from reportlab.lib.units import cm
from reportlab.platypus import Paragraph, SimpleDocTemplate, Spacer, Table, TableStyle


def _fmt_jakarta(dt: datetime | None) -> str:
    """Convert UTC datetime to Asia/Jakarta string, or '-' if None."""
    if dt is None:
        return "-"
    from zoneinfo import ZoneInfo
    local = dt.astimezone(ZoneInfo("Asia/Jakarta"))
    return local.strftime("%d %B %Y %H:%M WIB")


def _jakarta_now() -> str:
    from zoneinfo import ZoneInfo
    return datetime.now(ZoneInfo("Asia/Jakarta")).strftime("%d %B %Y %H:%M WIB")


def generate_bast(
    modul: str,
    record_id: int,
    spbu_name: str,
    tanggal: str,
    submitter_name: str,
    submitter_at: datetime | None,
    approver_name: str,
    approver_at: datetime | None,
    details: list[tuple[str, str]],
) -> bytes:
    """Generate a BAST PDF and return as bytes."""
    buf = io.BytesIO()
    doc = SimpleDocTemplate(buf, pagesize=A4,
                            leftMargin=2*cm, rightMargin=2*cm,
                            topMargin=2*cm, bottomMargin=2*cm)
    styles = getSampleStyleSheet()
    story = []

    title_style = ParagraphStyle("title", parent=styles["Heading1"],
                                  fontSize=14, alignment=1, spaceAfter=4)
    story.append(Paragraph("BERITA ACARA SERAH TERIMA", title_style))
    story.append(Paragraph(f"{modul.upper()} — {spbu_name}", title_style))
    story.append(Spacer(1, 0.4*cm))

    meta_style = ParagraphStyle("meta", parent=styles["Normal"], fontSize=9, leading=14)
    story.append(Paragraph(f"Tanggal Dokumen: {tanggal}", meta_style))
    story.append(Paragraph(f"Dicetak: {_jakarta_now()}", meta_style))
    story.append(Spacer(1, 0.5*cm))

    detail_data = [
        [Paragraph(f"<b>{k}</b>", meta_style), Paragraph(str(v), meta_style)]
        for k, v in details
    ]
    detail_table = Table(detail_data, colWidths=[5*cm, 12*cm])
    detail_table.setStyle(TableStyle([
        ("GRID", (0, 0), (-1, -1), 0.3, colors.grey),
        ("BACKGROUND", (0, 0), (0, -1), colors.Color(0.93, 0.93, 0.93)),
        ("VALIGN", (0, 0), (-1, -1), "TOP"),
        ("TOPPADDING", (0, 0), (-1, -1), 4),
        ("BOTTOMPADDING", (0, 0), (-1, -1), 4),
    ]))
    story.append(detail_table)

    story.append(Spacer(1, 1.5*cm))

    sig_style = ParagraphStyle("sig", parent=styles["Normal"], fontSize=9, alignment=1)
    sig_style_sm = ParagraphStyle("sig_sm", parent=styles["Normal"], fontSize=8,
                                   alignment=1, textColor=colors.grey)

    submitter_block = Paragraph(
        f"<br/><br/><br/>( {submitter_name} )"
        f"<br/><font size='8' color='grey'>{_fmt_jakarta(submitter_at)}</font>",
        sig_style,
    )
    approver_block = Paragraph(
        f"<br/><br/><br/>( {approver_name} )"
        f"<br/><font size='8' color='grey'>{_fmt_jakarta(approver_at)}</font>",
        sig_style,
    )

    sig_data = [
        ["Diserahkan oleh", "", "Diterima / Disetujui oleh"],
        [submitter_block, "", approver_block],
    ]
    sig_table = Table(sig_data, colWidths=[7*cm, 3*cm, 7*cm])
    sig_table.setStyle(TableStyle([("ALIGN", (0, 0), (-1, -1), "CENTER")]))
    story.append(sig_table)

    doc.build(story)
    return buf.getvalue()
