<?php
/**
 * OVP-Sponsorizare - Generator PDF Formular D177
 * Identic vizual cu formularul oficial ANAF D177
 *
 * @package   OVPSPO_Sponsorizare
 * @author    Ovidiu Pantiru - OVP-Digital
 * @license   GPL-2.0+
 */
if ( ! defined( 'ABSPATH' ) ) exit;

class OVPSPO_PDF177 {

    // Layout
    const ML = 10;
    const IW = 190;
    const RW = 200; // ML + IW

    public static function generate( $data, $id ) {
        if ( ! self::load_tcpdf() ) return self::generate_fallback( $data, $id );

        $pdf = new OVPSPO_TCPDF('P','mm','A4',true,'UTF-8',false);
        $pdf->SetCreator('OVP-Sponsorizare');
        $pdf->SetTitle('Formular D177');
        $pdf->SetMargins(0,0,0);
        $pdf->SetAutoPageBreak(false);
        $pdf->setPrintHeader(false);
        $pdf->setPrintFooter(false);

        // Pagina 1
        $pdf->AddPage();
        self::page1($pdf, $data);

        // Pagina 2 - date beneficiari + imputernicit
        $pdf->AddPage();
        self::page2($pdf, $data);

        // Salveaza
        $upload_dir = wp_upload_dir();
        $dir = $upload_dir['basedir'] . '/formular177/';
        if ( ! file_exists($dir) ) wp_mkdir_p($dir);
        $slug = self::slug( $data['denumire'] ?? 'formular' );
        $fp   = $dir . 'D177_' . $slug . '_' . intval($id) . '.pdf';
        $pdf->Output($fp, 'F');
        return file_exists($fp) ? $fp : '';
    }

    // ═══════════════════════════════════════════════════════════
    // PAGINA 1 — Header + Contribuabil + Sume + Tipuri beneficiari
    // ═══════════════════════════════════════════════════════════
    private static function page1( $pdf, $data ) {
        $ml = self::ML; $iw = self::IW; $rw = self::RW;
        $y  = 8;

        // ── HEADER ───────────────────────────────────────────
        // Box D177
        $pdf->SetFillColor(240,240,240);
        $pdf->SetDrawColor(80,80,80);
        $pdf->SetLineWidth(0.4);
        $pdf->Rect($ml, $y, 32, 18, 'FD');
        self::f($pdf,'B',20);
        $pdf->SetXY($ml, $y+2); $pdf->Cell(32,14,'D177',0,0,'C');

        // Titlu
        self::f($pdf,'B',10);
        $pdf->SetTextColor(0,0,0);
        $pdf->SetXY($ml+34, $y+1); $pdf->Cell(100,6,'CERERE PRIVIND REDIRECȚIONAREA',0,0,'L');
        $pdf->SetXY($ml+34, $y+7); $pdf->Cell(100,6,'IMPOZITULUI PE PROFIT',0,0,'L');

        // Anul
        self::f($pdf,'',7); $pdf->SetTextColor(60,60,60);
        $pdf->SetXY($rw-60, $y); $pdf->Cell(28,4,'Anul (aaaa)',0,0,'L');
        self::field_req($pdf, $rw-32, $y, 32, 8, $data['an']??'', 11);

        // Perioada
        $pdf->SetXY($rw-60, $y+10);
        self::f($pdf,'B',7.5); $pdf->SetTextColor(0,0,0);
        $pdf->Cell(60,4,'PERIOADA',0,0,'C');

        $y += 14;
        self::f($pdf,'',6.5); $pdf->SetTextColor(60,60,60);
        $pdf->SetXY($rw-60,$y); $pdf->Cell(27,3.5,'Data început',0,0,'L');
        $pdf->SetXY($rw-32,$y); $pdf->Cell(32,3.5,'Data sfarsit',0,0,'L');
        $y += 3.5;
        $di = !empty($data['data_inceput']) ? gmdate('d.m.Y', strtotime($data['data_inceput'])) : '';
        $ds = !empty($data['data_sfarsit'])  ? gmdate('d.m.Y', strtotime($data['data_sfarsit']))  : '';
        self::field_req($pdf, $rw-60, $y, 27, 7, $di, 8);
        self::field_req($pdf, $rw-32, $y, 32, 7, $ds, 8);

        // Linie header
        $y = 8 + 26;
        $pdf->SetDrawColor(60,60,60); $pdf->SetLineWidth(0.5);
        $pdf->Line($ml,$y,$rw,$y);
        $pdf->SetLineWidth(0.2); $pdf->SetDrawColor(0,0,0);

        // ── CERERE RECTIFICATIVA ─────────────────────────────
        $y += 2;
        self::chk($pdf, $ml, $y+0.5, 4, !empty($data['rectificativa']));
        self::f($pdf,'',8); $pdf->SetTextColor(0,0,0);
        $pdf->SetXY($ml+5.5,$y); $pdf->Cell(70,5,'Cerere rectificativă',0,0,'L');
        self::chk($pdf, $ml+110, $y+0.5, 4, !empty($data['rectif_notif']));
        $pdf->SetXY($ml+116,$y); $pdf->Cell(75,5,'Cerere rectificativă ca urmare a unei notificări',0,0,'L');

        $y += 6;
        $pdf->SetFillColor(248,248,248); $pdf->SetDrawColor(160,160,160);
        $pdf->Rect($ml,$y,$iw,14,'FD');
        self::f($pdf,'',7); $pdf->SetTextColor(50,50,50);
        $pdf->SetXY($ml+1,$y+1); $pdf->Cell(80,4,'Data și numărul de înregistrare a cererii care se rectifică',0,0,'L');
        self::f($pdf,'I',6.5); $pdf->SetTextColor(100,100,100);
        $pdf->SetXY($ml+1,$y+4.5); $pdf->Cell(80,3.5,'Mai întâi bifați cel puțin una din casutele de mai sus, apoi',0,0,'L');
        $pdf->SetXY($ml+1,$y+7.5); $pdf->Cell(80,3.5,'introduceți indexul de încărcare al cererii care se rectifică',0,0,'L');
        self::field($pdf, $ml+83,$y+1,58,7,$data['data_rectif']??'',8);
        self::f($pdf,'',7); $pdf->SetTextColor(50,50,50);
        $pdf->SetXY($ml+143,$y+1); $pdf->Cell(30,4,'Suma de control',0,0,'L');
        self::f($pdf,'B',9); $pdf->SetTextColor(0,0,0);
        $pdf->SetXY($ml+143,$y+5); $pdf->Cell(30,5,'0',0,0,'L');
        $pdf->SetDrawColor(0,0,0);

        // ── SECTIUNEA I: CONTRIBUABIL ─────────────────────────
        $y += 16;
        self::f($pdf,'B',8.5); $pdf->SetTextColor(0,0,0);
        $pdf->SetXY($ml,$y); $pdf->Cell($iw,5.5,'I. Date de identificare a contribuabilului',0,0,'L');
        self::sep($pdf,$y+5.5); $y += 7;

        // CIF + Denumire
        self::lbl($pdf,$ml,$y,50,'Cod de identificare fiscală');
        self::lbl($pdf,$ml+52,$y,100,'Denumire');
        $y += 4;
        self::field_req($pdf,$ml,$y,50,8,$data['cif']??'',9);
        self::field_req($pdf,$ml+52,$y,$iw-52,8,$data['denumire']??'',9);

        // Adresa
        $y += 10;
        self::f($pdf,'B',8); $pdf->SetTextColor(0,0,0);
        $pdf->SetXY($ml,$y); $pdf->Cell($iw,4.5,'Adresa',0,0,'L'); $y += 5;
        self::lbl($pdf,$ml,$y,42,'Județ');
        self::lbl($pdf,$ml+44,$y,28,'Sector');
        self::lbl($pdf,$ml+74,$y,70,'Localitate');
        self::lbl($pdf,$ml+160,$y,30,'Cod Poștal');
        $y += 4;
        self::field($pdf,$ml,$y,42,8,$data['judet']??'');
        self::field($pdf,$ml+44,$y,28,8,$data['sector']??'');
        self::field($pdf,$ml+74,$y,84,8,$data['localitate']??'');
        self::field($pdf,$ml+160,$y,$iw-160,8,$data['cod_postal']??'');

        $y += 9;
        self::f($pdf,'I',6.5); $pdf->SetTextColor(80,80,80);
        $pdf->SetXY($ml,$y);
        $pdf->Cell($iw,4,'Pentru a șterge valoarea introdusă în câmpul Județ, apăsați și mențineți apăsată tasta Control (Ctrl) în timp ce selectați o opțiune.',0,0,'L');

        $y += 5;
        self::lbl($pdf,$ml,$y,$iw,'Strada si Număr'); $y += 4;
        self::field($pdf,$ml,$y,$iw,8,$data['strada']??'');

        $y += 10;
        self::lbl($pdf,$ml,$y,$iw,'Informații suplimentare și completări la adresa (bloc, scara, etaj, apartament...)'); $y += 4;
        self::field($pdf,$ml,$y,$iw,8,$data['info_adresa']??'');

        // Date contact
        $y += 10;
        self::f($pdf,'B',8); $pdf->SetTextColor(0,0,0);
        $pdf->SetXY($ml,$y); $pdf->Cell($iw,4.5,'Date de contact',0,0,'L'); $y += 5;
        self::lbl($pdf,$ml,$y,45,'Telefon');
        self::lbl($pdf,$ml+47,$y,40,'Fax');
        self::lbl($pdf,$ml+89,$y,$iw-89,'E-mail');
        $y += 4;
        self::field($pdf,$ml,$y,45,8,$data['telefon']??'');
        self::field($pdf,$ml+47,$y,40,8,$data['fax']??'');
        self::field($pdf,$ml+89,$y,$iw-89,8,$data['email']??'');

        // ── SECTIUNEA II: SUME ────────────────────────────────
        $y += 11;
        self::f($pdf,'B',8.5); $pdf->SetTextColor(0,0,0);
        $pdf->SetXY($ml,$y); $pdf->Cell($iw,5.5,'II. Redirecționarea impozitului pe profit:',0,0,'L');
        self::sep($pdf,$y+5.5); $y += 7;

        self::lbl($pdf,$ml,$y,90,'Suma maximă care poate fi redirecționată potrivit legii (lei)');
        self::lbl($pdf,$ml+95,$y,90,'Suma redirecționată prin formularele 177 depuse anterior (lei)');
        $y += 4;
        $v1 = !empty($data['suma_max'])      ? number_format((float)$data['suma_max'],0,',','.')      : '';
        $v2 = !empty($data['suma_ant'])       ? number_format((float)$data['suma_ant'],0,',','.')       : '';
        $v3 = !empty($data['suma_ramasa'])    ? number_format((float)$data['suma_ramasa'],0,',','.')    : '';
        self::field_req($pdf,$ml,$y,88,9,$v1,9);
        self::field_req($pdf,$ml+95,$y,88,9,$v2,9);
        $y += 11;
        self::lbl($pdf,$ml,$y,70,'Suma rămasă de redirecționat (lei)'); $y += 4;
        self::field_req($pdf,$ml,$y,60,9,$v3,9);

        // ── TIPURI BENEFICIARI (1,2,3,4) ─────────────────────
        $y += 12;
        $pdf->SetFillColor(248,250,255);
        $pdf->SetDrawColor(130,150,190);
        $pdf->SetLineWidth(0.25);
        $pdf->Rect($ml,$y,$iw,42,'FD');

        $by = $y + 3;
        $bnf_list = $data['beneficiari'] ?? array();
        // Determina tipurile bifate
        $tipuri_bifate = array_unique(array_map(function($b){ return intval($b['tip']??1); }, $bnf_list));

        $tipuri = array(
            1 => '1. Sponsorizare către entități persoane juridice fără scop lucrativ, inclusiv unități de cult',
            2 => '2. Sponsorizare către beneficiari, alții decât cei de la punctul 1, potrivit legii',
            3 => '3. Act de mecenat',
            4 => '4. Fondul Națiunilor Unite Pentru Copii (UNICEF) și alte organizații internaționale care își desfășoară activitatea potrivit prevederilor unor acorduri speciale la care România este parte',
        );
        foreach ( $tipuri as $tnr => $tlbl ) {
            self::chk($pdf,$ml+3,$by,4.5,in_array($tnr,$tipuri_bifate));
            self::f($pdf,'',7.5); $pdf->SetTextColor(0,0,0);
            $pdf->SetXY($ml+9,$by-0.3);
            if ( $tnr === 4 ) {
                $pdf->MultiCell($iw-12,4,$tlbl,0,'L',false,0);
            } else {
                $pdf->Cell($iw-12,5,$tlbl,0,0,'L');
            }
            $by += ($tnr === 4 ? 8 : 7);
        }
        $pdf->SetDrawColor(0,0,0);

        // Footer pagina 1
        self::f($pdf,'',7); $pdf->SetTextColor(100,100,100);
        $pdf->SetXY($ml,289); $pdf->Cell($iw,4,'Pagina 1 din 2',0,0,'C');
    }

    // ═══════════════════════════════════════════════════════════
    // PAGINA 2 — Beneficiari (detalii) + Imputernicit + Semnatura
    // ═══════════════════════════════════════════════════════════
    private static function page2( $pdf, $data ) {
        $ml = self::ML; $iw = self::IW; $rw = self::RW;

        $bnf_list = $data['beneficiari'] ?? array();

        // Header pagina 2
        $y = 8;
        self::f($pdf,'',8); $pdf->SetTextColor(100,100,100);
        $pdf->SetXY($ml,$y); $pdf->Cell($iw,5,'D177',0,0,'C');
        self::sep($pdf,$y+5); $y += 8;

        // ── FIECARE BENEFICIAR ────────────────────────────────
        foreach ( $bnf_list as $idx => $bnf ) {
            $nr = $idx + 1;
            // Titlu beneficiar
            self::f($pdf,'B',8.5); $pdf->SetTextColor(0,0,0);
            $pdf->SetXY($ml,$y);
            $pdf->Cell($iw,5.5,'Date de identificare a beneficiarului ' . ( count($bnf_list) > 1 ? "($nr)" : '' ),0,0,'L');
            self::sep($pdf,$y+5.5); $y += 7;

            // Denumire + CIF
            self::lbl($pdf,$ml,$y,100,'Denumire/ Prenume și Nume');
            self::lbl($pdf,$ml+120,$y,70,'Cod de identificare fiscală');
            $y += 4;
            self::field_req($pdf,$ml,$y,118,8,$bnf['denumire']??'',9);
            self::field_req($pdf,$ml+120,$y,$iw-120,8,$bnf['cif']??'',9);

            // Adresa beneficiar
            $y += 11;
            self::f($pdf,'B',8); $pdf->SetTextColor(0,0,0);
            $pdf->SetXY($ml,$y); $pdf->Cell($iw,4.5,'Adresa',0,0,'L'); $y += 5;

            self::lbl($pdf,$ml,$y,42,'Județ');
            self::lbl($pdf,$ml+44,$y,28,'Sector');
            self::lbl($pdf,$ml+74,$y,70,'Localitate');
            self::lbl($pdf,$ml+160,$y,30,'Cod Poștal');
            $y += 4;
            self::field($pdf,$ml,$y,42,8,$bnf['judet']??'');
            self::field($pdf,$ml+44,$y,28,8,$bnf['sector']??'');
            self::field($pdf,$ml+74,$y,84,8,$bnf['localitate']??'');
            self::field($pdf,$ml+160,$y,$iw-160,8,$bnf['cod_postal']??'');

            $y += 9;
            self::f($pdf,'I',6.5); $pdf->SetTextColor(80,80,80);
            $pdf->SetXY($ml,$y);
            $pdf->Cell($iw,4,'Pentru a șterge valoarea introdusă în câmpul Județ, apăsați și mențineți apăsată tasta Control (Ctrl) în timp ce selectați o opțiune.',0,0,'L');

            $y += 5;
            self::lbl($pdf,$ml,$y,$iw,'Strada si Număr'); $y += 4;
            self::field($pdf,$ml,$y,$iw,8,$bnf['strada']??'');

            $y += 10;
            self::lbl($pdf,$ml,$y,$iw,'Informații suplimentare și completări la adresa (bloc, scara, etaj, apartament...)'); $y += 4;
            self::field($pdf,$ml,$y,$iw,8,$bnf['info']??'');

            // Date contact
            $y += 11;
            self::f($pdf,'B',8); $pdf->SetTextColor(0,0,0);
            $pdf->SetXY($ml,$y); $pdf->Cell($iw,4.5,'Date de contact',0,0,'L'); $y += 5;
            self::lbl($pdf,$ml,$y,65,'Telefon');
            self::lbl($pdf,$ml+67,$y,$iw-67,'E-mail');
            $y += 4;
            self::field($pdf,$ml,$y,65,8,$bnf['telefon']??'');
            self::field($pdf,$ml+67,$y,$iw-67,8,$bnf['email']??'');

            // Date despre suma
            $y += 11;
            self::f($pdf,'B',8); $pdf->SetTextColor(0,0,0);
            $pdf->SetXY($ml,$y); $pdf->Cell($iw,4.5,'Date despre suma',0,0,'L'); $y += 5;
            self::lbl($pdf,$ml,$y,52,'Contract nr.si data');
            self::lbl($pdf,$ml+54,$y,80,'Cont bancar (IBAN)');
            self::lbl($pdf,$ml+136,$y,$iw-136,'Suma de redirectionat (lei)');
            $y += 4;
            self::field($pdf,$ml,$y,52,8,$bnf['contract']??'');
            self::field_req($pdf,$ml+54,$y,80,8,$bnf['iban']??'',8);
            $sv = !empty($bnf['suma']) ? number_format((float)$bnf['suma'],0,',','.') : '';
            self::field_req($pdf,$ml+136,$y,$iw-136,8,$sv,9);

            // Acord GDPR
            $y += 11;
            self::chk($pdf,$ml,$y+1,4.5,!empty($bnf['acord_gdpr']));
            self::f($pdf,'',7.5); $pdf->SetTextColor(0,0,0);
            $pdf->SetXY($ml+6,$y);
            $pdf->MultiCell($iw-6,4.5,'Sunt de acord ca datele de identificare (denumire si cod de identificare fiscala), precum și cuantumul sumelor redirecționate să fie comunicate entitatii beneficiare',0,'L',false,1);
            $y = $pdf->GetY() + 4;

            // Separator intre beneficiari
            if ( $idx < count($bnf_list) - 1 ) {
                $pdf->SetDrawColor(150,150,150); $pdf->SetLineWidth(0.3);
                $pdf->Line($ml,$y,$rw,$y);
                $pdf->SetDrawColor(0,0,0); $pdf->SetLineWidth(0.2);
                $y += 5;
            }
        }

        // ── SECTIUNEA III: IMPUTERNICIT ───────────────────────
        $y += 3;
        self::f($pdf,'B',8.5); $pdf->SetTextColor(0,0,0);
        $pdf->SetXY($ml,$y); $pdf->Cell($iw,5.5,'III. Date de identificare a imputernicitului',0,0,'L');
        self::sep($pdf,$y+5.5); $y += 7;

        // CIF + Denumire
        self::lbl($pdf,$ml,$y,40,'Cod de identificare fiscală');
        self::lbl($pdf,$ml+42,$y,140,'Denumire/ Prenume si Nume');
        $y += 4;
        self::field($pdf,$ml,$y,40,8,$data['imp_cif']??'');
        self::field($pdf,$ml+42,$y,$iw-42,8,$data['imp_denumire']??'');

        // Adresa imputernicit
        $y += 11;
        self::f($pdf,'B',8); $pdf->SetTextColor(0,0,0);
        $pdf->SetXY($ml,$y); $pdf->Cell($iw,4.5,'Adresa',0,0,'L'); $y += 5;
        self::lbl($pdf,$ml,$y,42,'Județ');
        self::lbl($pdf,$ml+44,$y,28,'Sector');
        self::lbl($pdf,$ml+74,$y,70,'Localitate');
        self::lbl($pdf,$ml+160,$y,30,'Cod Poștal');
        $y += 4;
        self::field($pdf,$ml,$y,42,8,$data['imp_judet']??'');
        self::field($pdf,$ml+44,$y,28,8,'');
        self::field($pdf,$ml+74,$y,84,8,$data['imp_localitate']??'');
        self::field($pdf,$ml+160,$y,$iw-160,8,$data['imp_cod_postal']??'');

        $y += 9;
        self::f($pdf,'I',6.5); $pdf->SetTextColor(80,80,80);
        $pdf->SetXY($ml,$y);
        $pdf->Cell($iw,4,'Pentru a șterge valoarea introdusă în câmpul Județ, apăsați și mențineți apăsată tasta Control (Ctrl) în timp ce selectați o opțiune.',0,0,'L');

        $y += 5;
        self::lbl($pdf,$ml,$y,$iw,'Strada si Număr'); $y += 4;
        self::field($pdf,$ml,$y,$iw,8,$data['imp_strada']??'');

        $y += 10;
        self::lbl($pdf,$ml,$y,$iw,'Informații suplimentare și completări la adresa (bloc, scara, etaj, apartament...)'); $y += 4;
        self::field($pdf,$ml,$y,$iw,8,$data['imp_info']??'');

        // Contact imputernicit
        $y += 11;
        self::f($pdf,'B',8); $pdf->SetTextColor(0,0,0);
        $pdf->SetXY($ml,$y); $pdf->Cell($iw,4.5,'Date de contact',0,0,'L'); $y += 5;
        self::lbl($pdf,$ml,$y,45,'Telefon');
        self::lbl($pdf,$ml+47,$y,40,'Fax');
        self::lbl($pdf,$ml+89,$y,$iw-89,'E-mail');
        $y += 4;
        self::field($pdf,$ml,$y,45,8,$data['imp_telefon']??'');
        self::field($pdf,$ml+47,$y,40,8,$data['imp_fax']??'');
        self::field($pdf,$ml+89,$y,$iw-89,8,$data['imp_email']??'');

        // ── DECLARATIE + SEMNATURA ────────────────────────────
        $y += 12;
        self::f($pdf,'BI',8.5); $pdf->SetTextColor(0,0,0);
        $pdf->SetXY($ml,$y);
        $pdf->MultiCell($iw,5.5,'Sub sancțiunile aplicate faptei de fals in declaratii, declar că datele inscrise în acest formular sunt corecte și complete.',0,'L',false,1);
        $y = $pdf->GetY() + 6;

        // Box semnatura
        $pdf->SetFillColor(252,252,252);
        $pdf->SetDrawColor(120,120,120);
        $pdf->SetLineWidth(0.3);
        $pdf->Rect($ml,$y,$iw,28,'FD');

        self::f($pdf,'B',8.5); $pdf->SetTextColor(0,0,0);
        $pdf->SetXY($ml+2,$y+2); $pdf->Cell($iw-4,5,'Semnătură',0,0,'L');

        $pdf->SetDrawColor(180,180,180); $pdf->SetLineWidth(0.15);
        $pdf->Line($ml+2,$y+7.5,$ml+$iw-2,$y+7.5);
        $pdf->SetLineWidth(0.2); $pdf->SetDrawColor(0,0,0);

        self::f($pdf,'',7.5); $pdf->SetTextColor(50,50,50);
        $pdf->SetXY($ml+2,$y+9); $pdf->Cell(30,4.5,'Semnatura electronica',0,0,'L');
        self::f($pdf,'I',7.5); $pdf->SetTextColor(100,100,100);
        $pdf->SetXY($ml+34,$y+9); $pdf->Cell(120,4.5,'(trebuie să includeți certificat digital calificat)',0,0,'L');

        // Zona goala semnatura
        $pdf->SetFillColor(245,245,245);
        $pdf->SetDrawColor(150,150,150); $pdf->SetLineWidth(0.2);
        $pdf->Rect($ml+2,$y+15,$iw-4,10,'FD');

        $pdf->SetDrawColor(0,0,0); $pdf->SetFillColor(255,255,255);

        // Footer pagina 2
        self::f($pdf,'',7); $pdf->SetTextColor(100,100,100);
        $pdf->SetXY($ml,289); $pdf->Cell($iw,4,'Pagina 2 din 2',0,0,'C');
    }

    // ═══════════════════════════════════════════════════════════
    // HELPERS
    // ═══════════════════════════════════════════════════════════
    private static function field($pdf,$x,$y,$w,$h,$val='',$size=8.5) {
        $pdf->SetFillColor(216,228,248);
        $pdf->SetDrawColor(100,130,180);
        $pdf->SetLineWidth(0.2);
        $pdf->Rect($x,$y,$w,$h,'FD');
        if (trim((string)$val)!='') {
            self::f($pdf,'',$size); $pdf->SetTextColor(0,0,0);
            $pdf->SetXY($x+1,$y+($h-$size*0.35)/2);
            $pdf->Cell($w-2,$size*0.35+1,(string)$val,0,0,'L');
        }
        $pdf->SetDrawColor(0,0,0);
    }

    private static function field_req($pdf,$x,$y,$w,$h,$val='',$size=8.5) {
        $pdf->SetFillColor(255,210,210);
        $pdf->SetDrawColor(180,80,80);
        $pdf->SetLineWidth(0.3);
        $pdf->Rect($x,$y,$w,$h,'FD');
        if (trim((string)$val)!='') {
            self::f($pdf,'',$size); $pdf->SetTextColor(0,0,0);
            $pdf->SetXY($x+1,$y+($h-$size*0.35)/2);
            $pdf->Cell($w-2,$size*0.35+1,(string)$val,0,0,'L');
        }
        $pdf->SetDrawColor(0,0,0);
    }

    private static function lbl($pdf,$x,$y,$w,$text,$size=7,$bold=false) {
        self::f($pdf,$bold?'B':'',$size); $pdf->SetTextColor(50,50,50);
        $pdf->SetXY($x,$y); $pdf->Cell($w,4,$text,0,0,'L');
    }

    private static function chk($pdf,$x,$y,$size=4,$checked=false) {
        $pdf->SetDrawColor(80,80,80); $pdf->SetFillColor(255,255,255);
        $pdf->SetLineWidth(0.3);
        $pdf->Rect($x,$y,$size,$size,'FD');
        if ($checked) {
            self::f($pdf,'B',$size*1.8); $pdf->SetTextColor(0,0,0);
            $pdf->SetXY($x-0.3,$y-0.5);
            $pdf->Cell($size+0.6,$size+1,'X',0,0,'C');
        }
        $pdf->SetDrawColor(0,0,0);
    }

    private static function sep($pdf,$y) {
        $pdf->SetDrawColor(100,100,100); $pdf->SetLineWidth(0.2);
        $pdf->Line(self::ML,$y,self::RW,$y);
        $pdf->SetDrawColor(0,0,0);
    }

    private static function f($pdf,$style='',$size=8) {
        $pdf->SetFont('dejavusans',$style,$size);
    }

    private static function slug($s) {
        $s = iconv('UTF-8','ASCII//TRANSLIT//IGNORE',$s);
        $s = preg_replace('/[^A-Za-z0-9_]/','_',$s);
        return substr(trim($s,'_'),0,40);
    }

    // ═══════════════════════════════════════════════════════════
    // FALLBACK + OVPSPO_TCPDF LOADER
    // ═══════════════════════════════════════════════════════════
    private static function generate_fallback($data,$id) {
        $ff = defined('OVPSPO_PATH') ? OVPSPO_PATH.'includes/class-pdf-fallback.php' : '';
        if ($ff && file_exists($ff)) require_once $ff;
        if (!class_exists('OVPSPO_PDF_Fallback')) return '';
        $rows = array(
            'Contribuabil' => $data['denumire']??'',
            'CIF'          => $data['cif']??'',
            'An'           => $data['an']??'',
            'Suma maximă'  => ($data['suma_max']??0).' lei',
        );
        foreach (($data['beneficiari']??array()) as $i=>$b) {
            $rows['Beneficiar '.($i+1)] = ($b['denumire']??'').' | '.($b['suma']??0).' lei';
        }
        $c = OVPSPO_PDF_Fallback::generate('Formular D177',$rows,'PDF urgenta - instalati OVPSPO_TCPDF.');
        $d = wp_upload_dir(); $dir=$d['basedir'].'/formular177/';
        if (!file_exists($dir)) wp_mkdir_p($dir);
        $p=$dir.'f177_fb_'.intval($id).'_'.gmdate('YmdHis').'.pdf';
        file_put_contents($p,$c); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_file_put_contents
        return file_exists($p)?$p:'';
    }

    private static function load_tcpdf() {
        if ( class_exists( 'OVPSPO_TCPDF' ) ) return true;

        $paths = array(
            // OVPSPO_TCPDF bundled in plugin (prioritate maxima)
            defined('OVPSPO_PATH') ? OVPSPO_PATH . 'lib/tcpdf/tcpdf.php' : '',
            defined('OVPSPO_PATH')    ? OVPSPO_PATH    . 'lib/tcpdf/tcpdf.php' : '',
            defined('OVPSPO_PATH')  ? OVPSPO_PATH  . 'lib/tcpdf/tcpdf.php' : '',
            // Instalat extern ca fallback
            defined('OVPSPO_TCPDF_PATH') ? OVPSPO_TCPDF_PATH : '',
            defined('OVPSPO_TCPDF_PATH')  ? OVPSPO_TCPDF_PATH  : '',
        );

        foreach ( $paths as $path ) {
            if ( $path && file_exists( $path ) ) {
                require_once $path;
                // Creeaza alias daca TCPDF e incarcat ca 'TCPDF' (bundled) in loc de 'OVPSPO_TCPDF'
                if ( class_exists( 'TCPDF' ) && ! class_exists( 'OVPSPO_TCPDF' ) ) {
                    class_alias( 'TCPDF', 'OVPSPO_TCPDF' ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals
                }
                if ( class_exists( 'OVPSPO_TCPDF' ) ) return true;
            }
        }
        return false;
    }
}
