"""
Shareable verified skill badge image (Pillow).
Sized for LinkedIn / WhatsApp / Facebook: 1080×1080 square + QR to verify URL.
"""
from __future__ import annotations

import io
from pathlib import Path

from django.conf import settings
from PIL import Image, ImageDraw, ImageFont


def _font(size: int, bold: bool = False):
    candidates = []
    if bold:
        candidates += [
            '/System/Library/Fonts/Supplemental/Times New Roman Bold.ttf',
            '/System/Library/Fonts/Supplemental/Arial Bold.ttf',
            '/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf',
            '/usr/share/fonts/truetype/liberation/LiberationSerif-Bold.ttf',
        ]
    else:
        candidates += [
            '/System/Library/Fonts/Supplemental/Times New Roman.ttf',
            '/System/Library/Fonts/Supplemental/Arial.ttf',
            '/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf',
            '/usr/share/fonts/truetype/liberation/LiberationSerif-Regular.ttf',
        ]
    for path in candidates:
        if Path(path).is_file():
            try:
                return ImageFont.truetype(path, size)
            except OSError:
                continue
    return ImageFont.load_default()


def _verify_url(cert) -> str:
    from apps.courses.certificate_pdf import _verify_absolute_url
    return _verify_absolute_url(cert)


def _load_seal():
    from apps.dashboard.models import SiteSettings
    site = SiteSettings.load()
    try:
        if site.certificate_seal:
            return Image.open(site.certificate_seal.path).convert('RGBA')
    except Exception:
        pass
    for p in (
        Path(settings.BASE_DIR) / 'static' / 'images' / 'certificates' / 'golden_seal.png',
        Path(settings.BASE_DIR) / 'static' / 'images' / 'golden_seal.png',
    ):
        if p.is_file():
            return Image.open(p).convert('RGBA')
    return None


def build_badge_image_bytes(cert) -> bytes:
    """Return PNG bytes for a 1080×1080 verified skill badge."""
    import qrcode

    from apps.dashboard.models import SiteSettings

    site = SiteSettings.load()
    institute = site.institute_name or 'TSN Digital Academy'
    size = 1080
    img = Image.new('RGB', (size, size), '#0f2557')
    draw = ImageDraw.Draw(img)

    draw.rectangle([36, 36, size - 36, size - 36], outline='#c9a227', width=8)
    draw.rectangle([52, 52, size - 52, size - 52], outline='#f5e6b8', width=2)

    draw.rectangle([0, 0, size, 120], fill='#071536')
    draw.text((size // 2, 48), 'VERIFIED SKILL BADGE', fill='#f5e6b8', font=_font(36, True), anchor='mt')
    draw.text((size // 2, 92), institute.upper(), fill='#94a3b8', font=_font(22), anchor='mt')

    draw.text((size // 2, 280), cert.recipient_name, fill='#ffffff', font=_font(52, True), anchor='mm')
    draw.text((size // 2, 360), 'earned', fill='#94a3b8', font=_font(26), anchor='mm')

    title = cert.course_title_snapshot or ''
    max_w = 880
    words = title.split()
    lines, cur = [], ''
    font_title = _font(40, True)
    for w in words:
        trial = f'{cur} {w}'.strip()
        if draw.textlength(trial, font=font_title) <= max_w:
            cur = trial
        else:
            if cur:
                lines.append(cur)
            cur = w
    if cur:
        lines.append(cur)
    y = 430
    for line in lines[:3]:
        draw.text((size // 2, y), line, fill='#fbbf24', font=font_title, anchor='mm')
        y += 52

    draw.text((size // 2, y + 20), cert.score_band_label, fill='#e2e8f0', font=_font(28), anchor='mm')
    assessment = getattr(cert, 'assessment_label', None) or 'Knowledge Assessment'
    draw.text((size // 2, y + 58), assessment, fill='#f5e6b8', font=_font(22), anchor='mm')

    seal = _load_seal()
    if seal:
        seal = seal.resize((180, 180), Image.Resampling.LANCZOS)
        img.paste(seal, (size // 2 - 90, 620), seal)

    verify = _verify_url(cert)
    qr = qrcode.QRCode(box_size=6, border=1)
    qr.add_data(verify)
    qr.make(fit=True)
    qr_img = qr.make_image(fill_color='#0f172a', back_color='white').convert('RGB')
    qr_img = qr_img.resize((160, 160), Image.Resampling.LANCZOS)
    img.paste(qr_img, (size - 220, size - 240))

    draw.text((80, size - 120), cert.certificate_number, fill='#cbd5e1', font=_font(22), anchor='lt')
    draw.text((80, size - 80), 'Scan QR or visit verify URL', fill='#64748b', font=_font(18), anchor='lt')
    issued = cert.issued_at.strftime('%Y-%m-%d') if cert.issued_at else ''
    draw.text((80, size - 50), f'Issued {issued}', fill='#64748b', font=_font(18), anchor='lt')

    out = io.BytesIO()
    img.save(out, format='PNG', optimize=True)
    return out.getvalue()
