"""
Génération du certificat PDF après validation d'une formation.
Format CARRÉ (hauteur = largeur), style certificat de formation avec cadre orné,
sceau central, blocs date / n° série, signataires. Données GOON – Sénégal Academy.
"""
import io
import hashlib
from datetime import datetime
from django.conf import settings

from reportlab.lib import colors
from reportlab.pdfgen import canvas


# Format carré (ex: 595 pt ≈ 21 cm)
CERT_SIZE = 595
MARGIN = 36
INNER = MARGIN + 24  # bordure ornée
GREEN = colors.HexColor("#0f3d2b")
GREEN_LIGHT = colors.HexColor("#1B4332")
GRAY = colors.HexColor("#374151")
GRAY_LIGHT = colors.HexColor("#6B7280")

_MOIS = (
    "janvier", "février", "mars", "avril", "mai", "juin",
    "juillet", "août", "septembre", "octobre", "novembre", "décembre",
)


def _serial_number(user, formation, status_obj):
    """Génère un numéro de série unique et lisible."""
    raw = f"GOON-{formation.id}-{user.id}-{getattr(status_obj, 'completed_at', '')}"
    h = hashlib.sha256(raw.encode()).hexdigest()
    return h[:12].upper()


def get_certificate_context(user, formation, status_obj):
    """
    Retourne le contexte Django pour le template certificate/index.html.
    """
    completed_at = getattr(status_obj, "completed_at", None) or datetime.now()
    if hasattr(completed_at, "strftime"):
        completion_date = f"{completed_at.day:02d}/{completed_at.month:02d}/{completed_at.year}"
        completion_year = str(completed_at.year)
    else:
        completion_date = str(completed_at)[:10]
        completion_year = completion_date[:4] if len(completion_date) >= 4 else str(datetime.now().year)
    full_name = f"{getattr(user, 'first_name', '') or ''} {getattr(user, 'last_name', '') or ''}".strip()
    if not full_name:
        full_name = getattr(user, "email", "Participant")
    return {
        "site_name": getattr(settings, "SITE_NAME", "GOON – Sénégal Academy"),
        "recipient_name": full_name,
        "formation_title": formation.title,
        "completion_date": completion_date,
        "completion_year": completion_year,
        "score": getattr(status_obj, "final_score", None),
        "serial_number": _serial_number(user, formation, status_obj),
        "signatory_left_name": getattr(settings, "CERTIFICATE_SIGNATORY_LEFT_NAME", "GOON Academy"),
        "signatory_left_title": getattr(settings, "CERTIFICATE_SIGNATORY_LEFT_TITLE", "Direction pédagogique"),
        "signatory_right_name": getattr(settings, "CERTIFICATE_SIGNATORY_RIGHT_NAME", "Sénégal Academy"),
        "signatory_right_title": getattr(settings, "CERTIFICATE_SIGNATORY_RIGHT_TITLE", "Validation des compétences"),
    }


def _draw_ornate_border(c, size, margin, inner):
    """Cadre orné type certificat : double rectangle + motifs aux coins."""
    # Rectangle extérieur vert
    c.setStrokeColor(GREEN)
    c.setLineWidth(2.5)
    c.rect(margin, margin, size - 2 * margin, size - 2 * margin, stroke=1, fill=0)
    # Rectangle intérieur
    c.setLineWidth(1)
    c.rect(inner, inner, size - 2 * inner, size - 2 * inner, stroke=1, fill=0)
    # Rosettes aux 4 coins (cercles ornés)
    r = 10
    for (x, y) in [
        (inner + r + 4, inner + r + 4),
        (size - inner - r - 4, inner + r + 4),
        (size - inner - r - 4, size - inner - r - 4),
        (inner + r + 4, size - inner - r - 4),
    ]:
        c.circle(x, y, r, stroke=1, fill=0)
        c.setLineWidth(0.5)
        c.circle(x, y, r - 4, stroke=1, fill=0)
        c.setLineWidth(1)


def _draw_seal(c, cx, cy, year_str):
    """Sceau central avec année et « DÉLIVRE »."""
    r_out = 42
    r_in = 32
    c.setFillColor(colors.HexColor("#d4a853"))
    c.setStrokeColor(GREEN)
    c.setLineWidth(1.5)
    c.circle(cx, cy, r_out, fill=1, stroke=1)
    c.setFillColor(colors.white)
    c.circle(cx, cy, r_in, fill=1, stroke=1)
    c.setFillColor(GREEN)
    c.setFont("Helvetica-Bold", 14)
    c.drawCentredString(cx, cy + 4, year_str)
    c.setFont("Helvetica", 8)
    c.drawCentredString(cx, cy - 12, "DÉLIVRÉ")


def _wrap(c, text, font, size, max_width):
    """Découpe un texte en lignes ne dépassant pas max_width."""
    lines = []
    for word in text.split():
        if not lines:
            lines.append(word)
            continue
        test = lines[-1] + " " + word
        if c.stringWidth(test, font, size) <= max_width:
            lines[-1] = test
        else:
            lines.append(word)
    return lines


def build_certificate_pdf(user, formation, status_obj):
    """
    Génère un PDF de certificat carré (hauteur = largeur) pour un utilisateur
    ayant validé la formation. Style inspiré du modèle : cadre orné vert,
    titre, présenté à, nom, description, blocs date / n° série, signataires, sceau.
    """
    buffer = io.BytesIO()
    c = canvas.Canvas(buffer, pagesize=(CERT_SIZE, CERT_SIZE))
    w = CERT_SIZE
    h = CERT_SIZE

    # Fond blanc
    c.setFillColor(colors.white)
    c.rect(0, 0, w, h, fill=1, stroke=0)

    # Bordure ornée
    _draw_ornate_border(c, CERT_SIZE, MARGIN, INNER)

    # Zone utile
    x_center = w / 2
    y = h - INNER - 28

    # --- Établissement (nos infos) ---
    site_name = getattr(settings, "SITE_NAME", "GOON – Sénégal Academy")
    c.setFillColor(GRAY)
    c.setFont("Helvetica", 10)
    c.drawCentredString(x_center, y, site_name)
    y -= 22

    # --- Titre certificat ---
    c.setFillColor(GREEN)
    c.setFont("Helvetica-Bold", 16)
    c.drawCentredString(x_center, y, "CERTIFICAT DE FORMATION")
    y -= 28

    # --- « Est fièrement présenté à » ---
    c.setFillColor(GRAY_LIGHT)
    c.setFont("Helvetica", 10)
    c.drawCentredString(x_center, y, "Est fièrement présenté à")
    y -= 32

    # --- Nom du participant ---
    full_name = f"{user.first_name or ''} {user.last_name or ''}".strip() or user.email
    c.setFillColor(colors.HexColor("#111827"))
    c.setFont("Helvetica-Bold", 20)
    c.drawCentredString(x_center, y, full_name)
    y -= 36

    # --- Description (formation + expertise) ---
    desc = (
        f'Pour avoir suivi et validé avec succès la formation '
        f'« {formation.title} ». '
    )
    score = getattr(status_obj, "final_score", None)
    if score is not None:
        desc += f"Score au quiz final : {score} / 15."
    c.setFillColor(GRAY)
    c.setFont("Helvetica", 9)
    max_text_w = w - 2 * INNER - 20
    for line in _wrap(c, desc, "Helvetica", 9, max_text_w):
        c.drawCentredString(x_center, y, line)
        y -= 14
    y -= 16

    # --- Blocs Date et N° série ---
    completed_at = getattr(status_obj, "completed_at", None) or datetime.now()
    if hasattr(completed_at, "strftime"):
        date_str = f"{completed_at.day:02d}/{completed_at.month:02d}/{completed_at.year}"
    else:
        date_str = str(completed_at)[:10]
    serial = _serial_number(user, formation, status_obj)
    box_h = 28
    box_w = 180
    box_y = y - box_h - 8
    # Bloc date
    c.setFillColor(GREEN)
    c.roundRect(x_center - box_w - 12, box_y, box_w, box_h, 6, fill=1, stroke=0)
    c.setFillColor(colors.white)
    c.setFont("Helvetica", 9)
    c.drawCentredString(x_center - box_w / 2 - 12, box_y + 10, f"Date de délivrance : {date_str}")
    # Bloc n° série
    c.setFillColor(GREEN)
    c.roundRect(x_center + 12, box_y, box_w, box_h, 6, fill=1, stroke=0)
    c.setFillColor(colors.white)
    c.drawCentredString(x_center + box_w / 2 + 12, box_y + 10, f"N° série : {serial}")
    y = box_y - 28

    # --- Signataires + Sceau ---
    seal_x = x_center
    seal_y = y - 50
    sig_y_name = seal_y - 28
    sig_y_title = seal_y - 42
    # Sceau central (année de délivrance)
    year_str = str(completed_at.year) if hasattr(completed_at, "year") else str(datetime.now().year)
    _draw_seal(c, seal_x, seal_y, year_str)
    # Signataire gauche (nos infos)
    left_name = getattr(settings, "CERTIFICATE_SIGNATORY_LEFT_NAME", "GOON Academy")
    left_title = getattr(settings, "CERTIFICATE_SIGNATORY_LEFT_TITLE", "Direction pédagogique")
    c.setFillColor(GRAY)
    c.setFont("Helvetica", 10)
    c.drawString(INNER + 20, sig_y_name, left_name)
    c.setFont("Helvetica", 8)
    c.setFillColor(GRAY_LIGHT)
    c.drawString(INNER + 20, sig_y_title, left_title)
    # Signataire droite
    right_name = getattr(settings, "CERTIFICATE_SIGNATORY_RIGHT_NAME", "Sénégal Academy")
    right_title = getattr(settings, "CERTIFICATE_SIGNATORY_RIGHT_TITLE", "Validation des compétences")
    c.setFillColor(GRAY)
    c.setFont("Helvetica", 10)
    c.drawRightString(w - INNER - 20, sig_y_name, right_name)
    c.setFont("Helvetica", 8)
    c.setFillColor(GRAY_LIGHT)
    c.drawRightString(w - INNER - 20, sig_y_title, right_title)

    # Mention en bas
    c.setFillColor(GRAY_LIGHT)
    c.setFont("Helvetica", 7)
    c.drawCentredString(x_center, MARGIN + 14, "Document délivré électroniquement. Certificat de complétion de formation.")
    c.drawCentredString(x_center, MARGIN + 6, site_name)

    c.showPage()
    c.save()
    pdf_bytes = buffer.getvalue()
    buffer.close()
    return pdf_bytes
