"""
Genera un PDF con el resultado consolidado de un Grupo (materia + paralelo),
pensado para entregarse al docente evaluado.
"""
import io
from datetime import datetime

from reportlab.lib import colors
from reportlab.lib.pagesizes import letter
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm
from reportlab.platypus import (
    SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, HRFlowable,
)

TINTA = colors.HexColor("#1B2A4A")
DORADO = colors.HexColor("#B8892B")
LINEA = colors.HexColor("#D8D2C4")

NOMBRES_TIPO = {
    "ESTUDIANTE": "Encuesta a estudiantes",
    "AUTOEVALUACION": "Autoevaluación del docente",
    "DIRECTOR": "Evaluación del director de carrera",
}


def generar_pdf_resultado_grupo(grupo, resultado):
    """
    grupo: instancia de evaluacion.models.Grupo
    resultado: dict con la misma forma que devuelve la vista de resultados
               (por_tipo, participacion)
    """
    buf = io.BytesIO()
    doc = SimpleDocTemplate(
        buf, pagesize=letter,
        topMargin=2 * cm, bottomMargin=2 * cm, leftMargin=2 * cm, rightMargin=2 * cm,
    )
    styles = getSampleStyleSheet()
    titulo_style = ParagraphStyle(
        "Titulo", parent=styles["Title"], textColor=TINTA, fontSize=18, spaceAfter=4,
    )
    subtitulo_style = ParagraphStyle(
        "Subtitulo", parent=styles["Normal"], textColor=colors.grey, fontSize=10, spaceAfter=14,
    )
    seccion_style = ParagraphStyle(
        "Seccion", parent=styles["Heading2"], textColor=TINTA, fontSize=13, spaceBefore=16, spaceAfter=8,
    )
    normal_style = styles["Normal"]

    elementos = []
    elementos.append(Paragraph("Resultado de Evaluación Docente", titulo_style))
    elementos.append(Paragraph(
        f"{grupo.asignatura.nombre} · Grupo {grupo.codigo} · {grupo.gestion.nombre} · "
        f"{grupo.asignatura.carrera.nombre}",
        subtitulo_style,
    ))
    elementos.append(HRFlowable(width="100%", color=LINEA, thickness=1))
    elementos.append(Spacer(1, 10))

    datos_docente = [
        ["Docente evaluado", grupo.docente.nombre],
        ["Director de carrera", grupo.director.nombre],
        ["Fecha de emisión", datetime.now().strftime("%d/%m/%Y")],
        ["Participación", f"{resultado['participacion']['tokens_usados']} de "
                           f"{resultado['participacion']['tokens_generados']} códigos QR utilizados"],
    ]
    tabla_docente = Table(datos_docente, colWidths=[5 * cm, 10 * cm])
    tabla_docente.setStyle(TableStyle([
        ("FONTSIZE", (0, 0), (-1, -1), 9),
        ("TEXTCOLOR", (0, 0), (0, -1), colors.grey),
        ("TEXTCOLOR", (1, 0), (1, -1), TINTA),
        ("BOTTOMPADDING", (0, 0), (-1, -1), 6),
    ]))
    elementos.append(tabla_docente)

    for tipo, info in resultado["por_tipo"].items():
        elementos.append(Paragraph(NOMBRES_TIPO.get(tipo, tipo), seccion_style))

        if info["total_respuestas"] == 0:
            elementos.append(Paragraph("Sin respuestas registradas.", normal_style))
            continue

        promedio_txt = f"Promedio general: {info['promedio_general']}" if info["promedio_general"] is not None else ""
        elementos.append(Paragraph(
            f"{info['total_respuestas']} respuesta(s) registrada(s). {promedio_txt}",
            normal_style,
        ))
        elementos.append(Spacer(1, 6))

        filas = [["Pregunta", "Promedio (1-5)"]]
        for p in info["detalle_preguntas"]:
            filas.append([p["texto"], f"{p['promedio']:.2f}"])

        if len(filas) > 1:
            tabla = Table(filas, colWidths=[12.5 * cm, 3 * cm])
            tabla.setStyle(TableStyle([
                ("BACKGROUND", (0, 0), (-1, 0), TINTA),
                ("TEXTCOLOR", (0, 0), (-1, 0), colors.white),
                ("FONTSIZE", (0, 0), (-1, -1), 8.5),
                ("ALIGN", (1, 0), (1, -1), "CENTER"),
                ("GRID", (0, 0), (-1, -1), 0.5, LINEA),
                ("ROWBACKGROUNDS", (0, 1), (-1, -1), [colors.white, colors.HexColor("#F7F5F0")]),
                ("TOPPADDING", (0, 0), (-1, -1), 5),
                ("BOTTOMPADDING", (0, 0), (-1, -1), 5),
            ]))
            elementos.append(tabla)

    elementos.append(Spacer(1, 20))
    elementos.append(HRFlowable(width="100%", color=LINEA, thickness=1))
    elementos.append(Spacer(1, 6))
    elementos.append(Paragraph(
        "Documento generado automáticamente por el Sistema de Evaluación al Desempeño Docente. "
        "Las respuestas individuales de los estudiantes se mantienen anónimas.",
        ParagraphStyle("Pie", parent=styles["Normal"], fontSize=7.5, textColor=colors.grey),
    ))

    doc.build(elementos)
    buf.seek(0)
    return buf
