<?php

declare(strict_types=1);

namespace Ekdos\Relay;

use Ekdos\N8n\CachePolicy;
use Ekdos\Support\Json;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;

final readonly class CustomersController extends RelayController
{
    public function index(Request $request, Response $response): Response
    {
        $reply = $this->cachedGet(CachePolicy::Customers, $this->n8nUrl->customers(), $this->readHeaders());

        if (!$reply->ok()) {
            return $this->upstreamError($response, $reply, 'Der Kundenstamm konnte nicht aus n8n geladen werden.');
        }

        return $this->listResponse($response, $reply, 'customers', 'customers');
    }

    /** Neuanlage. n8n verlangt dafuer das geteilte Geheimnis, nicht den Lese-Schluessel. */
    public function create(Request $request, Response $response): Response
    {
        $secret = $this->invoiceSyncSecret();

        if ($secret === '') {
            return Json::error($response, 'Die sichere Kundenanlage ist noch nicht eingerichtet.', 503);
        }

        $reply = $this->n8n->post($this->n8nUrl->customers(), $this->body($request), ['x-ekdos-invoice-sync' => $secret]);

        if (!$reply->ok()) {
            return $this->upstreamError($response, $reply, 'Der Kunde konnte nicht im Kundenstamm gespeichert werden.');
        }

        $this->cache->invalidate(CachePolicy::Customers[0]);

        return Json::write($response, ['customer' => $reply->decoded()], 201);
    }

    public function update(Request $request, Response $response): Response
    {
        $reply = $this->n8n->put($this->n8nUrl->customers(), $this->body($request), $this->readHeaders());

        if (!$reply->ok()) {
            return $this->upstreamError($response, $reply, 'Der Kunde konnte nicht im Kundenstamm gespeichert werden.');
        }

        $this->cache->invalidate(CachePolicy::Customers[0]);

        return Json::write($response, ['customer' => $reply->decoded()]);
    }

    /** Vormals: nur Sascha. */
    public function delete(Request $request, Response $response): Response
    {
        $reply = $this->n8n->delete($this->n8nUrl->customers(), $this->body($request), $this->readHeaders());

        if (!$reply->ok()) {
            return $this->upstreamError($response, $reply, 'Der Kunde konnte nicht aus dem Kundenstamm gelöscht werden.');
        }

        $this->cache->invalidate(CachePolicy::Customers[0]);

        return Json::write($response, ['deleted' => true]);
    }

    public function digitalFile(Request $request, Response $response): Response
    {
        $customer = $this->query($request, 'customer');

        if ($customer === '' || mb_strlen($customer) > 160) {
            return Json::error($response, 'Der Kunde fehlt.', 400);
        }

        $reply = $this->n8n->get($this->n8nUrl->customerDigitalFile($customer));

        if (!$reply->ok() || $reply->body === '') {
            return $this->upstreamError($response, $reply, 'Die Digitale Akte ist nicht verfügbar.');
        }

        return $this->pdfResponse($response, $reply->body, 'Digitale_Akte.pdf');
    }

    /**
     * Der Lese-Schluessel des Kundenstamm-Workflows.
     *
     * Er stand frueher als Literal im Quelltext; jetzt kommt er aus der Umgebung,
     * damit er rotiert werden kann, ohne die Anwendung neu zu bauen.
     */
    private function readHeaders(): array
    {
        $key = $this->config->string('N8N_CUSTOMER_KEY');

        return $key === '' ? [] : ['X-EK-DOS-Customer-Key' => $key];
    }
}
