<?php

namespace App\Service\Pdf;

use App\Entity\Contrat;
use setasign\Fpdi\Fpdi;
use Symfony\Component\HttpKernel\KernelInterface;

if (!\defined('EURO')) {
    \define('EURO', \chr(128)); // @codeCoverageIgnore
}

class ContratMigrationSiteconseilPdf extends Fpdi
{
    public function __construct(
        private readonly KernelInterface $kernel,
        private readonly Contrat $contrat,
    ) {
        parent::__construct();
        $this->SetTitle($this->enc('Contrat de Service '.$this->contrat->getReference().' - '.$this->contrat->getRaisonSociale()));
        $this->SetAuthor($this->enc('Association E-Cosplay'));
    }

    public function generate(): void
    {
        $this->AliasNbPages();
        $this->AddPage();

        $this->writeHeader();
        $this->writeAssociationInfo();
        $this->writePreambule();
        $this->writeServicesTable();
        $this->writeArticles();
        $this->writeSignatures();
    }

    /** @codeCoverageIgnore */
    public function Header(): void
    {
    }

    /** @codeCoverageIgnore */
    public function Footer(): void
    {
        $this->SetY(-22);
        $this->SetDrawColor(253, 140, 4);
        $this->Line(15, $this->GetY(), 195, $this->GetY());
        $this->Ln(3);
        $this->SetFont('Arial', '', 7);
        $this->SetTextColor(0, 0, 0);
        $this->Cell(190, 3, $this->enc('42 rue de Saint-Quentin - 02800 BEAUTOR - Tel: 07 66 95 70 06 - client@e-cosplay.fr'), 0, 1, 'C');
        $this->Cell(190, 3, $this->enc('Association E-Cosplay - N SIRET 943 121 517 00011 - CODE APE 9329Z - RNA W022006988'), 0, 1, 'C');
        $this->SetFont('Arial', 'I', 7);
        $this->SetTextColor(150, 150, 150);
        $this->Cell(190, 3, $this->enc('Page ').$this->PageNo().' / {nb}', 0, 0, 'C');
    }

    /** @codeCoverageIgnore */
    private function writeHeader(): void
    {
        $logo = $this->kernel->getProjectDir().'/public/logo.jpg';
        if (file_exists($logo)) {
            $this->Image($logo, 10, 8, 45);
        }

        $this->SetFont('Arial', 'B', 14);
        $this->SetXY(60, 10);
        $this->Cell(0, 7, $this->enc('CONTRAT DE SERVICE'), 0, 1, 'L');

        $this->SetFont('Arial', 'B', 10);
        $this->SetXY(60, 17);
        $this->SetTextColor(253, 140, 4);
        $this->Cell(0, 5, $this->enc('Migration SARL SITECONSEIL'), 0, 1, 'L');
        $this->SetTextColor(0, 0, 0);

        $this->SetFont('Arial', '', 9);
        $this->SetXY(60, 23);
        $this->SetTextColor(150, 150, 150);
        $this->Cell(0, 5, $this->enc('Ref. : '.$this->contrat->getReference()), 0, 1, 'L');
        $this->SetTextColor(0, 0, 0);

        $formatter = new \IntlDateFormatter(
            'fr_FR',
            \IntlDateFormatter::FULL,
            \IntlDateFormatter::NONE,
            'Europe/Paris',
            \IntlDateFormatter::GREGORIAN
        );

        $this->SetFont('Arial', '', 10);
        $this->SetXY(60, 29);
        $this->Cell(0, 5, $this->enc('Emis a Beautor, le '.$formatter->format($this->contrat->getCreatedAt())), 0, 1, 'L');

        // Parties
        $this->SetY(42);

        // Partie 1 : Association
        $this->SetFont('Arial', 'B', 9);
        $this->Cell(0, 5, $this->enc('ENTRE LES SOUSSIGNES :'), 0, 1, 'L');
        $this->Ln(2);

        // Bloc info association (meme style ComptaPdf)
        $this->SetDrawColor(200, 200, 200);
        $this->Cell(0, 0.5, '', 'T', 1, 'L');
        $this->Ln(2);

        $labelW = 45;

        $this->SetFont('Arial', '', 9);
        $this->Cell($labelW, 5, $this->enc('Association :'), 0, 0, 'L');
        $this->SetFont('Arial', 'B', 9);
        $this->Cell(0, 5, $this->enc('E-Cosplay Association loi 1901 - RNA N W022006988'), 0, 1, 'L');

        $this->SetFont('Arial', '', 9);
        $this->Cell($labelW, 5, $this->enc('Siege social :'), 0, 0, 'L');
        $this->Cell(0, 5, $this->enc('42 rue de Saint-Quentin 02800 Beautor'), 0, 1, 'L');

        $this->Cell($labelW, 5, 'SIRET :', 0, 0, 'L');
        $this->Cell(0, 5, '943 121 517 00011', 0, 1, 'L');

        $this->Cell($labelW, 5, 'Code APE :', 0, 0, 'L');
        $this->Cell(0, 5, '9329Z', 0, 1, 'L');

        $this->Cell($labelW, 5, $this->enc('President :'), 0, 0, 'L');
        $this->SetFont('Arial', 'B', 9);
        $this->Cell(0, 5, $this->enc('Shoko Cosplay - Serreau Jovann'), 0, 1, 'L');

        $this->SetFont('Arial', '', 9);
        $this->Cell($labelW, 5, 'Email :', 0, 0, 'L');
        $this->Cell(0, 5, 'client@e-cosplay.fr', 0, 1, 'L');

        $this->Cell($labelW, 5, $this->enc('Telephone :'), 0, 0, 'L');
        $this->Cell(0, 5, '07 66 95 70 06', 0, 1, 'L');

        $this->Ln(2);
        $this->Cell(0, 0.5, '', 'T', 1, 'L');
        $this->Ln(2);

        $this->SetFont('Arial', 'I', 9);
        $this->Cell(0, 5, $this->enc('Ci-apres denommee "le Prestataire",'), 0, 1, 'L');
        $this->Ln(3);

        // Partie 2 : Client
        $this->SetFont('Arial', 'B', 9);
        $this->Cell(0, 5, $this->enc('ET :'), 0, 1, 'L');
        $this->Ln(2);

        $this->SetDrawColor(200, 200, 200);
        $this->Cell(0, 0.5, '', 'T', 1, 'L');
        $this->Ln(2);

        $this->SetFont('Arial', '', 9);
        $this->Cell($labelW, 5, $this->enc('Raison sociale :'), 0, 0, 'L');
        $this->SetFont('Arial', 'B', 9);
        $this->Cell(0, 5, '{{RaisonSociale;type=text;role=Customer}}', 0, 1, 'L');

        $this->SetFont('Arial', '', 9);
        $this->Cell($labelW, 5, 'SIRET :', 0, 0, 'L');
        $this->Cell(0, 5, '{{SIRET;type=text;role=Customer}}', 0, 1, 'L');

        $this->Cell($labelW, 5, $this->enc('Adresse :'), 0, 0, 'L');
        $this->Cell(0, 5, '{{Adresse;type=text;role=Customer}}', 0, 1, 'L');

        $this->Cell($labelW, 5, 'Email :', 0, 0, 'L');
        $this->Cell(0, 5, '{{Email;type=text;role=Customer}}', 0, 1, 'L');

        $this->Cell($labelW, 5, $this->enc('Telephone :'), 0, 0, 'L');
        $this->Cell(0, 5, '{{Telephone;type=text;role=Customer}}', 0, 1, 'L');

        $this->Cell($labelW, 5, $this->enc('Representant :'), 0, 0, 'L');
        $this->Cell(0, 5, '{{Representant;type=text;role=Customer}}', 0, 1, 'L');

        $this->Ln(2);
        $this->Cell(0, 0.5, '', 'T', 1, 'L');
        $this->Ln(2);

        $this->SetFont('Arial', 'I', 9);
        $this->Cell(0, 5, $this->enc('Ci-apres denomme(e) "le Client",'), 0, 1, 'L');
        $this->Ln(5);
    }

    /** @codeCoverageIgnore */
    private function writeAssociationInfo(): void
    {
        $this->SetDrawColor(200, 200, 200);
        $this->Cell(0, 0.5, '', 'T', 1, 'L');
        $this->Ln(2);

        $this->SetFont('Arial', 'B', 10);
        $this->Cell(0, 5, $this->enc('INFORMATIONS LEGALES'), 0, 1, 'C');
        $this->Ln(1);

        $labelW = 45;

        $this->SetFont('Arial', '', 9);
        $this->Cell($labelW, 5, $this->enc('Association :'), 0, 0, 'L');
        $this->SetFont('Arial', 'B', 9);
        $this->Cell(0, 5, $this->enc('E-Cosplay Association loi 1901 - RNA N W022006988'), 0, 1, 'L');

        $this->SetFont('Arial', '', 9);
        $this->Cell($labelW, 5, $this->enc('Siege social :'), 0, 0, 'L');
        $this->Cell(0, 5, $this->enc('42 rue de Saint-Quentin 02800 Beautor'), 0, 1, 'L');

        $this->Cell($labelW, 5, 'SIRET :', 0, 0, 'L');
        $this->Cell(0, 5, '943 121 517 00011', 0, 1, 'L');

        $this->Cell($labelW, 5, 'Code APE :', 0, 0, 'L');
        $this->Cell(0, 5, '9329Z', 0, 1, 'L');

        $this->Cell($labelW, 5, $this->enc('President :'), 0, 0, 'L');
        $this->SetFont('Arial', 'B', 9);
        $this->Cell(0, 5, $this->enc('Shoko Cosplay - Serreau Jovann'), 0, 1, 'L');

        $this->SetFont('Arial', '', 9);
        $this->Cell($labelW, 5, 'Email :', 0, 0, 'L');
        $this->Cell(0, 5, 'client@e-cosplay.fr', 0, 1, 'L');

        $this->Cell($labelW, 5, $this->enc('Telephone :'), 0, 0, 'L');
        $this->Cell(0, 5, '07 66 95 70 06', 0, 1, 'L');

        $this->Cell($labelW, 5, 'Site web :', 0, 0, 'L');
        $this->Cell(0, 5, 'www.e-cosplay.fr', 0, 1, 'L');

        $this->Cell($labelW, 5, 'Document :', 0, 0, 'L');
        $this->SetFont('Arial', 'B', 9);
        $this->Cell(0, 5, $this->enc('Contrat de Service - '.$this->contrat->getReference()), 0, 1, 'L');

        $this->Ln(2);
        $this->Cell(0, 0.5, '', 'T', 1, 'L');
        $this->Ln(3);
    }

    /** @codeCoverageIgnore */
    private function writePreambule(): void
    {
        $this->SetFont('Arial', 'B', 11);
        $this->SetFillColor(250, 191, 4);
        $this->Cell(0, 8, $this->enc('  PREAMBULE'), 0, 1, 'L', true);
        $this->Ln(4);

        $this->SetFont('Arial', '', 9);
        $paragraphs = [
            'Le present contrat est conclu entre le Client et l\'Association E-Cosplay pour la reprise '
            .'des services qui etaient precedemment assures par la SARL SITECONSEIL.',
        ];

        foreach ($paragraphs as $p) {
            $this->MultiCell(0, 5, $this->enc($p), 0, 'J');
            $this->Ln(2);
        }

        $this->Ln(3);
    }

    /** @codeCoverageIgnore */
    private function writeServicesTable(): void
    {
        $services = $this->contrat->getServices();
        if ([] === $services) {
            return;
        }

        if ($this->GetY() + 30 > $this->GetPageHeight() - 25) {
            $this->AddPage();
        }

        $this->SetFont('Arial', 'B', 11);
        $this->SetFillColor(250, 191, 4);
        $this->Cell(0, 8, $this->enc('  SERVICES INCLUS DANS LE CONTRAT'), 0, 1, 'L', true);
        $this->Ln(4);

        // Header tableau
        $this->SetFont('Arial', 'B', 9);
        $this->SetFillColor(35, 35, 35);
        $this->SetTextColor(255, 255, 255);
        $this->Cell(80, 7, $this->enc(' Service'), 1, 0, 'L', true);
        $this->Cell(20, 7, $this->enc('Qte'), 1, 0, 'C', true);
        $this->Cell(40, 7, $this->enc('Prix unitaire HT'), 1, 0, 'R', true);
        $this->Cell(40, 7, $this->enc('Sous-total HT'), 1, 1, 'R', true);
        $this->SetTextColor(0, 0, 0);

        $this->SetFont('Arial', '', 9);
        $fill = false;
        $catalog = \App\Entity\Contrat::SERVICE_CATALOG;

        foreach ($services as $s) {
            $this->SetFillColor(245, 245, 240);
            $label = $catalog[$s['service']]['label'] ?? $s['service'];
            $unit = $catalog[$s['service']]['unit'] ?? '';
            $qty = $s['quantity'];
            $price = (float) $s['priceHt'];
            $subtotal = $price * $qty;

            $this->Cell(80, 6, $this->enc(' '.$label), 'B', 0, 'L', $fill);
            $this->Cell(20, 6, (string) $qty, 'B', 0, 'C', $fill);
            $this->Cell(40, 6, number_format($price, 2, ',', ' ').' '.EURO.' '.$unit, 'B', 0, 'R', $fill);
            $this->Cell(40, 6, number_format($subtotal, 2, ',', ' ').' '.EURO, 'B', 1, 'R', $fill);

            $fill = !$fill;
        }

        // Total
        $this->SetFont('Arial', 'B', 10);
        $this->Cell(140, 8, $this->enc('TOTAL HT / mois'), 0, 0, 'R');
        $this->Cell(40, 8, number_format($this->contrat->getTotalHt(), 2, ',', ' ').' '.EURO.' /mois', 0, 1, 'R');

        $this->Ln(5);
    }

    /** @codeCoverageIgnore */
    private function writeArticles(): void
    {
        $articles = [
            'OBJET DU CONTRAT' => [
                'Le present contrat a pour objet de definir les conditions dans lesquelles l\'Association '
                .'E-Cosplay fournira au Client les services informatiques precedemment assures par la '
                .'SARL SITECONSEIL, incluant sans s\'y limiter : l\'hebergement web, la gestion des noms '
                .'de domaine, la messagerie electronique, et tout autre service technique associe.',
            ],
            'TRANSFERT DES SERVICES' => [
                'Le Client reconnait que les services qui lui etaient fournis par la SARL SITECONSEIL '
                .'sont desormais operes par l\'Association E-Cosplay.',
                'Le Client accepte que le transfert de ses services soit effectue dans les conditions '
                .'du present contrat, sans garantie de reprise des conditions anterieures.',
                'Les sites internet continuent d\'utiliser le CMS Esy-Web. Le code source du CMS est '
                .'gere par l\'Association E-Cosplay, sous la responsabilite d\'un membre fondateur, '
                .'ancien salarie de la SARL SITECONSEIL.',
            ],
            'CONDITIONS TARIFAIRES' => [
                'Les tarifs applicables seront ceux en vigueur au sein de l\'Association E-Cosplay '
                .'au moment de la signature du present contrat. Ces tarifs sont non negociables.',
                'Les tarifs precedemment appliques par la SARL SITECONSEIL ne sont pas opposables '
                .'a l\'Association E-Cosplay.',
                'Les devis et factures seront emis par l\'Association E-Cosplay selon sa propre grille tarifaire. '
                .'La grille tarifaire complete est consultable sur https://crm.e-cosplay.fr/legal/tarif.',
            ],
            'PAIEMENT' => [
                'Les paiements par carte bancaire et prelevement SEPA sont operes par Stripe, '
                .'plateforme de paiement securisee et certifiee PCI DSS.',
                'Le compte bancaire de l\'association est domicilie chez SumUp en Irlande.',
                'Le premier paiement devra obligatoirement etre effectue par carte bancaire ou '
                .'prelevement automatique SEPA. Les virements ne sont pas acceptes pour le premier paiement.',
                'Pour les paiements suivants, le Client pourra choisir entre le prelevement automatique '
                .'SEPA, la carte bancaire ou le virement bancaire.',
            ],
            'IMPAYES ET SUSPENSION' => [
                'En cas de non-paiement, les services du Client seront automatiquement suspendus '
                .'sans intervention humaine. Aucun renouvellement ne sera effectue sans paiement prealable.',
                'Delais de relance : un premier rappel est envoye 15 jours avant l\'echeance, '
                .'puis a 10 jours, 5 jours, 3 jours et 1 jour avant la date d\'echeance.',
                'A defaut de paiement a l\'echeance, une mise en demeure est envoyee par email. '
                .'Sans regularisation sous 5 jours apres la mise en demeure, les services sont suspendus.',
                'Apres 30 jours d\'impaye sans regularisation, une procedure de resiliation definitive '
                .'est engagee. Les donnees du Client seront supprimees sous 24 heures.',
                'Un depot aupres d\'une societe de recouvrement sera effectue pour les factures restant dues. '
                .'Une mise en demeure pourra etre deposee aupres d\'un commissaire de justice.',
                'Des penalites de retard sont applicables de plein droit, au taux de 3 fois le taux '
                .'d\'interet legal en vigueur, sans qu\'un rappel soit necessaire.',
                'Une indemnite forfaitaire de recouvrement de 40 EUR est due pour chaque facture '
                .'payee apres la date d\'echeance (article D.441-5 du Code de commerce).',
                'Conformement a l\'article 1219 du Code civil (exception d\'inexecution), l\'Association '
                .'est en droit de suspendre l\'execution de ses obligations lorsque le Client ne remplit pas les siennes.',
                'Le non-paiement d\'une facture a son echeance entraine de plein droit la suspension '
                .'immediate des services concernes (article L.441-10 du Code de commerce).',
                'L\'association est libre de suspendre ou de cesser la fourniture de ses services en cas '
                .'de non-paiement, quelle que soit la situation de l\'entreprise du Client (y compris en cas '
                .'de difficultes financieres, de redressement ou de liquidation judiciaire, sous reserve '
                .'des dispositions specifiques applicables aux procedures collectives).',
                'S\'enerver, insulter ou appeler l\'association ne changera en aucun cas la situation. '
                .'Sans paiement, les services restent suspendus. Aucun arrangement ne sera possible.',
            ],
            'SYSTEME D\'AVERTISSEMENT ET SANCTIONS' => [
                'L\'Association E-Cosplay dispose d\'un systeme d\'avertissement. En cas de non-respect '
                .'des CGV, CGU, de comportement inapproprie (insultes, menaces, harcelement, manque de '
                .'respect), d\'appels hors des heures d\'ouverture avec refus de payer le service hors '
                .'horaire, ou d\'exigence de services gratuits, un avertissement sera emis.',
                '1er avertissement : notification officielle au Client. Invitation a regulariser la '
                .'situation. En cas de repetition, un 2eme avertissement sera decide.',
                '2eme avertissement : la procedure de suspension est preparee. La resiliation des '
                .'services (sites internet, emails, noms de domaine) est programmee. La fermeture du '
                .'compte est preparee. Ces mesures seront effectives au prochain avertissement.',
                '3eme avertissement : le bureau de l\'association se reunit sous 24 heures pour decider '
                .'de la resiliation definitive des services. Cette decision est non negociable. '
                .'Aucune discussion, aucun recours, aucun delai supplementaire ne sera accorde.',
                'Delai de recours : entre le 3eme avertissement et la reunion du bureau (24h), le Client '
                .'peut envoyer un email a direction@e-cosplay.fr pour contester. Cela repousse l\'echeance '
                .'a 72 heures. Le Client devra fournir des preuves et documents justificatifs.',
                'Des frais de remise en service pourront etre demandes, plafonnes a 300 EUR HT.',
                'Toutes les decisions relatives aux avertissements, sanctions et resiliations sont prises '
                .'par le bureau de l\'association et les membres fondateurs, a huis clos.',
                'Les decisions relatives aux avertissements et sanctions restent strictement privees afin '
                .'de proteger la reputation du Client. Seule une Assemblee Generale Exceptionnelle pourra '
                .'etre convoquee avec pour unique mention a l\'ordre du jour : "Discussion resiliation '
                .'service client". Aucune information nominative ne sera communiquee.',
                'Toute contestation devra etre adressee exclusivement a direction@e-cosplay.fr.',
            ],
            'HORAIRES DU SERVICE CLIENT' => [
                'Le service client par telephone est disponible du lundi au vendredi de 10h a 12h '
                .'et de 14h a 17h.',
                'En dehors de ces horaires, le service ne repondra pas ou une facturation de '
                .'35 EUR HT par heure (toute heure commencee est due) sera appliquee.',
                'Exception : les appels lies a un probleme technique reel, verifie et verifiable '
                .'par nos equipes, ne seront pas factures.',
            ],
            'DUREE ET RESILIATION' => [
                'Le present contrat prend effet a la date de sa signature et est conclu pour une duree indeterminee.',
                'Chacune des parties peut resilier le contrat a tout moment, sous reserve d\'un preavis '
                .'de 30 jours, notifie par email avec accuse de reception.',
            ],
            'ANCIENNETE ET DROITS ANTERIEURS' => [
                'Le Client reconnait expressement que l\'Association E-Cosplay ne reprend aucun '
                .'engagement, garantie, condition particuliere ou anciennete lies aux relations '
                .'commerciales entre le Client et la SARL SITECONSEIL.',
                'Tout litige relatif aux prestations anterieures de la SARL SITECONSEIL devra etre '
                .'dirige exclusivement vers cette derniere.',
            ],
            'RESPONSABILITE' => [
                'L\'Association E-Cosplay s\'engage a assurer la continuite des services dans la mesure '
                .'du possible. Elle ne saurait etre tenue responsable des interruptions de service '
                .'liees a la transition depuis la SARL SITECONSEIL.',
                'L\'association ne saurait etre tenue responsable des dommages indirects, pertes '
                .'de donnees, pertes d\'exploitation ou manque a gagner.',
            ],
            'DONNEES PERSONNELLES' => [
                'L\'Association E-Cosplay s\'engage a traiter les donnees personnelles du Client '
                .'conformement au Reglement General sur la Protection des Donnees (RGPD) et a la '
                .'loi Informatique et Libertes.',
                'Le Client peut exercer ses droits d\'acces, de rectification et de suppression '
                .'en contactant client@e-cosplay.fr.',
            ],
            'CONDITIONS GENERALES DE VENTE' => [
                'Le Client reconnait avoir pris connaissance des Conditions Generales de Vente (CGV) '
                .'de l\'Association E-Cosplay, consultables a l\'adresse https://crm.e-cosplay.fr/legal/cgv, '
                .'et les accepter sans reserve.',
                'Les CGV font partie integrante du present contrat.',
            ],
            'DROIT APPLICABLE ET JURIDICTION' => [
                'Le present contrat est soumis au droit francais. En cas de litige, les parties '
                .'s\'engagent a rechercher une solution amiable. A defaut, les tribunaux competents '
                .'de Laon seront seuls competents.',
            ],
        ];

        $articleNum = 1;
        foreach ($articles as $title => $contents) {
            if ($this->GetY() + 25 > $this->GetPageHeight() - 25) {
                $this->AddPage();
            }

            $this->SetFont('Arial', 'B', 10);
            $this->Cell(0, 6, $this->enc('Article '.$articleNum.' - '.$title), 0, 1, 'L');
            $this->Ln(1);

            $this->SetFont('Arial', '', 9);
            foreach ($contents as $content) {
                $this->MultiCell(0, 4, $this->enc($content), 0, 'J');
                $this->Ln(2);
            }

            $this->Ln(2);
            ++$articleNum;
        }
    }

    /** @codeCoverageIgnore */
    private function writeSignatures(): void
    {
        if ($this->GetY() + 50 > $this->GetPageHeight() - 25) {
            $this->AddPage();
        }

        $this->SetDrawColor(200, 200, 200);
        $this->Cell(0, 0.5, '', 'T', 1, 'L');
        $this->Ln(3);

        $formatter = new \IntlDateFormatter(
            'fr_FR',
            \IntlDateFormatter::LONG,
            \IntlDateFormatter::NONE,
            'Europe/Paris',
            \IntlDateFormatter::GREGORIAN
        );

        $this->SetFont('Arial', '', 9);
        $this->Cell(0, 5, $this->enc('Fait a Beautor, le '.$formatter->format(new \DateTime()).', en deux exemplaires.'), 0, 1, 'L');
        $this->Ln(5);

        $colWidth = 85;

        // Labels
        $this->SetFont('Arial', 'B', 9);
        $this->Cell($colWidth, 5, $this->enc('Pour l\'Association E-Cosplay :'), 0, 0, 'L');
        $this->Cell(10, 5, '', 0, 0);
        $this->Cell($colWidth, 5, $this->enc('Le Client ('.$this->contrat->getRaisonSociale().') :'), 0, 1, 'L');
        $this->Ln(2);

        // Signatures DocuSeal
        $this->SetFont('Arial', '', 10);
        $this->Cell($colWidth, 20, '{{Sign;type=signature;role=Company}}', 0, 0, 'L');
        $this->Cell(10, 20, '', 0, 0);
        $this->Cell($colWidth, 20, '{{SignClient;type=signature;role=Customer}}', 0, 1, 'L');

        $this->Ln(5);
        $this->SetFont('Arial', 'I', 8);
        $this->SetTextColor(150, 150, 150);
        $this->Cell(0, 4, $this->enc('Signature electronique via DocuSeal - Valeur juridique (reglement eIDAS, art. 1367 Code civil)'), 0, 1, 'C');
        $this->SetTextColor(0, 0, 0);
    }

    private function enc(string $text): string
    {
        return mb_convert_encoding($text, 'Windows-1252', 'UTF-8');
    }
}
