<?php
declare(strict_types=1);

use Mpdf\HTMLParserMode;
use Mpdf\Mpdf;
use Mpdf\MpdfException;
use Mpdf\Output\Destination;


class Seguro_Service_GerarTermoAutorizacaoCreditoBeneficiario
{
    private Mpdf $mpdf;
    private Agro_TemplateRenderer $templateRenderer;

    /**
     * @throws MpdfException
     */
    public function __construct()
    {
        $this->templateRenderer = new Agro_TemplateRenderer();

        $this->mpdf = new Mpdf([
            'margin_top' => 5,
            'margin_left' => 15,
            'margin_right' => 15,
            'margin_bottom' => 10,
            'format' => 'A4',
            'default_font_size' => 12,
            'tempDir' => APPLICATION_PATH . '/upload_files/temp',
        ]);

        $sanitizedPath = realpath(
            $_SERVER['DOCUMENT_ROOT'] . "/resources/css/seguro/apolice/termo_autorizacao_credito_beneficiario.css"
        );
        $css = file_get_contents($sanitizedPath);

        $this->mpdf->WriteHTML($css, HTMLParserMode::HEADER_CSS);
    }

    /**
     * @throws MpdfException
     * @throws Exception
     */
    public function executar(int $idPropostaDevolucao): array
    {
        $dir = Seguro_Model_PropostasDevolucoesArquivos::FILE_PATH;
        if (!is_dir($dir)) {
            mkdir($dir, 0755, true);
        }

        $fileName = "{$idPropostaDevolucao}_termo_autorizacao_pagamento_beneficiario.pdf";
        $filePath = $dir . "/{$fileName}";

        $dados = (new Seguro_Model_PropostasDevolucoes)->getDadosTermoBeneficiario($idPropostaDevolucao);

        if (empty($dados)) {
            throw new OutOfBoundsException('Erro ao buscar dados do beneficiário.');
        }

        $pdfBinary = $this->gerarPdf($dados->toArray(), $filePath);

        return [$pdfBinary, $fileName];
    }

    /**
     * @throws MpdfException
     */
    private function gerarPdf(array $dados, string $filePath)
    {
        $dados['conta_corrente'] = $dados['ds_tipo_conta'] === 'C' ? '✓' : '';
        $dados['conta_poupanca'] = $dados['ds_tipo_conta'] !== 'C' ? '✓' : '';
        $dados['conta_conjunta_sim'] = $dados['fl_conta_conjunta'] ? '✓' : '';
        $dados['conta_conjunta_nao'] = !$dados['fl_conta_conjunta'] ? '✓' : '';

        $this->mpdf->WriteHTML(
            $this->templateRenderer->renderizar(
                'seguro/termo-credito/termo_autorizacao_credito_beneficiario.html.tpl',
                $dados
            )
        );

        $this->mpdf->SetHTMLFooter($this->templateRenderer->renderizar('seguro/termo-credito/footer.html.tpl'));
        $this->mpdf->Output($filePath, Destination::FILE);

        return file_get_contents($filePath);
    }
}