<?php
/**
 * PrintService Class
 *
 * @version     1.0.$Revision:$
 * @version     SVN: $Id:$
 * @package     bplan-base/globals
 * @subpackage  Services
 * @author      Wassilios Meletiadis <wassilios.meletiadis@bplan-solutions.de>
 * @copyright   Copyright (C) 2025, 2026 bplan-solutions GmbH & Co. KG <https://www.bplan-solutions.de/>
 * /Δ\
 */

namespace BplanBase\Globals\Services;


use BplanBase\Globals\Enums\PrintJobStatus;
use BplanBase\Globals\Models\PrintJob;
use Illuminate\Http\Client\Response;


/**
 * PrintService Class
 *
 * HTTP-Client für den PrintService-Druckdienst.
 *
 * Die Basis-URL wird nicht aus dem Profil geladen, sondern dynamisch pro
 * Drucker gesetzt. Dafür ist die Factory-Methode forHost() zu verwenden.
 *
 * Verwendung:
 *
 *   $Response = PrintService::forHost($PrintJob->printer->host)->sendJob($PrintJob);
 *
 * @version     1.1.0 / 2026-05-07
 * @author      Wassilios Meletiadis <wassilios.meletiadis@bplan-solutions.de>
 */
class PrintService extends HttpService
{


/* +++ TRAITS +++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */


/* +++ CLASS CONSTANTS +++ ++++++++++++++++++++++++++++++++++++++++++++++++++ */


    /**
     * @var     string
     */
    const ENDPOINT = '/api/printer/{name}/print';


/* +++ OBJECT MEMBERS +++ +++++++++++++++++++++++++++++++++++++++++++++++++++ */


/* +++ CLASS MEMBERS +++ ++++++++++++++++++++++++++++++++++++++++++++++++++++ */


    /**
     * @var     string
     */
    protected static string $_logPrefix = 'PrintService';


/* +++ OBJECT METHODS +++ +++++++++++++++++++++++++++++++++++++++++++++++++++ */


    /**
     * @param       string $profile
     *
     * @version     1.0.0 / 2026-04-27
     * @author      Wassilios Meletiadis <wassilios.meletiadis@bplan-solutions.de>
     */
    public function __construct(string $profile = 'print-service')
    {
        parent::__construct($profile);

    } // __construct()


    /**
     * Sendet den Druckauftrag an den PrintService.
     *
     * Das `payload`-Array wird 1:1 als `params` übermittelt. `callbackURL` wird
     * aus dem PrintJob-Model ergänzt. Der Druckername ist Teil der Route und
     * wird nicht mehr im Payload übermittelt.
     *
     * @param       PrintJob $PrintJob
     *
     * @return      Response
     *
     * @version     1.1.0 / 2026-05-07
     * @author      Wassilios Meletiadis <wassilios.meletiadis@bplan-solutions.de>
     */
    public function sendJob(PrintJob $PrintJob): Response
    {
        $PrintJob->update([
            'sent_at' => now(),
            'status'  => PrintJobStatus::Sent,
        ]);

        $endpointPrefix = $PrintJob->printer->printerType->endpoint_prefix;

        if ($endpointPrefix === null) {
            throw new \RuntimeException('PrinterType ['.$PrintJob->printer->printerType->identifier.'] has no endpoint_prefix configured.');
        }
        $endpoint = str_replace(
            ['{endpoint_prefix}', '{name}'],
            [$endpointPrefix, $PrintJob->printer->name],
            self::ENDPOINT
        );

        $Response = $this->post($endpoint, array_merge($PrintJob->payload, [
            'callbackUrl' => $PrintJob->callback_url,
        ]));

        return $Response;

    } // sendJob()


/* +++ CLASS METHODS +++ ++++++++++++++++++++++++++++++++++++++++++++++++++++ */


    /**
     * Erstellt eine Instanz mit dynamisch gesetzter Basis-URL.
     *
     * @param       string $host
     *
     * @return      static
     *
     * @version     1.0.0 / 2026-04-27
     * @author      Wassilios Meletiadis <wassilios.meletiadis@bplan-solutions.de>
     */
    public static function forHost(string $host): static
    {
        $Instance = new static();

        $Instance->_config['base-url'] = $host;
        $Instance->_PendingRequest     = $Instance->_buildPendingRequest();

        return $Instance;

    } // forHost()


} // class PrintService extends HttpService {}
