<?php

namespace App\Support;

/**
 * Der veröffentlichbare Stripe-Schlüssel (`pk_…`) des aktiven Betriebsmodus.
 *
 * Stripe gibt einem Betreiber drei Werte: diesen, den Secret Key und das
 * Signatur-Secret. Die anderen zwei liegen im Tresor; dieser bewusst NICHT —
 * er ist öffentlich. Ihn hinter „wird verschlüsselt gespeichert und nie wieder
 * vollständig angezeigt" zu setzen, wäre Theater, und es nähme dem Betreiber
 * die Möglichkeit nachzusehen, welcher Schlüssel eigentlich eingetragen ist.
 * Also eine gewöhnliche Einstellung, im Klartext sichtbar.
 *
 * Je Betriebsmodus getrennt, wie die zwei daneben: Stripe stellt ihn je Konto
 * eigen aus, und ein `pk_live` im Testplatz ist genau die Verwechslung, die
 * beim Einrichten passiert. Sichtbar gemacht wird sie über
 * OperatingMode::ofStripeKey(), das dafür `pk_`-Präfixe mitgelernt hat.
 *
 * **Diese Anwendung liest ihn heute nirgends.** Der Checkout macht
 * `redirect()->away()` auf Stripes eigene Bezahlseite; im Browser läuft kein
 * Stripe.js, das ihn bräuchte. Er steht hier, weil ein Betreiber beim
 * Einrichten drei Werte vor sich hat und nicht raten soll, welcher wohin
 * gehört — und weil der Tag, an dem eine eingebettete Bezahlmaske dazukommt,
 * ihn ohnehin verlangt. Das ist auf der Karte auch so gesagt, statt es zu
 * verschweigen und wie eine wirksame Einstellung aussehen zu lassen.
 */
final class StripePublishableKey
{
    private static function settingKey(?OperatingMode $mode = null): string
    {
        return 'stripe.publishable_key.'.($mode ?? OperatingMode::current())->value;
    }

    /** Der gespeicherte Wert, sonst der aus der Serverdatei — je Modus die eigene Zeile. */
    public static function current(?OperatingMode $mode = null): string
    {
        $mode ??= OperatingMode::current();
        $stored = Settings::get(self::settingKey($mode));

        if (filled($stored)) {
            return (string) $stored;
        }

        return (string) config($mode->isTest() ? 'services.stripe.key_test' : 'services.stripe.key');
    }

    public static function set(string $key, ?OperatingMode $mode = null): void
    {
        Settings::set(self::settingKey($mode), trim($key));
    }
}
