<?php

namespace App\Domains\Admin\Actions\UpdateAvailablePaymentMethod;

use App\Domains\Admin\Actions\RemovePaymentMethodUsage\RemovePaymentMethodUsageAction;
use App\Models\PaymentMethod;

class UpdateAvailablePaymentMethodAction
{
    public function __construct(private UpdateAvailablePaymentMethodRequest $request)
    {
    }

    public function execute(): UpdateAvailablePaymentMethodResponse
    {
        $response = new UpdateAvailablePaymentMethodResponse();
        $paymentMethod = $this->request->availablePaymentMethod;
        $wasActive = $paymentMethod->active;

        // Nur bekannte Options-Keys übernehmen -- das Options-Schema des Zahlungsmoduls ist die Autorität.
        $configuration = PaymentMethod::sanitizeConfiguration($paymentMethod->slug, $this->request->configuration);

        // Guard: Aktivierung nur erlaubt, wenn alle Pflicht-Optionen befüllt sind.
        if ($this->request->active && !PaymentMethod::isConfigurationComplete($paymentMethod->slug, $configuration)) {
            $response->success = false;
            $response->message = 'Bitte zuerst alle Pflichtfelder ausfüllen, bevor die Zahlungsmethode aktiviert wird.';

            return $response;
        }

        $paymentMethod->update([
            'name' => $this->request->name,
            'description' => $this->request->description,
            'active' => $this->request->active,
            'configuration' => $configuration,
        ]);

        if ($wasActive && !$this->request->active) {
            (new RemovePaymentMethodUsageAction())->execute($paymentMethod);
        }

        $response->success = true;
        $response->message = 'Zahlungsmethode wurde gespeichert.';

        return $response;
    }
}
