// @help https://ppptools.happy-pc.ch/help/de/parametrisierte-snippets
// @param asset  Land        "Land"                  source="countries.csv" labelcol="de" valuecol="de" previewcol="png_1x1"  default="Schweiz"  tooltip="Land waehlen - die Vorschau zeigt die Flagge (PNG). Die Liste stammt aus countries.csv im Snippet-Ordner."
// @param enum   Dateiformat "Dateiformat"           options="PNG (Bild)|SVG (Vektor)"  default="PNG (Bild)"  tooltip="PNG = ein einzelnes Bild, Rahmen sitzt sauber aussen. SVG = Vektor, verlustfrei skalierbar, wird von PowerPoint aber als Gruppe eingefuegt - der Rahmen wird dann als eigenes Rechteck darueber gelegt."
// @param enum   Format      "Seitenverhaeltnis"     options="1:1 (quadratisch)|4:3 (klassisch)"  default="4:3 (klassisch)"  tooltip="1:1 = quadratisch zugeschnitten, 4:3 = klassische Flaggenform"
// @param float  Breite      "Breite (pt)"           default=120  min=8  max=720  tooltip="Breite der Flagge in Punkten (72 pt = 2.54 cm). Die Hoehe ergibt sich aus dem Seitenverhaeltnis."
// @param bool   Rahmen      "Rahmen anzeigen"       default=true              tooltip="Duenne Konturlinie um die Flagge - hilft bei Flaggen mit weissem Rand (z.B. Japan)"
// @param color  Rahmenfarbe "Rahmenfarbe"           default=#7F7F7F           tooltip="Farbe der Konturlinie"
// @param float  Rahmenstaerke "Rahmenstaerke (pt)"  default=0.75  min=0.25  max=10  tooltip="Dicke der Konturlinie in Punkten"
// @param bool   Beschriftung "Laendername anzeigen" default=false            tooltip="Setzt den Laendernamen als Textfeld unter die Flagge"
// @param color  Schriftfarbe "Schriftfarbe"         default=#404040           tooltip="Farbe des Laendernamens. Ohne diese Angabe wuerde die Farbe aus dem Foliendesign geerbt - auf dunklen Vorlagen ist das oft Weiss."
// @param float  Schriftgroesse "Schriftgroesse (pt)" default=11  min=4  max=96  tooltip="Schriftgroesse des Laendernamens in Punkten"
// @param bool   Zentrieren  "Auf Folie zentrieren"  default=true             tooltip="Flagge horizontal und vertikal auf der Folie zentrieren"

// ═══════════════════════════════════════════════
// Parameter auswerten
// ═══════════════════════════════════════════════
string land         = Params.GetString("Land", "Schweiz");
string dateiformat  = Params.GetString("Dateiformat", "PNG (Bild)");
string format       = Params.GetString("Format", "4:3 (klassisch)");
float  breite       = (float)Params.GetFloat("Breite", 120.0);
bool   rahmen       = Params.GetBool("Rahmen", true);
var    rahmenfarbe  = Params.GetColor("Rahmenfarbe", Color.FromArgb(127, 127, 127));
float  rahmenSt     = (float)Params.GetFloat("Rahmenstaerke", 0.75);
bool   beschriftung = Params.GetBool("Beschriftung", false);
var    schriftfarbe = Params.GetColor("Schriftfarbe", Color.FromArgb(64, 64, 64));
float  schriftGr    = (float)Params.GetFloat("Schriftgroesse", 11.0);
bool   zentrieren   = Params.GetBool("Zentrieren", true);

bool  istQuadrat = format.StartsWith("1:1");
bool  istPng     = dateiformat.StartsWith("PNG");
float hoehe      = istQuadrat ? breite : breite * 3f / 4f;

int rahmenRgb = System.Drawing.ColorTranslator.ToOle(rahmenfarbe);

// ═══════════════════════════════════════════════
// Land in countries.csv nachschlagen
//
// Warum CSV und nicht countries.xml: Scripts koennen kein System.Xml
// verwenden (nicht referenziert) und kein System.IO (vom Code-Scanner
// blockiert). ppptools.ReadAssetLines liest sandboxed aus dem eigenen
// Snippet-Ordner. Spalten: iso;de;en;svg_1x1;svg_4x3;png_1x1;png_4x3
//
// WICHTIG - kein throw bei fehlenden Assets:
// Das Speichern im Advanced Editor laesst das Script laufen, um das
// Vorschaubild zu erzeugen. Wuerde hier geworfen, liesse sich das Snippet
// nie anlegen - und ohne angelegtes Snippet gibt es keinen Ordner, in den
// man die Assets kopieren koennte. Stattdessen: sichtbarer Platzhalter.
// ═══════════════════════════════════════════════
string iso = "??", nameDe = land, datei = null, hinweis = null;

if (!ppptools.AssetExists("countries.csv"))
{
    hinweis = "Assets fehlen: countries.csv + flags\\ bzw. flags_png\\ in den "
            + "Snippet-Ordner kopieren (Snippet-Verwalten -> 'Ordner oeffnen').";
}
else
{
    string pfad = null;
    foreach (string zeile in ppptools.ReadAssetLines("countries.csv"))
    {
        if (zeile.Length == 0 || zeile.StartsWith("iso;")) continue;   // Kopfzeile
        string[] sp = zeile.Split(';');
        if (sp.Length < 7) continue;
        if (!string.Equals(sp[1], land, StringComparison.OrdinalIgnoreCase)) continue;

        iso    = sp[0];
        nameDe = sp[1];
        pfad   = istPng ? (istQuadrat ? sp[5] : sp[6])
                        : (istQuadrat ? sp[3] : sp[4]);
        break;
    }

    if (pfad == null)
    {
        hinweis = "Das Land \"" + land + "\" steht nicht in countries.csv.";
    }
    else
    {
        // Pfad aus der CSV ist relativ (flags_png\4x3\ch.png) -> zerlegen,
        // AssetPath setzt ihn sandboxed wieder zusammen.
        string[] teile = pfad.Split('\\');
        if (ppptools.AssetExists(teile)) datei = ppptools.AssetPath(teile);
        else                             hinweis = "Datei fehlt: " + pfad;
    }
}

// ═══════════════════════════════════════════════
// Position
// ═══════════════════════════════════════════════
float x = 100f, y = 100f;
if (zentrieren)
{
    x = (ppptools.SlideWidth  - breite) / 2f;
    y = (ppptools.SlideHeight - hoehe)  / 2f;
    if (beschriftung) y -= 14f;          // Platz fuer die Bildunterschrift
}

// ═══════════════════════════════════════════════
// Flagge einfuegen
// ═══════════════════════════════════════════════
dynamic oFlagge = null;

if (datei != null)
{
    try
    {
        oFlagge = ppptools.AddPicture(datei, x, y, breite, hoehe);
    }
    catch (Exception ex)
    {
        // Bei SVG haeufigster Grund: PowerPoint ohne SVG-Unterstuetzung
        // (vor Office 2019 bzw. gekauftes Office 2016). Kein throw.
        oFlagge = null;
        hinweis = istPng
            ? "Das Bild konnte nicht eingefuegt werden. [" + ex.Message + "]"
            : "SVG konnte nicht eingefuegt werden - diese PowerPoint-Version "
              + "unterstuetzt vermutlich kein SVG (noetig: Microsoft 365 oder "
              + "Office 2019+). Mit Dateiformat = PNG funktioniert es. ["
              + ex.Message + "]";
    }
}

// ── Platzhalter, wenn keine Flagge gesetzt werden konnte ──────────────────
if (oFlagge == null)
{
    var oPh = ppptools.AddRect(x, y, breite, hoehe);
    oPh.Name = "Flagge_Platzhalter";
    oPh.Fill.Solid();
    oPh.Fill.ForeColor.RGB = System.Drawing.ColorTranslator.ToOle(Color.FromArgb(242, 242, 242));
    oPh.Line.Visible       = MsoTriState.msoTrue;
    oPh.Line.ForeColor.RGB = System.Drawing.ColorTranslator.ToOle(Color.FromArgb(192, 0, 0));
    oPh.Line.Weight        = 1f;
    oPh.Line.DashStyle     = MsoLineDashStyle.msoLineDash;

    oPh.TextFrame.TextRange.Text      = "Flagge: " + land + "\n" + hinweis;
    oPh.TextFrame.TextRange.Font.Size = 9;
    oPh.TextFrame.TextRange.Font.Color.RGB =
        System.Drawing.ColorTranslator.ToOle(Color.FromArgb(192, 0, 0));
    oPh.TextFrame.TextRange.ParagraphFormat.Alignment = PpParagraphAlignment.ppAlignCenter;
    oPh.TextFrame.WordWrap = MsoTriState.msoTrue;
    return;                       // kein Rahmen/keine Beschriftung auf den Platzhalter
}

oFlagge.Name = "Flagge_" + iso;

// ═══════════════════════════════════════════════
// Rahmen
//
// PNG ist EIN Bild-Shape -> Line sitzt sauber aussen herum.
// SVG fuegt PowerPoint als GRUPPE ein (msoGraphic) -> Line wuerde auf die
// Einzelteile durchschlagen und Striche INNERHALB der Flagge zeichnen.
// Deshalb dort ein eigenes Rechteck darueber und beides gruppieren.
// ═══════════════════════════════════════════════
dynamic oErgebnis = oFlagge;

if (rahmen)
{
    if (istPng)
    {
        oFlagge.Line.Visible       = MsoTriState.msoTrue;
        oFlagge.Line.ForeColor.RGB = rahmenRgb;
        oFlagge.Line.Weight        = rahmenSt;
        oFlagge.Line.Transparency  = 0f;
        oFlagge.Line.DashStyle     = MsoLineDashStyle.msoLineSolid;
    }
    else
    {
        var oRahmen = ppptools.AddRect(x, y, breite, hoehe);
        oRahmen.Name               = "Flagge_" + iso + "_Rahmen";
        oRahmen.Fill.Visible       = MsoTriState.msoFalse;
        oRahmen.Line.Visible       = MsoTriState.msoTrue;
        oRahmen.Line.ForeColor.RGB = rahmenRgb;
        oRahmen.Line.Weight        = rahmenSt;
        oRahmen.Line.Transparency  = 0f;
        oRahmen.Line.DashStyle     = MsoLineDashStyle.msoLineSolid;

        // Gruppieren, damit Flagge + Rahmen zusammen bleiben.
        // (Nur Gruppieren - ein Ungroup eingebetteter SVGs kann PowerPoint
        // zum Absturz bringen und wird hier bewusst nicht gemacht.)
        oErgebnis      = ppptools.Group(oFlagge, oRahmen);
        oErgebnis.Name = "Flagge_" + iso;
    }
}

// ═══════════════════════════════════════════════
// Optionale Beschriftung
// ═══════════════════════════════════════════════
if (beschriftung)
{
    var oText = ppptools.AddRect(x, y + hoehe + 4f, breite, 20f);
    oText.Name = "Flagge_" + iso + "_Text";
    oText.Fill.Visible = MsoTriState.msoFalse;
    ppptools.HideLine(oText);

    oText.TextFrame.TextRange.Text      = nameDe;
    oText.TextFrame.TextRange.Font.Size = schriftGr;

    // Farbe explizit setzen, sonst erbt der Text das Foliendesign.
    // Font.Fill.Solid() ist noetig, damit die Farbe zuverlaessig haftet.
    oText.TextFrame.TextRange.Font.Color.RGB = System.Drawing.ColorTranslator.ToOle(schriftfarbe);
    oText.TextFrame2.TextRange.Font.Fill.Solid();
    oText.TextFrame2.TextRange.Font.Fill.ForeColor.RGB =
        System.Drawing.ColorTranslator.ToOle(schriftfarbe);

    oText.TextFrame.TextRange.ParagraphFormat.Alignment = PpParagraphAlignment.ppAlignCenter;
    oText.TextFrame2.VerticalAnchor                     = MsoVerticalAnchor.msoAnchorTop;
    oText.TextFrame2.AutoSize                           = MsoAutoSize.msoAutoSizeTextToFitShape;
}