<?php

namespace App\Service\Pdf;

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

class ClientWarningResetPdf extends Fpdi
{
    public function __construct(
        private readonly KernelInterface $kernel,
        private readonly Customer $customer,
    ) {
        parent::__construct();
        $this->SetTitle($this->enc('Levee d\'avertissement - '.$this->customer->getFullName()));
        $this->SetAuthor($this->enc('Association E-Cosplay'));
    }

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

        $this->writeHeader();
        $this->writeContent();
        $this->writeSignature();
    }

    /** @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', 16);
        $this->SetXY(60, 10);
        $this->Cell(0, 8, $this->enc('LEVEE D\'AVERTISSEMENT'), 0, 1, 'L');

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

        $this->SetFont('Arial', '', 10);
        $this->SetXY(60, 19);
        $this->Cell(0, 5, $this->enc('Emise a Beautor, le '.$formatter->format(new \DateTime())), 0, 1, 'L');

        // Destinataire
        $y = 32;
        $this->SetFont('Arial', 'B', 11);
        $this->SetXY(120, $y);
        $name = $this->customer->getRaisonSociale() ?: $this->customer->getFullName();
        $this->Cell(0, 5, $this->enc($name), 0, 1, 'L');

        if ($address = $this->customer->getAddress()) {
            $y += 5;
            $this->SetXY(120, $y);
            $this->SetFont('Arial', '', 10);
            $this->Cell(0, 5, $this->enc($address), 0, 1, 'L');
        }

        $y += 5;
        $this->SetXY(120, $y);
        $this->SetFont('Arial', '', 10);
        $cityLine = ($this->customer->getZipCode() ?? '').' '.($this->customer->getCity() ?? '');
        $this->Cell(0, 5, $this->enc(trim($cityLine)), 0, 1, 'L');

        if ($this->customer->getEmail()) {
            $y += 5;
            $this->SetXY(120, $y);
            $this->Cell(0, 5, $this->enc($this->customer->getEmail()), 0, 1, 'L');
        }

        $this->Ln(10);
    }

    /** @codeCoverageIgnore */
    private function writeContent(): void
    {
        $this->SetY(60);

        // Bandeau vert
        $this->SetFillColor(22, 163, 74);
        $this->SetTextColor(255, 255, 255);
        $this->SetFont('Arial', 'B', 12);
        $this->Cell(0, 10, $this->enc('  SITUATION REGULARISEE'), 0, 1, 'L', true);
        $this->SetTextColor(0, 0, 0);
        $this->Ln(5);

        $greeting = $this->customer->getRaisonSociale()
            ? 'Chez '.$this->customer->getRaisonSociale()
            : $this->customer->getFirstName() ?? $this->customer->getFullName();

        $this->SetFont('Arial', '', 10);
        $this->MultiCell(0, 5, $this->enc($greeting.','), 0, 'L');
        $this->Ln(3);

        $this->MultiCell(0, 5, $this->enc('Nous vous confirmons que votre situation a ete regularisee. Les avertissements precedemment emis ont ete leves.'), 0, 'L');
        $this->Ln(3);

        $this->MultiCell(0, 5, $this->enc('Vos services restent actifs et votre compte est en regle. Nous vous remercions pour votre regularisation.'), 0, 'L');
        $this->Ln(5);

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

        $this->SetFont('Arial', 'I', 8);
        $this->SetTextColor(150, 150, 150);
        $this->MultiCell(0, 4, $this->enc(
            'Le present document annule et remplace tout avertissement precedemment emis. '
            .'Toutes les decisions sont prises par le bureau de l\'association a huis clos. '
            .'Toute contestation devra etre adressee a direction@e-cosplay.fr'
        ), 0, 'L');
        $this->SetTextColor(0, 0, 0);
        $this->Ln(5);
    }

    /** @codeCoverageIgnore */
    private function writeSignature(): void
    {
        $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())), 0, 1, 'L');
        $this->Ln(3);

        $this->SetFont('Arial', 'B', 9);
        $this->Cell(0, 5, $this->enc('Pour le bureau de l\'Association E-Cosplay :'), 0, 1, 'L');
        $this->Ln(2);
        $this->SetFont('Arial', '', 10);
        $this->Cell(85, 20, '{{Sign;type=signature;role=First Party}}', 0, 1, 'L');

        $this->Ln(3);
        $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');
    }
}
