#!/usr/bin/env python3
"""
Aperçu rapide de `core/design_kit.py` — un slide par élément du socle visuel
(palette, police, puis une forme par fonction du kit), pour ouvrir le fichier
dans PowerPoint et juger à l'œil plutôt que de deviner depuis le code.

Pas un test automatisé : `reporter/` n'en a pas côté Python, ce script
remplit le même rôle que "générer un vrai fichier et le regarder" ailleurs
dans ce module. Une forme pas encore implémentée (`NotImplementedError`)
produit un slide qui le dit, plutôt que de faire planter tout le script —
relançable à chaque fonction codée dans `design_kit.py`.

Usage :
    cd reporter && python3 preview_design_kit.py
    → preview_design_kit.pptx, à la racine de reporter/
"""

from __future__ import annotations  # PEP 585 sans Python 3.9 : l'hébergement est en 3.7


from pptx import Presentation
from pptx.util import Inches, Pt

import core.design_kit as dk


OUT_PATH = "preview_design_kit.pptx"

# Layout vierge du template par défaut de python-pptx (pas le template
# Oncopole — ce script vérifie le socle de formes/couleurs/police en
# isolation, pas l'habillage du master, qui est un chantier à part).
BLANK_LAYOUT_IDX = 6


def add_title(slide, text: str) -> None:
    box = slide.shapes.add_textbox(Inches(0.5), Inches(0.3), Inches(9), Inches(0.6))
    run = box.text_frame.paragraphs[0].add_run()
    run.text = text
    run.font.name = dk.FONT_TITLE
    run.font.size = Pt(36)
    run.font.color.rgb = dk.rgb(dk.ORANGE)


def add_caption(slide, text: str, y: float = 4.5) -> None:
    box = slide.shapes.add_textbox(Inches(0.5), Inches(y), Inches(9), Inches(0.4))
    run = box.text_frame.paragraphs[0].add_run()
    run.text = text
    run.font.name = dk.FONT_BODY
    run.font.size = Pt(12)
    run.font.color.rgb = dk.rgb(dk.TEXT_DARK)


def slide_palette(prs: Presentation) -> None:
    slide = prs.slides.add_slide(prs.slide_layouts[BLANK_LAYOUT_IDX])
    add_title(slide, "Palette — titres en DINRoundPro")

    swatches = [
        ("ORANGE", dk.ORANGE),
        ("BLUE_DARK", dk.BLUE_DARK),
        ("GRAY_LIGHT", dk.GRAY_LIGHT),
        ("GRAY_BORDER", dk.GRAY_BORDER),
    ]
    x = Inches(0.5)
    for label, hex_value in swatches:
        rect = slide.shapes.add_shape(1, x, Inches(1.3), Inches(2), Inches(1))  # 1 = RECTANGLE
        rect.fill.solid()
        rect.fill.fore_color.rgb = dk.rgb(hex_value)
        rect.line.color.rgb = dk.rgb(dk.TEXT_DARK)
        rect.line.width = Pt(0.75)
        add_caption(slide, f"{label} · #{hex_value}", y=2.4)
        x += Inches(2.3)


def slide_shape(prs: Presentation, name: str, build) -> None:
    slide = prs.slides.add_slide(prs.slide_layouts[BLANK_LAYOUT_IDX])
    add_title(slide, name)

    try:
        build(slide)
    except NotImplementedError:
        add_caption(slide, "Pas encore implémenté dans design_kit.py.", y=1.5)


def main() -> None:
    prs = Presentation()
    prs.slide_width = dk.SLIDE_W
    prs.slide_height = dk.SLIDE_H

    slide_palette(prs)

    slide_shape(
        prs, "add_rounded_rect_soft()",
        lambda slide: dk.add_rounded_rect_soft(slide, Inches(1), Inches(1.5), Inches(6), Inches(2.5)),
    )
    slide_shape(
        prs, "add_rounded_rect_outline()",
        lambda slide: dk.add_rounded_rect_outline(slide, Inches(1), Inches(1.5), Inches(6), Inches(2.5)),
    )
    slide_shape(
        prs, "add_separator_line() — sans dégradé",
        lambda slide: dk.add_separator_line(slide, Inches(1), Inches(2.5), Inches(8), Pt(1.5), gradient=False)
    )
    slide_shape(
        prs, "add_separator_line() — avec dégradé",
        lambda slide: dk.add_separator_line(slide, Inches(1), Inches(2.5), Inches(8), Pt(1.5), gradient=True),
    )

    prs.save(OUT_PATH)
    print(f"→ {OUT_PATH}")


if __name__ == "__main__":
    main()
