<?php
declare(strict_types=1);

class Sections
{
    private string $file;
    private string $dataDir;

    public function __construct(string $dataDir)
    {
        $this->dataDir = $dataDir;
        $this->file    = $dataDir . '/sections.json';
    }

    // ── Public API ────────────────────────────────────────────────────────────

    public function getAll(): array
    {
        $sections = $this->load();
        usort($sections, fn($a, $b) => ($a['order'] ?? 0) <=> ($b['order'] ?? 0));
        return array_values($sections);
    }

    private const VALID_TYPES = [
        'hero-header', 'intro', 'big-header', 'countdown', 'locations', 'quote',
        'witnesses', 'couple', 'program', 'accommodation', 'rsvp', 'gallery-section',
        'text-image', 'hochzeits-abc', 'geschenketisch', 'kuchenliste', 'abendprogramm',
        'faq', 'save-the-date', 'navigation',
    ];

    public function create(array $input): array
    {
        $type = $input['type'] ?? '';
        if (!$type) throw new InvalidArgumentException('Missing type');
        if (!in_array($type, self::VALID_TYPES, true)) throw new InvalidArgumentException("Invalid type: $type");

        $sections = $this->load();
        $maxOrder = empty($sections) ? 0 : max(array_column($sections, 'order')) + 1;

        $section = [
            'id'      => $this->uuid(),
            'type'    => $type,
            'visible' => true,
            'order'   => $maxOrder,
            'data'    => $this->defaultData($type),
        ];

        $sections[] = $section;
        $this->save($sections);
        return $section;
    }

    public function update(string $id, array $input): array
    {
        $sections = $this->load();
        $idx      = $this->findIndex($sections, $id);

        if (array_key_exists('visible', $input)) {
            $sections[$idx]['visible'] = (bool)$input['visible'];
        }
        if (array_key_exists('data', $input)) {
            $sections[$idx]['data'] = $this->sanitizeData($input['data']);
        }

        $this->save($sections);
        return $sections[$idx];
    }

    public function delete(string $id): void
    {
        $sections = $this->load();
        $sections = array_values(array_filter($sections, fn($s) => $s['id'] !== $id));
        $this->save($sections);
    }

    public function reorder(array $ids): void
    {
        $sections = $this->load();
        $map      = [];
        foreach ($sections as $s) $map[$s['id']] = $s;

        $ordered = [];
        foreach ($ids as $i => $id) {
            if (isset($map[$id])) {
                $map[$id]['order'] = $i;
                $ordered[] = $map[$id];
                unset($map[$id]);
            }
        }
        // Append any sections not mentioned in ids
        foreach ($map as $s) $ordered[] = $s;

        $this->save($ordered);
    }

    // ── Private ───────────────────────────────────────────────────────────────

    private function load(): array
    {
        if (!file_exists($this->file)) return [];
        return json_decode(file_get_contents($this->file), true) ?? [];
    }

    private function save(array $sections): void
    {
        $tmp = $this->file . '.tmp';
        file_put_contents($tmp, json_encode($sections, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE), LOCK_EX);
        if (!rename($tmp, $this->file)) {
            @unlink($tmp);
            throw new RuntimeException('Failed to save sections data');
        }
    }

    private function findIndex(array $sections, string $id): int
    {
        foreach ($sections as $i => $s) {
            if ($s['id'] === $id) return $i;
        }
        throw new RuntimeException("Section not found: $id");
    }

    private function uuid(): string
    {
        $b = random_bytes(16);
        $b[6] = chr(ord($b[6]) & 0x0f | 0x40);
        $b[8] = chr(ord($b[8]) & 0x3f | 0x80);
        return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($b), 4));
    }

    private function sanitizeData(array $data): array
    {
        // Recursively strip tags from string values
        array_walk_recursive($data, function (&$val) {
            if (is_string($val)) {
                $val = strip_tags($val, '<b><i><a><br><strong><em>');
            }
        });
        return $data;
    }

    private function defaultData(string $type): array
    {
        return match($type) {
            'save-the-date' => [
                'de'             => ['headline' => 'Save the Date', 'text1' => 'Anna und Sebastian', 'text2' => 'werden heiraten!'],
                'headline_align' => 'center',
                'headline_color' => '',
                'date'           => $this->weddingDate(),
                'image_day'      => 'assets/img/samples/thumbs/xsample_brautpaar-02--size-m.avif',
                'image_month'    => 'assets/img/samples/thumbs/xsample_brautpaar-03--size-m.avif',
                'image_year'     => 'assets/img/samples/thumbs/xsample_brautpaar-hero--size-m.avif',
                'overlay_opacity' => '40',
                'section_bg_color' => 'var(--bg-body)',
            ],
            'navigation' => [
                'de'             => ['headline' => 'Navigation'],
                'headline_align' => 'left',
                'headline_color' => 'var(--primary)',
                'headline_size'  => 'm',
                'button_color'   => 'var(--primary)',
                'button_text_color' => '#ffffff',
                'items'          => [],
                'nav_justify'    => 'center',
                'link_color'     => 'var(--bg-body)',
                'link_hover_color' => 'var(--bg-body)',
                'section_bg_color' => 'var(--primary)',
                'section_padding' => 'l',
            ],
            'hero-header' => [
                'de' => [
                    'headline'  => '{{begrüssung | Herzlich willkommen}}',
                    'headline2' => 'Wir sagen JA! Am {{hochzeitsdatum}} ist es soweit und wir möchten mit euch feiern.',
                    'body'      => "Wir heiraten und wollen es ordentlich krachen lassen!\n\nDazu laden wir Dich herzlich zu unserer Feier am 13. September 2023 ein.\n\nAlle Details zur Feier und was uns dafür wichtig ist, findest Du auf dieser Seite. Bitte gib uns bis 31. Mai 2027 mit dem Rückmelde-Formular Bescheid, ob Du mit uns feiern möchtest.\n\nWir freuen uns auf Dich und eine tolle Feier.\n\nLiebe Grüße,\nFranziska und Sebastian",
                ],
                'headline_align'  => 'left',
                'headline_color'  => 'var(--text-title)',
                'headline2_align' => 'left',
                'headline2_color' => 'var(--primary)',
                'body_color'      => 'var(--text-body)',
                'image'           => 'assets/img/samples/thumbs/xsample_brautpaar-hero--size-m.avif',
                'image_position'  => '50% 50%',
                'image_side'      => 'left',
                'background_image' => 'assets/img/samples/thumbs/hero-header_blumen--size-m.avif',
                'container_color' => '',
                'min_height'      => 0,
                'content_bg_color' => 'var(--bg-body)',
                'content_valign'  => 'middle',
                'content_halign'  => 'left',
                'border_width'    => '10',
                'border_color'    => 'var(--primary)',
                'text_padding'    => null,
            ],
            'big-header' => [
                'de'                 => ['headline' => 'Wir heiraten!', 'subline' => 'Am {{hochzeitsdatum}} sagen wir JA!'],
                'headline_align'     => 'center',
                'headline_color'     => 'var(--bg-body)',
                'subline_align'      => 'center',
                'subline_color'      => 'var(--bg-body)',
                'background_image'   => 'assets/img/samples/thumbs/xsample_brautpaar-hero--size-m.avif',
                'background_position' => 'center',
                'overlay_opacity'    => 40,
                'min_height'         => '70',
            ],
            'countdown' => [
                'de'               => ['headline' => 'Zeit bis zum Ja-Wort', 'after_text' => 'Wir werden heiraten!'],
                'headline_align'   => 'center',
                'headline_color'   => 'var(--text-title)',
                'countdown_date'   => $this->weddingDate(),
                'section_bg_color' => 'var(--bg-body)',
                'background_image' => 'assets/img/samples/thumbs/count-down_sanduhr--size-m.avif',
                'overlay_color'    => 'var(--primary)',
                'overlay_opacity'  => '15',
                'countdown_bg_color'   => 'var(--bg-body)',
                'countdown_bg_opacity' => '90',
                'countdown_radius'     => 's',
            ],
            'intro' => [
                'de' => [
                    'headline' => '{{begrüssung | Lieber Gast}}',
                    'body'     => "wir heiraten und wollen es ordentlich krachen lassen! Dazu laden wir Dich herzlich zu unserer Feier am {{hochzeitsdatum}} ein.\n\nAlle Details zur Feier und was uns dafür wichtig ist, findest Du auf dieser Seite.",
                ],
                'en'             => ['headline' => 'Invitation'],
                'headline_align' => 'left',
                'headline_size'  => '3xl',
                'headline_color' => 'var(--text-title)',
                'body_cols'      => '1',
                'body_align'     => 'left',
                'body_size'      => 'm',
                'body_color'     => '#444444',
                'image'          => 'assets/img/samples/thumbs/xsample_brautpaar-hero--size-m.avif',
                'image_position' => 'left',
                'section_bg_color' => 'var(--bg-body)',
            ],
            'witnesses' => [
                'de'             => ['headline' => 'Unsere Trauzeugen'],
                'headline_align' => 'center',
                'headline_size'  => null,
                'headline_color' => 'var(--text-title)',
                'items' => [
                    [
                        'de' => [
                            'name'        => 'Paul Berger',
                            'role'        => 'Trauzeuge',
                            'description' => "Paul kenne ich zwar erst seit der Oberstufe, aber wir waren von 0 auf 100 die besten Buddys! Paul ist nicht nur mein bester Freund, sondern gehört schon fast zur Familie - sagen sogar meine Eltern ;-). Paul, du wirst als Trauzeuge einen mega Job machen und ich freue mich schon auf die vielen kleinen Gemeinheiten, die du sicherlich für uns vorbereiten wirst :D\n\nHelft ihm bloß nicht bei seinen Vorhaben. Wenn ihr aber müsst, dann erreicht ihr Paul unter der +49 171 XXX XXX XX.",
                        ],
                        'photo' => 'assets/img/samples/thumbs/xsample_trauzeugen_er--size-m.avif',
                    ],
                    [
                        'de' => [
                            'name'        => 'Maria Endres',
                            'role'        => 'Trauzeugin',
                            'description' => "Maria ist seit dem Kindergarten meine beste Freundin. Wer uns kennt, weiß, dass es uns ausschließlich im Doppelpack gibt. Wir gehen zusammen durch dick und dünn und haben unglaublich viele tolle Momente erlebt. Ich kann mir keine bessere Trauzeugin als Maria vorstellen!\n\nWenn ihr sie für Nachfragen oder Spiele erreichen wollt, könnt ihr das unter ihrer Mobilnummer +49 150 XXX XXX XX.",
                        ],
                        'photo' => 'assets/img/samples/thumbs/xsample_trauzeugen_sie--size-m.avif',
                    ],
                ],
                'photo_border_color'   => 'var(--primary)',
                'photo_border_width'   => '4',
                'layout'               => 'alternating',
                'photo_border_radius'  => 'full',
                'name_size'            => 'xl',
                'name_color'           => 'var(--primary)',
            ],
            'kuchenliste' => [
                'de' => [
                    'headline'   => 'Kuchenliste',
                    'intro_text' => 'Vielen Dank, dass Du einen Kuchen beisteuern möchtest. Trage hier bitte ein, welcher das sein wird.',
                ],
                'headline_align'    => 'left',
                'headline_color'    => 'var(--text-title)',
                'background_image'  => 'assets/img/samples/thumbs/muffins-1--size-m.avif',
                'background_position' => 'center',
                'form_bg_color'     => 'var(--bg-body)',
                'form_radius'       => 'xl',
                'form_padding'      => 'l',
                'col2_bg_color'     => 'var(--primary)',
                'col2_opacity'      => '69',
                'section_padding'   => 'xl',
                'padding'           => 'm',
                'container_radius'  => 'l',
                'list_text_color'   => 'var(--bg-body)',
                'layout'            => 'list-right',
                'form_labels' => [
                    ['de' => ['text' => 'Dein Name']],
                    ['de' => ['text' => 'Welchen Kuchen bringst du?']],
                    ['de' => ['text' => 'Anmerkungen (optional)']],
                    ['de' => ['text' => 'Eintragen']],
                    ['de' => ['text' => 'Vielen Dank für deine Anmeldung!']],
                ],
            ],
            'hochzeits-abc' => [
                'de'             => ['headline' => 'Unser Hochzeits-ABC'],
                'headline_align' => 'center',
                'headline_color' => 'var(--text-title)',
                'headline_size'  => null,
                'items' => [
                    ['term' => 'A', 'de' => ['description' => 'Auf jeden einzelnen von Euch freuen wir uns riesig!']],
                    ['term' => 'B', 'de' => ['description' => 'Brautentführung könnte es vielleicht auch geben – könnte lustig werden. :D']],
                    ['term' => 'C', 'de' => ['description' => 'Cocktails gibt es ab ca. 23 Uhr an der Bar. Natürlich auch nicht-alkoholische.']],
                    ['term' => 'D', 'de' => ['description' => 'Dankeschön sagen wir bereits jetzt für Euer Kommen.']],
                    ['term' => 'E', 'de' => ['description' => 'Essen gibt es vom Buffet. Von Fisch über Fleisch bis vegetarisch. Für alle Geschmäcker ist etwas dabei.']],
                    ['term' => 'F', 'de' => ['description' => 'Fotos macht die/der talentierte ...']],
                    ['term' => 'G', 'de' => ['description' => "Geschenke sind etwas Tolles :D\nWir werden sie aber in Ruhe am Folgetag auspacken."]],
                    ['term' => 'H', 'de' => ['description' => 'Herzhaft lecker wird der Snack, der um Mitternacht auf Euch wartet.']],
                    ['term' => 'I', 'de' => ['description' => 'Ideen für unser Gästebuch? Könnt ihr Euch gerne schon vorher machen.']],
                    ['term' => 'J', 'de' => ['description' => 'Jeder kommt nach Hause. Wir haben ein paar Zimmer für Euch reserviert. Für alle anderen stehen Taxen bereit.']],
                    ['term' => 'K', 'de' => ['description' => 'Kinderbetreuung ist organisiert! Meine Kollegin Franzi aus dem Hort wird Eure Kleinen bespaßen.']],
                    ['term' => 'L', 'de' => ['description' => 'Langweile wird nicht aufkommen – die ist nämlich ausgeladen! ;)']],
                    ['term' => 'M', 'de' => ['description' => 'Musik gibt es natürlich auch. Wir sind stolz darauf, den Star-DJ Robin Schulz auf unserer Hochzeitsparty begrüßen zu dürfen.']],
                    ['term' => 'N', 'de' => ['description' => 'Natürlich legt nicht Robin Schulz auf unserer Hochzeit auf... Der DJ/Die Band wird an dieser Stelle noch bekannt gegeben :D']],
                    ['term' => 'O', 'de' => ['description' => 'Open-End ist das Motto – pack also Deine Tanzschuhe mit ein!']],
                    ['term' => 'P', 'de' => ['description' => 'Parkplätze gibt es vor der Gaststätte mehr als ausreichend. Ihr könnt direkt im Hof parken.']],
                    ['term' => 'Q', 'de' => ['description' => 'Qualifiziert haben wir uns nach 6 Jahren Beziehung dann doch hoffentlich für die Ehe.']],
                    ['term' => 'R', 'de' => ['description' => 'Regen wird es keinen geben, wir haben schönes Wetter hinzugebucht!']],
                    ['term' => 'S', 'de' => ['description' => 'Sekt zum Warmwerden gibt es direkt nach dem Standesamt.']],
                    ['term' => 'T', 'de' => ['description' => 'Tischordnung haben wir auch. Ein großer Aufsteller im Eingangsbereich zeigt Euch Eure Sitzplätze.']],
                    ['term' => 'U', 'de' => ['description' => 'Unvergesslich soll dieser Tag für uns werden, wir freuen uns riesig darauf!']],
                    ['term' => 'V', 'de' => ['description' => 'Vergessen haben wir hoffentlich nichts. Falls doch, setzt euch bitte mit uns oder unseren Trauzeugen in Verbindung.']],
                    ['term' => 'W', 'de' => ['description' => 'Weinen werden wir vielleicht auch, aber natürlich vor Freude.']],
                    ['term' => 'X', 'de' => ['description' => 'X-beliebig sollte Eure Kleidung nicht sein. Wir freuen uns, Euch im Anzug oder Kleid begrüßen zu dürfen.']],
                    ['term' => 'Y', 'de' => ['description' => 'Yes, wir trauen uns, uns zu trauen!']],
                    ['term' => 'Z', 'de' => ['description' => 'Zum Schluss wünschen wir auch Euch einen unvergesslichen und wundervollen Tag. Es soll uns an nichts mangeln!']],
                ],
                'letter_color'     => 'var(--primary)',
                'text_color'       => 'var(--text-body)',
                'section_bg_color' => 'var(--bg-body)',
            ],
            'accommodation' => [
                'de' => [
                    'headline'   => 'Unterkünfte',
                    'intro_text' => 'Als Euer Gastgeber ist es uns wichtig, dass ihr alle gut nach Hause kommt. Da das eigene Zuhause aber bei einigen von Euch sehr weit entfernt ist, haben wir in zwei Hotels Zimmer für Euch reserviert. Sprecht uns gerne darauf an!',
                ],
                'headline_align' => 'left',
                'headline_color' => 'var(--bg-body)',
                'headline_size'  => null,
                'image'          => 'assets/img/samples/thumbs/unterkuenfte--size-m.avif',
                'items' => [
                    [
                        'icon'        => '🌴',
                        'de'          => ['name' => 'Hotel Muster-Meerblick', 'address' => 'Strandpromenade 21-24, 12345 Sonnenstadt'],
                        'website_url' => 'https://maps.google.com',
                    ],
                    [
                        'icon'        => '',
                        'de'          => ['name' => 'Pension Jägersruh', 'address' => 'Am Wildbach 17, Schützenhausen'],
                        'website_url' => 'https://maps.google.com',
                    ],
                ],
                'section_bg_color' => 'var(--primary)',
                'name_color'       => 'var(--bg-body)',
                'address_color'    => 'var(--bg-body)',
                'intro_color'      => 'var(--bg-body)',
                'intro_size'       => 's',
                'layout'           => 'image-left',
            ],
            'couple' => [
                'de' => [
                    'headline'    => 'Brautpaar',
                    'person1_text' => '',
                    'person2_text' => '',
                    'intro_text'  => 'Ein paar Worte über uns...',
                ],
                'headline_align'   => 'center',
                'headline_color'   => '',
                'person1_name'     => '',
                'person1_photo'    => '',
                'person1_text_align' => 'left',
                'person1_text_size'  => 'm',
                'person1_text_color' => '',
                'person2_name'     => '',
                'person2_photo'    => '',
                'person2_text_align' => 'left',
                'person2_text_size'  => 'm',
                'person2_text_color' => '',
                'items' => [
                    [
                        'name'  => 'Franziska Meyer',
                        'de'    => ['text' => 'Als Basti und ich in unsere gemeinsame Wohnung zogen, hat alles so gut harmoniert, dass es fast schon gruselig war. Ich wusste, dass das mein Mann ist, als wir uns beim Spieleabend bei Freunden quasi ohne Worte verstanden und alle plattgemacht haben. Besonders liebe ich seine Kochfähigkeiten, dass wir viel miteinander lachen und das Gefühl, dass er immer zu und hinter mir steht.'],
                        'photo' => 'assets/img/samples/thumbs/xsample_brautpaar_braut-1--size-m.avif',
                    ],
                    [
                        'name'  => 'Sebastian Buchholz',
                        'de'    => ['text' => 'Franzi hat mir vom ersten Augenblick an gefallen. Es fühlte sich zwischen uns auch sehr schnell vertraut an und das hat sich mit unserer ersten gemeinsamen Wohnung bestätigt. Ich liebe es, wenn sie tanzend durch die Wohnung hüpft und auch gute Laune verbreitet, wenn das Leben mal nicht so mitspielt.'],
                        'photo' => 'assets/img/samples/thumbs/xsample_brautpaar_braeutigam-1--size-m.avif',
                    ],
                ],
                'layout'     => 'image-top',
                'name_color' => 'var(--text-title)',
                'text_color' => 'var(--text-body)',
                'text_size'  => 's',
            ],
            'rsvp' => [
                'de' => [
                    'headline'   => 'Rückmeldung erbeten',
                    'intro_text' => "Hey {{name}}, wir freuen uns schon riesig darauf, unsere Hochzeit mit Dir zu feiern.\n\nUm alles rechtzeitig organisieren und buchen zu können, gib uns bitte rechtzeitig Bescheid, ob Du kommst.",
                ],
                'headline_align'       => 'left',
                'headline_color'       => 'var(--bg-body)',
                'intro_align'          => 'left',
                'intro_size'           => 'm',
                'intro_color'          => 'var(--bg-body)',
                'deadline'             => '',
                'show_persons'         => true,
                'show_meal'            => true,
                'meal_options' => [
                    ['de' => ['label' => 'Fleisch']],
                    ['de' => ['label' => 'Fisch']],
                    ['de' => ['label' => 'Bommes']],
                ],
                'show_message' => true,
                'form_labels'  => [
                    ['de' => ['text' => 'Dein Name'],                          'en' => ['text' => 'Your name']],
                    ['de' => ['text' => 'E-Mail-Adresse'],                     'en' => ['text' => 'Email address']],
                    ['de' => ['text' => 'Werdet Ihr dabei sein?'],             'en' => ['text' => 'Will you attend?']],
                    ['de' => ['text' => 'Ja, ich komme'],                      'en' => ['text' => "Yes, I'll be there"]],
                    ['de' => ['text' => 'Nein, ich kann leider nicht'],        'en' => ['text' => "No, I can't make it"]],
                    ['de' => ['text' => 'Anzahl Personen'],                    'en' => ['text' => 'Number of guests']],
                    ['de' => ['text' => 'Essenswunsch'],                       'en' => ['text' => 'Meal preference']],
                    ['de' => ['text' => 'Nachricht'],                          'en' => ['text' => 'Message']],
                    ['de' => ['text' => 'Anmelden'],                           'en' => ['text' => 'Submit']],
                    ['de' => ['text' => 'Vielen Dank für deine Rückmeldung!'], 'en' => ['text' => 'Thank you for your reply!']],
                    ['de' => ['text' => 'Die Anmeldefrist ist leider abgelaufen.'], 'en' => ['text' => 'The RSVP deadline has passed.']],
                ],
                'show_email'           => false,
                'layout'               => 'form-left',
                'intro_bg_image'       => 'assets/img/samples/thumbs/rueckmeldung--size-m.avif',
                'section_padding'      => null,
                'intro_bg_color'       => 'var(--primary)',
                'intro_overlay_color'  => 'var(--primary)',
                'intro_overlay_opacity' => '69',
                'form_bg_color'        => '#e3e3e3',
            ],
            'locations' => [
                'de' => [
                    'headline'   => 'Locations',
                    'intro_text' => 'Damit ihr immer den Überblick behaltet, wo wir über all feiern:',
                ],
                'headline_align' => 'center',
                'headline_color' => 'var(--text-title)',
                'items' => [
                    [
                        'de'         => ['name' => 'Standesamt', 'address' => 'Am Amtsgericht 69, 91217 Hersbruck', 'description' => 'Wir beginnen mit den Formalitäten.'],
                        'image'      => 'assets/img/samples/thumbs/location_standesamt_image--size-m.avif',
                        'maps_url'   => 'https://amtsgericht-hersbruck.de/',
                        'link_label' => 'Amtsgericht Hersbruck',
                    ],
                    [
                        'de'       => ['name' => 'Kirche', 'address' => 'Kirchplatz 333, 91217 Hersbruck', 'description' => 'Katholische Sankt Sebalduskirche Himmelspforten'],
                        'image'    => 'assets/img/samples/thumbs/location_kirche_image--size-m.avif',
                        'maps_url' => '',
                    ],
                    [
                        'de'         => ['name' => 'Gaststätte', 'address' => 'Braten-Allee 11, 91217 Hersbruck', 'description' => 'Wirtshaus zum Partyabend'],
                        'image'      => 'assets/img/samples/thumbs/tischedeko-1--size-m.avif',
                        'maps_url'   => 'https://beispielwirtshaus.de',
                        'link_label' => 'Wirtshaus',
                    ],
                ],
                'card_radius'  => 'l',
                'name_color'   => 'var(--primary)',
                'intro_align'  => 'center',
                'layout'       => 'cards',
            ],
            'quote' => [
                'de' => [
                    'quote'  => "Liebe ist nicht das, was man erwartet zu bekommen,\nsondern das, was man bereit ist zu geben.",
                    'author' => 'Katharine Hepburn',
                ],
                'quote_align'         => 'left',
                'quote_size'          => 'l',
                'quote_color'         => 'var(--text-title)',
                'author_align'        => 'left',
                'author_size'         => null,
                'author_color'        => 'var(--primary)',
                'section_bg_color'    => '',
                'background_image'    => 'assets/img/samples/thumbs/zitat_ringe--size-m.avif',
                'background_position' => '50% 50%',
                'overlay_opacity'     => '5',
                'overlay_color'       => 'var(--bg-body)',
                'section_padding'     => '2xl',
            ],
            'program' => [
                'de' => ['headline' => 'Tagesablauf', 'intro_text' => ''],
                'headline_align' => 'left',
                'headline_color' => '',
                'intro_align'    => 'left',
                'intro_size'     => 'm',
                'intro_color'    => '',
                'items' => [
                    ['time' => '11:00 Uhr', 'de' => ['title' => 'Standesamtliche Trauung',  'description' => 'Im großen Bürgersaal der Stadt werden wir uns das Ja-Wort geben.'],                                       'icon' => '👩‍❤️‍👨'],
                    ['time' => '13:00 Uhr', 'de' => ['title' => 'Kirchliche Trauung',        'description' => 'In der kath./ev. Stadtkirche werden wir unseren Trau-Gottesdienst abhalten.'],                         'icon' => '⛪'],
                    ['time' => '15:00 Uhr', 'de' => ['title' => 'Sektempfang',               'description' => 'Im Garten der Gaststätte wollen wir mit Euch allen feierlich anstoßen.'],                              'icon' => '🥂'],
                    ['time' => '16:00 Uhr', 'de' => ['title' => 'Gemeinsames Foto',          'description' => 'Unser Fotograf wird uns alle auf ein Bild packen.'],                                                   'icon' => '📸'],
                    ['time' => '19:00 Uhr', 'de' => ['title' => 'Abendessen',                'description' => 'Leckereien vom Buffet für alle Geschmäcker.'],                                                         'icon' => '🍽️'],
                    ['time' => '21:00 Uhr', 'de' => ['title' => 'Hochzeitstanz',             'description' => 'Wir eröffnen für Euch die Tanzfläche und entlassen Euch gleich im Anschluss in die Partynacht.'],     'icon' => '💃'],
                    ['time' => '00:00 Uhr', 'de' => ['title' => 'Mitternachtsbuffet',        'description' => 'Eine herzhafte Vesper und Früchte aus dem Schokobrunnen versüßen uns die Nacht.'],                    'icon' => '🌭'],
                ],
                'section_bg_color' => 'var(--bg-body)',
                'timeline_color'   => 'var(--primary)',
                'time_color'       => 'var(--secondary)',
                'title_color'      => 'var(--text-title)',
                'desc_color'       => 'var(--text-body)',
                'desc_size'        => 's',
                'title_size'       => 'l',
                'emoji_bg_color'   => 'var(--bg-body)',
            ],
            'geschenketisch' => [
                'de' => [
                    'headline'   => 'Geschenketisch',
                    'intro_text' => 'Natürlich ist das größte Geschenk, dass wir unsere Hochzeit mit Euch feiern dürfen. Weitere Wünsche und Inspiration für den Geschenketisch haben wir folgende:',
                ],
                'headline_align' => 'left',
                'headline_color' => '',
                'surprise_mode'  => false,
                'items' => [
                    ['de' => ['title' => 'Kochtopf-Set',      'note' => 'Wir kochen für unser Leben gerne und ein Handwerker braucht gutes Werkzeug. Wir wünschen uns dieses 12-teilige Induktions-Kochtopf-Set von Fissler.'], 'link' => 'https://otto.de'],
                    ['de' => ['title' => 'Saugroboter',       'note' => 'Damit wir uns aufs Wesentliche konzentrieren können, soll der Saugroboter XY uns im Haushalt unterstützen:'],                                          'link' => 'https://saugroboter.de/'],
                    ['de' => ['title' => 'Amazon-Wunschliste','note' => 'Auf unserer Amazon-Wunschliste werdet ihr sicherlich auch fündig!'],                                                                                    'link' => 'https://amazon.de'],
                    ['de' => ['title' => 'Spar-Schwein',      'note' => 'Oder ihr schmeißt was ins Sparschwein, das wir aufstellen. Daaaaanke!'],                                                                               'link' => ''],
                ],
                'form_labels' => [
                    ['de' => ['text' => 'Dein Name']],
                    ['de' => ['text' => 'E-Mail']],
                    ['de' => ['text' => 'Reservieren']],
                    ['de' => ['text' => 'Abbrechen']],
                    ['de' => ['text' => 'Reserviert']],
                    ['de' => ['text' => 'Name und E-Mail sind erforderlich.']],
                ],
                'image'            => 'assets/img/samples/thumbs/geschenketisch--size-m.avif',
                'layout'           => 'list-right',
                'section_bg_color' => 'var(--bg-body)',
                'section_padding'  => null,
                'title_color'      => 'var(--primary)',
                'title_size'       => null,
                'desc_color'       => 'var(--text-body)',
            ],
            'gallery-section' => [
                'de'               => [
                    'headline' => 'Verlobt, verzaubert, verrückt', 
                    'intro_text' => 'Unser Verlobungs-Shooting war eigentlich nur als kleine Idee geplant – bis unsere Fotografin uns überredete, es in den Feldern hinter unserem Lieblingscafé zu machen. Plötzlich standen wir zwischen Sonnenblumen, und alles fühlte sich perfekt an. Als wir die Fotos später sahen, wussten wir: Das hier ist der Beginn unserer gemeinsamen Geschichte. '
                ],
                'headline_align'   => 'left',
                'headline_color'   => 'var(--text-title)',
                'intro_align'      => '',
                'intro_size'       => null,
                'intro_color'      => 'var(--text-body)',
                'album'            => 'all',
                'layout'           => 'gallery-right',
                'columns'          => '5',
                'section_bg_color' => 'var(--bg-body)',
            ],
            'text-image' => [
                'de' => [
                    'headline'    => 'Das hier ist ein freies Format',
                    'body'        => "An dieser Stelle können beliebige Texte stehen und auch formatiert werden.\n\nZum Glück gibt es auch verschiedene Layouts um diesen Abschnitt zu variieren.",
                    'button_text' => 'Ein Link',
                ],
                'headline_align'     => 'left',
                'headline_color'     => 'var(--bg-body)',
                'body_cols'          => '1',
                'body_align'         => 'left',
                'body_size'          => 'm',
                'body_color'         => 'var(--bg-body)',
                'image'              => 'assets/img/samples/thumbs/xsample_brautpaar-01--size-m.avif',
                'layout'             => 'image-right',
                'button_url'         => 'https://link.xyz',
                'image_border_width' => '3',
                'image_border_color' => 'var(--bg-body)',
                'section_bg_color'   => 'var(--secondary)',
                'section_padding'    => '3xl',
            ],
            'faq' => [
                'de' => [
                    'headline'   => 'Das musst Du noch wissen!',
                    'intro_text' => 'Hier findest Du noch ein paar Antworten zu den häufigsten Fragen. Falls noch weitere Fragen offen sein sollten, setze Dich einfach rechtzeitig mit uns oder unseren Trauzeugen in Verbindung.',
                ],
                'headline_align' => 'left',
                'headline_color' => 'var(--text-title)',
                'layout'         => 'acc-right',
                'items' => [
                    ['de' => ['question' => 'Wir möchten ein Zimmer reservieren, wie müssen wir vorgehen?', 'answer' => 'Das freut uns sehr! Am besten ist, wenn ihr uns vorher Bescheid gebt. Wir geben rechtzeitig eine Sammelreservierung ab und profitieren so von etwas günstigeren Konditionen. Da ihr unsere Gäste seid, wollen wir für die Kosten der Übernachtung aufkommen.']],
                    ['de' => ['question' => 'Wo können wir parken?',              'answer' => 'An der Gaststätte befindet sich ein riesiger Parkplatz im Hinterhof. Hier könnt ihr gerne euer Auto auch über Nacht kostenfrei stehen lassen.']],
                    ['de' => ['question' => 'Dürfen wir mit zum Standesamt?',     'answer' => 'Ja gerne, aber die wenigen Plätze im Inneren sind für unsere Familie und engen Freunde reserviert. Wir freuen uns aber riesig, wenn ihr vor dem Standesamt auf uns wartet.']],
                    ['de' => ['question' => 'Dürfen wir mit zur Kirche?',         'answer' => 'Ja, sehr gerne. In der Kirche gibt es für alle ausreichend Sitzmöglichkeiten. Wir freuen uns, dass ihr Teil unseres Traugottesdienstes sein wollt.']],
                    ['de' => ['question' => 'Was wünscht ihr Euch zu Eurer Hochzeit?', 'answer' => 'Lieb, dass ihr an uns denkt. Das größte Geschenk ist natürlich Eure Anwesenheit. Wenn ihr aber nicht mit leeren Händen kommen wollt, dann lasst Euch doch hier auf der Webseite von unserem Geschenketisch inspirieren!']],
                ],
            ],
            'abendprogramm' => [
                'de' => [
                    'headline' => 'Abendprogramm',
                    'body'     => 'Der einzigartige, oft kopierte aber dennoch nie erreichte DJHousemeister wird für uns auflegen. Wir sind extrem stolz, dass dieser Top-Act unsere Hochzeit mit flotten Beats untermalen wird. Eine 90er Partyrunde ist garantiert auch dabei ;-)',
                ],
                'headline_align'      => 'center',
                'headline_color'      => 'var(--bg-body)',
                'headline_size'       => null,
                'body_align'          => 'center',
                'body_color'          => 'var(--bg-body)',
                'background_image'    => 'assets/img/samples/thumbs/unterhaltung_dj--size-m.avif',
                'background_position' => 'center',
                'overlay_color'       => '#000000',
                'overlay_opacity'     => '75',
                'content_align'       => 'center',
                'min_height'          => 60,
                'content_radius'      => 'm',
            ],
            default => [],
        };
    }

    private function weddingDate(): string
    {
        $cfg = @json_decode(file_get_contents($this->dataDir . '/config.json'), true);
        return $cfg['wedding_date'] ?? '';
    }
}
