#!/usr/bin/env python3
"""Folie 9 – Golden Master (adesso-Stil, deutsch, dunkelblau).
Was ist das? · Vorgehen (3 Schritte) · Nutzen 1 + Nutzen 2."""

import os
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
from pptx.enum.shapes import MSO_SHAPE, MSO_CONNECTOR
from pptx.oxml.ns import qn
from adesso_style import (WHITE, INK, BLUE, TEAL, GREEN, CORAL, LIGHT, MUTE, RECF,
                          F, FC, chrome)

BG = RGBColor(0x0A, 0x3D, 0x6B)

prs = Presentation(); prs.slide_width = Inches(13.333); prs.slide_height = Inches(7.5)
SW, SH = prs.slide_width, prs.slide_height
s = prs.slides.add_slide(prs.slide_layouts[6])


def shp(kind, x, y, w, h, fill=None, line=None, lw=Pt(1), adj=None):
    sh = s.shapes.add_shape(kind, Inches(x), Inches(y), Inches(w), Inches(h))
    if fill is None: sh.fill.background()
    else: sh.fill.solid(); sh.fill.fore_color.rgb = fill
    if line is None: sh.line.fill.background()
    else: sh.line.color.rgb = line; sh.line.width = lw
    if adj is not None:
        try: sh.adjustments[0] = adj
        except Exception: pass
    sh.shadow.inherit = False
    return sh


def txt(x, y, w, h, t, size=12, color=WHITE, bold=False, italic=False,
        align=PP_ALIGN.LEFT, font=F, anchor=MSO_ANCHOR.MIDDLE):
    tb = s.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h)); tf = tb.text_frame
    tf.word_wrap = True; tf.vertical_anchor = anchor
    tf.margin_left = tf.margin_right = tf.margin_top = tf.margin_bottom = Pt(0)
    first = True
    for line in t.split("\n"):
        p = tf.paragraphs[0] if first else tf.add_paragraph(); first = False
        p.alignment = align
        r = p.add_run(); r.text = line
        r.font.size = Pt(size); r.font.bold = bold; r.font.italic = italic
        r.font.name = font; r.font.color.rgb = color
    return tb


def conn(x1, y1, x2, y2, color=LIGHT, w=2.0):
    c = s.shapes.add_connector(MSO_CONNECTOR.STRAIGHT, Inches(x1), Inches(y1),
                               Inches(x2), Inches(y2))
    c.line.color.rgb = color; c.line.width = Pt(w); c.shadow.inherit = False
    ln = c.line._get_or_add_ln()
    ln.append(ln.makeelement(qn('a:tailEnd'), {'type': 'triangle'}))
    return c


def heading(x, y, t):
    shp(MSO_SHAPE.RECTANGLE, x, y + 0.05, 0.16, 0.20, fill=CORAL)
    txt(x + 0.26, y - 0.04, 8.0, 0.34, t, size=15, color=WHITE, bold=True,
        anchor=MSO_ANCHOR.MIDDLE)


def step(x, y, w, h, num, title, sub):
    shp(MSO_SHAPE.ROUNDED_RECTANGLE, x, y, w, h, fill=WHITE, adj=0.08)
    shp(MSO_SHAPE.OVAL, x + 0.16, y + 0.16, 0.42, 0.42, fill=BLUE)
    txt(x + 0.16, y + 0.16, 0.42, 0.42, str(num), size=15, color=WHITE, bold=True,
        align=PP_ALIGN.CENTER)
    txt(x + 0.70, y + 0.14, w - 0.85, 0.34, title, size=13, color=INK, bold=True,
        anchor=MSO_ANCHOR.TOP)
    txt(x + 0.70, y + 0.50, w - 0.85, h - 0.60, sub, size=10.5, color=MUTE,
        anchor=MSO_ANCHOR.TOP)


def nutzen(x, y, w, h, title, body):
    shp(MSO_SHAPE.ROUNDED_RECTANGLE, x, y, w, h, fill=WHITE, adj=0.05)
    shp(MSO_SHAPE.RECTANGLE, x, y + 0.16, 0.13, h - 0.32, fill=CORAL)
    txt(x + 0.34, y + 0.20, w - 0.55, 0.40, title, size=15, color=INK, bold=True,
        anchor=MSO_ANCHOR.TOP)
    txt(x + 0.34, y + 0.70, w - 0.6, h - 0.85, body, size=12, color=INK,
        anchor=MSO_ANCHOR.TOP)


# ---- Hintergrund + Header --------------------------------------------------
shp(MSO_SHAPE.RECTANGLE, 0, 0, SW.inches, SH.inches, fill=BG)
chrome(s, "Golden Master", 10)

# ---- Was ist das? ----------------------------------------------------------
heading(0.50, 1.22, "Was ist das?")
shp(MSO_SHAPE.ROUNDED_RECTANGLE, 0.50, 1.58, 12.33, 0.82, fill=WHITE, adj=0.06)
txt(0.78, 1.58, 11.8, 0.82,
    "Ein umfassender Acceptance-/Approval-Test der Software: Das System wird als Ganzes gegen einen "
    "einmal erfassten, freigegebenen Referenz-Stand („Golden Master“) geprüft — weicht ein "
    "Ergebnis ab, schlägt der Test an.",
    size=12.5, color=INK)

# ---- Vorgehen --------------------------------------------------------------
heading(0.50, 2.64, "Vorgehen")
SY, SH_ = 3.00, 1.06
step(0.50, SY, 3.70, SH_, 1, "Code- & Ergebnis-Analyse",
     "Prüfen, wie die Software arbeitet und wie/wo Ergebnisse abgelegt werden.")
step(4.82, SY, 3.70, SH_, 2, "Testtool aufbauen",
     "Werkzeug, das Referenz-Ergebnisse erfasst und bei jedem Lauf vergleicht.")
step(9.13, SY, 3.70, SH_, 3, "Test-Suite (Fachseite)",
     "Die FS baut die fachlichen Testfälle / Szenarien auf.")
conn(4.24, SY + SH_ / 2, 4.78, SY + SH_ / 2)
conn(8.56, SY + SH_ / 2, 9.09, SY + SH_ / 2)

# ---- Nutzen ----------------------------------------------------------------
heading(0.50, 4.34, "Nutzen")
NY, NH = 4.70, 2.02
nutzen(0.50, NY, 6.00, NH, "Nutzen 1 · Funktionssicherung CLAB",
       "Nach jeder Änderung lässt sich die Funktionsfähigkeit der Software prüfen — "
       "schnelle, wiederholbare Regressionssicherheit ohne manuelles Nachtesten.")
nutzen(6.83, NY, 6.00, NH, "Nutzen 2 · Vollständigkeit bei LIS-Migration",
       "Ein Ziel-LIS, auf das migriert werden soll, lässt sich hart gegen die eigenen "
       "Anforderungen testen.\n\n⚠ Setzt ein neues Aufsetzen des Testtools voraus.")

out = os.path.join(os.path.dirname(os.path.abspath(__file__)), "Folie9.pptx")
prs.save(out)
print("saved", out)
