from io import BytesIO

from openpyxl import Workbook
from openpyxl.styles import Font
from reportlab.lib import colors
from reportlab.lib.pagesizes import A4, landscape
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import Paragraph, SimpleDocTemplate, Spacer, Table, TableStyle

from app.schemas.reports import ReportResponse


def export_report_xlsx(report: ReportResponse) -> bytes:
    workbook = Workbook()
    sheet = workbook.active
    sheet.title = report.title[:31]

    sheet.append([report.title])
    sheet["A1"].font = Font(bold=True, size=14)
    sheet.append([])

    headers = [col.label for col in report.columns]
    sheet.append(headers)
    for cell in sheet[sheet.max_row]:
        cell.font = Font(bold=True)

    for row in report.rows:
        sheet.append([row.get(col.key, "") for col in report.columns])

    if report.summary:
        sheet.append([])
        sheet.append(["Summary"])
        sheet[sheet.max_row][0].font = Font(bold=True)
        for key, value in report.summary.items():
            sheet.append([key.replace("_", " ").title(), value])

    buffer = BytesIO()
    workbook.save(buffer)
    return buffer.getvalue()


def export_report_pdf(report: ReportResponse) -> bytes:
    buffer = BytesIO()
    doc = SimpleDocTemplate(buffer, pagesize=landscape(A4), title=report.title)
    styles = getSampleStyleSheet()
    elements = [Paragraph(report.title, styles["Title"]), Spacer(1, 12)]

    if report.summary:
        summary_parts = [f"<b>{k.replace('_', ' ').title()}:</b> {v}" for k, v in report.summary.items()]
        elements.append(Paragraph(" &nbsp;|&nbsp; ".join(summary_parts), styles["Normal"]))
        elements.append(Spacer(1, 12))

    headers = [col.label for col in report.columns]
    data = [headers]
    for row in report.rows:
        data.append([str(row.get(col.key, "") if row.get(col.key) is not None else "") for col in report.columns])

    if len(data) == 1:
        data.append(["No data"])

    table = Table(data, repeatRows=1)
    table.setStyle(
        TableStyle(
            [
                ("BACKGROUND", (0, 0), (-1, 0), colors.HexColor("#2563eb")),
                ("TEXTCOLOR", (0, 0), (-1, 0), colors.white),
                ("FONTNAME", (0, 0), (-1, 0), "Helvetica-Bold"),
                ("FONTSIZE", (0, 0), (-1, -1), 8),
                ("GRID", (0, 0), (-1, -1), 0.5, colors.grey),
                ("ROWBACKGROUNDS", (0, 1), (-1, -1), [colors.white, colors.HexColor("#f8fafc")]),
                ("VALIGN", (0, 0), (-1, -1), "TOP"),
            ]
        )
    )
    elements.append(table)
    doc.build(elements)
    return buffer.getvalue()
