import io

from reportlab.lib.colors import HexColor, white
from reportlab.lib.pagesizes import LETTER
from reportlab.pdfbase.pdfmetrics import stringWidth
from reportlab.pdfgen import canvas

from app.core.timezone import santiago_text


RED = HexColor("#E60000")
INK = HexColor("#111111")
MUTED = HexColor("#687085")
SURFACE = HexColor("#F5F6F8")
BORDER = HexColor("#E3E6EB")


def _money(value) -> str:
    return f"${float(value):,.0f}".replace(",", ".")


def draw_documenta_logo(pdf: canvas.Canvas, x: float, y: float, *, compact: bool = False,
                        inverse: bool = False) -> None:
    """Dibuja la marca Documenta sin depender de recursos externos al contenedor."""
    size = 15 if compact else 22
    brand_color = white if inverse else RED
    pdf.setFillColor(brand_color)
    pdf.setFont("Helvetica-Bold", size)
    pdf.drawString(x, y, "D")
    pdf.setFont("Helvetica-Bold", 9 if compact else 15)
    label_x = x + size * .82
    pdf.drawString(label_x, y + (3 if compact else 4), "Documenta")
    dot_x = label_x + stringWidth("Documenta", "Helvetica-Bold", 9 if compact else 15)
    pdf.drawString(dot_x, y + (3 if compact else 4), ".")


def draw_pdf_footer(pdf: canvas.Canvas, _document=None, *, verification_code: str | None = None) -> None:
    width, _ = LETTER
    pdf.saveState()
    pdf.setStrokeColor(BORDER)
    pdf.line(42, 42, width - 42, 42)
    draw_documenta_logo(pdf, 42, 19, compact=True)
    pdf.setFillColor(MUTED)
    pdf.setFont("Helvetica", 8)
    footer = "https://documenta.cl"
    if verification_code:
        footer += f"  ·  Verificación: {verification_code}"
    pdf.drawRightString(width - 42, 25, footer)
    pdf.restoreState()


def build_payment_receipt(row) -> bytes:
    output = io.BytesIO()
    pdf = canvas.Canvas(output, pagesize=LETTER)
    width, height = LETTER
    pdf.setTitle(f"Comprobante {row['numero_publico']}")

    pdf.setFillColor(SURFACE)
    pdf.rect(0, 0, width, height, fill=1, stroke=0)
    pdf.setFillColor(white)
    pdf.roundRect(36, 70, width - 72, height - 112, 18, fill=1, stroke=0)
    pdf.setFillColor(RED)
    pdf.roundRect(36, height - 182, width - 72, 140, 18, fill=1, stroke=0)
    pdf.rect(36, height - 164, width - 72, 122, fill=1, stroke=0)

    draw_documenta_logo(pdf, 60, height - 91, inverse=True)
    pdf.setFillColor(white)
    pdf.setFont("Helvetica-Bold", 10)
    pdf.drawString(60, height - 124, "COMPROBANTE DE PAGO")
    pdf.setFont("Helvetica-Bold", 25)
    pdf.drawString(60, height - 155, "Pago confirmado")
    pdf.setFont("Helvetica", 10)
    pdf.drawRightString(width - 60, height - 79, str(row["numero_publico"]))

    pdf.setFillColor(INK)
    pdf.setFont("Helvetica", 10)
    pdf.drawString(60, height - 220, "Monto pagado")
    pdf.setFont("Helvetica-Bold", 28)
    pdf.drawString(60, height - 255, f"{_money(row['monto'])} {row['moneda']}")

    details = [
        ("Folio", row["numero_publico"]),
        ("Servicio", row.get("materia") or "Trámite digital"),
        ("Entidad", row["nombre_fantasia"]),
        ("Orden de compra", row["buy_order"]),
        ("Código de autorización", row["codigo_autorizacion"] or "No informado"),
        ("Medio de pago", row.get("proveedor_codigo") or row.get("tipo_pago") or "Pago electrónico"),
        ("Fecha de confirmación", santiago_text(row["confirmado_en"])),
    ]
    y = height - 310
    for index, (label, value) in enumerate(details):
        if index:
            pdf.setStrokeColor(BORDER)
            pdf.line(60, y + 13, width - 60, y + 13)
        pdf.setFillColor(MUTED)
        pdf.setFont("Helvetica", 9)
        pdf.drawString(60, y, label)
        pdf.setFillColor(INK)
        pdf.setFont("Helvetica-Bold", 9)
        pdf.drawRightString(width - 60, y, str(value))
        y -= 37

    pdf.setFillColor(MUTED)
    pdf.setFont("Helvetica", 8)
    pdf.drawString(60, 88, "Comprobante informativo emitido por Documenta.")
    draw_pdf_footer(pdf)
    pdf.save()
    return output.getvalue()
