<?php

declare(strict_types=1);

namespace Ekdos\N8n;

use Ekdos\Support\Config;

/**
 * Alle n8n-Adressen an einer Stelle.
 *
 * Zwei Wege, bewusst getrennt:
 *
 *   webhook()  Der n8n-Dienst auf Port 5678. Er ist ausschliesslich ueber den
 *              CNAME n8n.elektro-krueger.eu erreichbar, deshalb laeuft jeder
 *              ek-dos-web-Webhook darueber.
 *
 *   internal() Jeder weitere n8n-Dienst, der auf einem anderen Port lauscht,
 *              wird ueber die RFC1918-Adresse angesprochen. Diese Dienste sind
 *              nicht nach aussen veroeffentlicht.
 */
final readonly class Endpoints
{
    private const string PREFIX = '/webhook/ek-dos-web';

    public function __construct(
        private string $publicBase,
        private string $internalHost,
    ) {}

    public static function fromConfig(Config $config): self
    {
        return new self(
            publicBase: rtrim($config->string('N8N_PUBLIC_BASE', 'https://n8n.elektro-krueger.eu'), '/'),
            internalHost: $config->string('N8N_INTERNAL_HOST', '10.0.11.131'),
        );
    }

    /** Webhook am Hauptdienst (Port 5678, nur ueber den CNAME erreichbar). */
    public function webhook(string $path = '', array $query = []): string
    {
        return $this->publicBase . self::PREFIX . $path . self::query($query);
    }

    /** Beliebiger weiterer n8n-Dienst im internen Netz. */
    public function internal(int $port, string $path, array $query = []): string
    {
        return 'http://' . $this->internalHost . ':' . $port . $path . self::query($query);
    }

    // ── Tickets ───────────────────────────────────────────────────────────
    public function openTickets(): string
    {
        return $this->webhook('/offene-tickets');
    }

    public function ticketConsultation(): string
    {
        return $this->webhook('/offene-tickets/kundenruecksprache');
    }

    public function ticketDigitalFile(string $ticket): string
    {
        return $this->webhook('/tickets/digitale-akte', ['ticket' => $ticket]);
    }

    public function ticketServiceReport(string $ticket): string
    {
        return $this->webhook('/tickets/servicebericht', ['ticket' => $ticket]);
    }

    // ── Angebote ──────────────────────────────────────────────────────────
    public function offers(string $action = ''): string
    {
        return $this->webhook('/angebote' . $action);
    }

    // ── Kundenstamm ───────────────────────────────────────────────────────
    public function customers(): string
    {
        return $this->webhook('/kundenstamm');
    }

    public function customerDigitalFile(string $customer): string
    {
        return $this->webhook('/kundenstamm/digitale-akte', ['customer' => $customer]);
    }

    // ── Rechnungen ────────────────────────────────────────────────────────
    public function invoices(array $query = []): string
    {
        return $this->webhook('/rechnungen', $query);
    }

    public function allInvoices(): string
    {
        return $this->webhook('/rechnungen/alle');
    }

    public function assignInvoice(): string
    {
        return $this->webhook('/rechnungen/zuordnen');
    }

    public function invoicePdf(string $path): string
    {
        return $this->webhook('/rechnungen/pdf', ['path' => $path]);
    }

    public function invoiceSync(): string
    {
        return $this->webhook('/rechnungen/sync');
    }

    public function invoicesCreate(): string
    {
        return $this->webhook('/rechnungen-anfertigen');
    }

    public function invoicesCreateComplete(): string
    {
        return $this->webhook('/rechnungen-anfertigen/erledigt');
    }

    public function invoicesReview(): string
    {
        return $this->webhook('/rechnungen-pruefen');
    }

    public function invoicesSend(): string
    {
        return $this->webhook('/rechnungen-versenden');
    }

    public function digitalFile(string $taskId): string
    {
        return $this->webhook('/digitale-akte', ['taskId' => $taskId]);
    }

    // ── Interne Aufgaben ──────────────────────────────────────────────────
    public function internalTasks(string $action = ''): string
    {
        return $this->webhook('/interne-aufgaben' . $action);
    }

    // ── Online-Kaeufe ─────────────────────────────────────────────────────
    public function onlinePurchases(string $action = ''): string
    {
        return $this->webhook('/online-kaeufe' . $action);
    }

    // ── Stundennachweise ──────────────────────────────────────────────────
    public function hours(): string
    {
        return $this->webhook('/stundennachweise');
    }

    private static function query(array $query): string
    {
        $filtered = array_filter($query, static fn (mixed $value): bool => $value !== null && $value !== '');

        return $filtered === [] ? '' : '?' . http_build_query($filtered);
    }
}
