<?php

declare(strict_types=1);

namespace App\Service\Export\Encoder;

use App\Enum\Export\ExportFormatEnum;
use App\Service\Utils\PathUtils;
use Dompdf\Dompdf;
use Dompdf\Options;

/**
 * Encode HTML to PDF.
 */
class PdfEncoder implements EncoderInterface
{
    protected Options $domPdfOptions;
    protected Dompdf $dompdf;

    public function __construct()
    {
        $this->domPdfOptions = new Options();
        $this->dompdf = new Dompdf();
    }

    public function support(string $format): bool
    {
        return $format === ExportFormatEnum::PDF->value;
    }

    /**
     * Converts the provided HTML content into a PDF document.
     *
     * @param string               $html    the HTML content to be converted to PDF
     * @param array<string, mixed> $options Optional configuration settings for the PDF generation
     *
     *                                      @see https://github.com/dompdf/dompdf/blob/master/src/Options.php
     *
     * @return string the generated PDF content as a string
     */
    public function encode(string $html, array $options = []): string
    {
        $this->domPdfOptions->setIsRemoteEnabled(true);
        $this->domPdfOptions->setChroot(PathUtils::getProjectDir().'/public');
        $this->domPdfOptions->setDefaultPaperOrientation('portrait');
        $this->domPdfOptions->setDefaultPaperSize('A4');
        $this->domPdfOptions->set($options);

        $this->dompdf->setOptions($this->domPdfOptions);
        $this->dompdf->loadHtml($html);
        $this->dompdf->render();

        return $this->dompdf->output();
    }
}
