from datetime import datetime
from io import BytesIO

from fastapi import APIRouter
from fastapi.responses import Response
from reportlab.lib import colors
from reportlab.lib.enums import TA_LEFT
from reportlab.lib.pagesizes import mm
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph

from app import mongo

router = APIRouter()


@router.get("/pdf/deal/{deal_id}", tags=[""])
async def deal_shipping_pdf(deal_id: int):
    deal = await mongo.deals_collection.find_one({"id": deal_id}, {"_id": False})
    deal = (await mongo.additional_deals_data(deal, full=True))[0]

    buffer = BytesIO()
    pdfmetrics.registerFont(TTFont('Arial', 'assets/arial.ttf'))
    pdfmetrics.registerFont(TTFont('Arial Bold', 'assets/arial_bold.ttf'))

    document = SimpleDocTemplate(
        buffer,
        pagesize=(75 * mm, 120 * mm),
        leftMargin=5 * mm, rightMargin=5 * mm,
        topMargin=5 * mm, bottomMargin=5 * mm
    )

    styles = getSampleStyleSheet()
    title_style = styles['Heading1']
    title_style.fontName = 'Arial Bold'
    title_style.fontSize = 12
    title_style.alignment = 1

    normal_style = styles['Normal']
    normal_style.fontName = 'Arial'
    normal_style.fontSize = 8

    elements = [
        Paragraph("Упаковочный лист", title_style),
        Paragraph("<br/>", normal_style)
    ]

    wrapped_style = ParagraphStyle(
        name='Wrapped',
        fontName='Arial',
        fontSize=8,
        leading=10,
        wordWrap='CJK',
        alignment=TA_LEFT
    )

    data = [
        ["ID", Paragraph(str(deal['id']), wrapped_style)],
        ["Название", Paragraph(deal.get('name', ''), wrapped_style)],
        ["Клиент", Paragraph(deal.get('client', {}).get('name', ''), wrapped_style)],
        ["Склад", Paragraph(deal.get('shipmentWarehouseName', ''), wrapped_style)],
        ["Товаров", Paragraph(f'{deal.get("totalProducts", 0)} тов.', wrapped_style)],
    ]

    table = Table(data, colWidths=[30 * mm, 35 * mm])
    table.setStyle(TableStyle([
        ('FONTNAME', (0, 0), (-1, -1), 'Arial'),
        ('FONTSIZE', (0, 0), (-1, -1), 8),
        ('BOTTOMPADDING', (0, 0), (-1, -1), 4),
        ('TOPPADDING', (0, 0), (-1, -1), 4),
        ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
        ('GRID', (0, 0), (-1, -1), 0.5, colors.black),
    ]))

    elements.append(table)
    document.build(elements)

    return Response(
        content=buffer.getvalue(),
        media_type="application/pdf",
        headers={"Content-Disposition": f"inline; filename=deal_{deal_id}.pdf"}
    )
