<?php
if ( ! defined( 'ABSPATH' ) ) exit;

if ( ! class_exists('OVPSPO_PDF_Contract') ) {
class OVPSPO_PDF_Contract {

    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('Contract de Sponsorizare Nr. ' . $data['nr_contract']);
        $pdf->SetMargins(20, 20, 20);
        $pdf->SetAutoPageBreak(true, 25);
        $pdf->setPrintHeader(false);
        $pdf->setPrintFooter(false);
        $pdf->AddPage();
        $pdf->SetFont('dejavusans','',10);

        // Culoare brand
        $culoare = OVPSPO_Settings::get('org_culoare','#0F408A');
        list($r,$g,$b) = self::hex2rgb($culoare);

        // Date organizatie (beneficiar)
        $org_nume    = OVPSPO_Settings::get('org_nume','');
        $org_cif     = OVPSPO_Settings::get('org_cif','');
        $org_iban    = OVPSPO_Settings::get('org_iban','');
        $org_banca   = OVPSPO_Settings::get('org_banca','');
        $org_strada  = OVPSPO_Settings::get('org_strada','');
        $org_localit = OVPSPO_Settings::get('org_localitate','');
        $org_judet   = OVPSPO_Settings::get('org_judet','');
        $org_rep     = OVPSPO_Settings::get('org_reprezentant','');
        $org_functie = OVPSPO_Settings::get('org_functie_rep','');
        $org_reg     = OVPSPO_Settings::get('org_reg_asociatii','');
        $org_data_reg= OVPSPO_Settings::get('org_data_inreg','');

        // ── TITLU ──
        $pdf->SetFont('dejavusans','B',16);
        $pdf->SetTextColor($r,$g,$b);
        $pdf->Cell(0,10,'CONTRACT DE SPONSORIZARE',0,1,'C');
        $pdf->SetFont('dejavusans','',11);
        $pdf->SetTextColor(0,0,0);
        $pdf->Cell(0,7,'Nr. ' . $data['nr_contract'] . ' / ' . self::fmt_date($data['data_contract']),0,1,'C');
        $pdf->Ln(6);

        // ── I. PARTILE ──
        self::titlu_sectiune($pdf, 'I. PĂRȚILE CONTRACTANTE', $r,$g,$b);

        // Sponsor
        if ( $data['tip_sponsor'] === 'juridica' ) {
            $sp_text = '1.1. ' . strtoupper($data['sp_denumire']) . ' ' . $data['sp_forma_juridica'] .
                ', cu sediul social în ' . $data['sp_localitate'] . ', str. ' . $data['sp_strada'] .
                ', jud. ' . $data['sp_judet'] .
                ', înregistrată la Oficiul Registrului Comerțului sub nr. ' . $data['sp_reg_com'] .
                ', cod unic de înregistrare ' . $data['sp_cui'] .
                ', reprezentată de ' . $data['sp_reprezentant'] .
                ', având funcția de ' . $data['sp_functie'] . ', în calitate de <strong>SPONSOR</strong>,';
        } else {
            $sp_text = '1.1. ' . strtoupper($data['sp_pf_nume']) . ' ' . strtoupper($data['sp_pf_prenume']) .
                ', domiciliat(ă) în ' . $data['sp_pf_localitate'] . ', ' . $data['sp_pf_strada'] .
                ', jud. ' . $data['sp_pf_judet'] .
                ( !empty($data['sp_pf_cnp']) ? ', CNP ' . $data['sp_pf_cnp'] : '' ) .
                ( !empty($data['sp_pf_ci'])  ? ', CI seria/nr. ' . $data['sp_pf_ci'] : '' ) .
                ', în calitate de <strong>SPONSOR</strong>,';
        }
        $pdf->writeHTML('<p style="text-align:justify">' . $sp_text . '</p>');
        $pdf->Ln(2);
        $pdf->writeHTML('<p style="text-align:center"><strong>și</strong></p>');
        $pdf->Ln(2);

        // Beneficiar (organizatie)
        $bnf_text = '1.2. ' . strtoupper($org_nume) .
            ', cu sediul social în Loc. ' . $org_localit .
            ', str. ' . $org_strada .
            ', jud. ' . $org_judet .
            ( $org_reg     ? ', înregistrată în Registrul entităților/unităților de cult din data de ' . $org_data_reg : '' ) .
            ', codul fiscal nr. ' . $org_cif .
            ', având contul nr. ' . $org_iban .
            ( $org_banca   ? ', deschis la ' . $org_banca : '' ) .
            ( $org_rep     ? ', reprezentată prin ' . $org_rep : '' ) .
            ( $org_functie ? ', cu funcția de ' . $org_functie : '' ) .
            ', în calitate de <strong>BENEFICIAR</strong>,';
        $pdf->writeHTML('<p style="text-align:justify">' . $bnf_text . '</p>');
        $pdf->Ln(3);
        $pdf->writeHTML('<p style="text-align:justify">au convenit să încheie prezentul contract de sponsorizare, cu respectarea următoarelor clauze:</p>');
        $pdf->Ln(4);

        // ── II. OBIECTUL ──
        self::titlu_sectiune($pdf, 'II. OBIECTUL CONTRACTULUI', $r,$g,$b);

        if ( $data['tip_sponsorizare'] === 'baneasca' ) {
            $suma_fmt = number_format(floatval($data['sp_suma']), 2, ',', '.');
            $obj_text = '2.1. Prin prezentul contract Sponsorul acordă Beneficiarului suma de <strong>' .
                $suma_fmt . ' lei</strong> pentru sprijinirea scopului statutar al Beneficiarului' .
                ( !empty($data['sp_scop']) ? ', respectiv: ' . $data['sp_scop'] : '' ) . '.';
            $obj_text2 = '2.2. Plata se va face prin ordin de plată, direct în contul Beneficiarului, <strong>' .
                $org_iban . '</strong>' .
                ( $org_banca ? ', deschis la ' . $org_banca : '' ) . '.';
            $pdf->writeHTML('<p style="text-align:justify">' . $obj_text . '</p>');
            $pdf->Ln(2);
            $pdf->writeHTML('<p style="text-align:justify">' . $obj_text2 . '</p>');
        } elseif ( $data['tip_sponsorizare'] === 'bunuri' ) {
            $obj_text = '2.1. Prin prezentul contract Sponsorul acordă Beneficiarului, cu titlu de sponsorizare, ' .
                'următoarele bunuri: <strong>' . $data['sp_bunuri_desc'] . '</strong>' .
                ( !empty($data['sp_bunuri_valoare']) ? ', evaluate la suma de ' . number_format(floatval($data['sp_bunuri_valoare']),2,',','.') . ' lei' : '' ) .
                ( !empty($data['sp_scop']) ? ', pentru: ' . $data['sp_scop'] : ', pentru sprijinirea scopului statutar al Beneficiarului' ) . '.';
            $pdf->writeHTML('<p style="text-align:justify">' . $obj_text . '</p>');
            $pdf->Ln(2);
            $pdf->writeHTML('<p style="text-align:justify">2.2. Predarea bunurilor se va face direct la sediul Beneficiarului, pe bază de proces-verbal de predare-primire.</p>');
        } else { // servicii
            $obj_text = '2.1. Prin prezentul contract Sponsorul acordă Beneficiarului, cu titlu de sponsorizare, ' .
                'următoarele servicii: <strong>' . $data['sp_servicii_desc'] . '</strong>' .
                ( !empty($data['sp_servicii_valoare']) ? ', evaluate la suma de ' . number_format(floatval($data['sp_servicii_valoare']),2,',','.') . ' lei' : '' ) .
                ( !empty($data['sp_scop']) ? ', pentru: ' . $data['sp_scop'] : ', pentru sprijinirea scopului statutar al Beneficiarului' ) . '.';
            $pdf->writeHTML('<p style="text-align:justify">' . $obj_text . '</p>');
        }
        $pdf->Ln(4);

        // ── III. DURATA ──
        self::titlu_sectiune($pdf, 'III. DURATA CONTRACTULUI', $r,$g,$b);

        if ( $data['tip_sponsorizare'] === 'baneasca' ) {
            $dur = '3.1. Sponsorizarea este unică și va fi transferată în contul Beneficiarului, după semnarea contractului, până la data de <strong>' . self::fmt_date($data['sp_data_limita']) . '</strong>.';
        } elseif ( $data['tip_sponsorizare'] === 'bunuri' ) {
            $dur = '3.1. Predarea bunurilor se va efectua până la data de <strong>' . self::fmt_date($data['sp_bunuri_data']) . '</strong>.';
        } else {
            $dur = '3.1. Prestarea serviciilor se va realiza până la data de <strong>' . self::fmt_date($data['sp_servicii_data']) . '</strong>.';
        }
        $pdf->writeHTML('<p style="text-align:justify">' . $dur . '</p>');
        $pdf->Ln(2);
        $pdf->writeHTML('<p style="text-align:justify">3.2. La încheierea duratei contractului, părțile pot conveni, prin act adițional, prelungirea acesteia.</p>');
        $pdf->Ln(4);

        // ── IV. OBLIGATII ──
        self::titlu_sectiune($pdf, 'IV. OBLIGAȚIILE PĂRȚILOR', $r,$g,$b);
        $pdf->SetFont('dejavusans','B',10);
        $pdf->Cell(0,6,'4.1. Obligațiile Beneficiarului',0,1);
        $pdf->SetFont('dejavusans','',10);
        $obligatii_bnf = array(
            '4.1.1. Beneficiarul se obligă să folosească suma/bunurile/serviciile acordate de Sponsor în scopul pentru care au fost destinate.',
            '4.1.2. Beneficiarul se obligă să informeze, la solicitarea Sponsorului, despre modul în care au fost utilizate fondurile/bunurile/serviciile primite.',
            '4.1.3. Beneficiarul poate aduce la cunoștința publicului sponsorizarea prin promovarea numelui, a siglei sau a imaginii Sponsorului.',
            '4.1.4. În cazul în care Beneficiarul va aduce la cunoștința publicului sponsorizarea, aceasta se va face într-un mod care să nu lezeze prestigiul Sponsorului, activitatea acestuia, bunele moravuri sau ordinea și liniștea publică.',
        );
        foreach ($obligatii_bnf as $ob) {
            $pdf->writeHTML('<p style="text-align:justify">' . $ob . '</p>');
            $pdf->Ln(1);
        }
        $pdf->Ln(2);
        $pdf->SetFont('dejavusans','B',10);
        $pdf->Cell(0,6,'4.2. Obligațiile Sponsorului',0,1);
        $pdf->SetFont('dejavusans','',10);
        $obligatii_sp = array(
            '4.2.1. Sponsorul se obligă să vireze/predea/presteze cele menționate la art. 2.1. în condițiile stabilite.',
            '4.2.2. Sponsorul poate aduce la cunoștința publicului sponsorizarea prin modalitățile pe care le consideră adecvate.',
            '4.2.3. Sponsorul se obligă să nu urmărească, direct sau indirect, direcționarea activității beneficiarului.',
            '4.2.4. Sponsorul sau beneficiarul nu vor putea efectua reclamă sau publicitate comercială în favoarea lor sau a altor persoane.',
        );
        foreach ($obligatii_sp as $ob) {
            $pdf->writeHTML('<p style="text-align:justify">' . $ob . '</p>');
            $pdf->Ln(1);
        }
        $pdf->Ln(4);

        // ── V. GDPR ──
        self::titlu_sectiune($pdf, 'V. PROTECȚIA DATELOR CU CARACTER PERSONAL', $r,$g,$b);
        $gdpr_clauses = array(
            '5.1. Părțile au cunoștință de dispozițiile Regulamentului GDPR și se obligă să le respecte întocmai.',
            '5.2. Orice prelucrare a datelor cu caracter personal furnizate și utilizate pentru executarea Contractului se va face doar în condițiile stipulate de Regulamentul GDPR al Uniunii Europene.',
            '5.3. Fiecare parte are calitatea de operator de date cu caracter personal.',
            '5.4. Beneficiarul se obligă să prelucreze datele personale ale reprezentanților Sponsorului doar în scopul stabilirii, derulării și monitorizării relațiilor contractuale.',
            '5.5. La solicitarea în scris a Sponsorului sau la încetarea relației contractuale, Beneficiarul se obligă să șteargă sau să anonimizeze datele personale, cu excepția cazurilor prevăzute de lege.',
        );
        foreach ($gdpr_clauses as $cl) {
            $pdf->writeHTML('<p style="text-align:justify">' . $cl . '</p>');
            $pdf->Ln(1);
        }
        $pdf->Ln(4);

        // ── VI. INCETARE ──
        self::titlu_sectiune($pdf, 'VI. ÎNCETAREA CONTRACTULUI', $r,$g,$b);
        $pdf->writeHTML('<p style="text-align:justify">6.1. Prezentul contract încetează de plin drept în cazul în care una dintre părți își încalcă obligațiile asumate, este declarată în incapacitate de plăți sau cesionează drepturile și obligațiile fără acordul celeilalte părți.</p>');
        $pdf->Ln(2);
        $pdf->writeHTML('<p style="text-align:justify">6.2. Prevederile pct. 6.1. nu vor avea niciun efect asupra obligațiilor deja scadente între părțile contractante.</p>');
        $pdf->Ln(4);

        // ── VII. FORTA MAJORA ──
        self::titlu_sectiune($pdf, 'VII. FORȚA MAJORĂ', $r,$g,$b);
        $pdf->writeHTML('<p style="text-align:justify">7.1. Forța majoră exonerează părțile de răspundere în cazul executării necorespunzătoare sau cu întârziere a obligațiilor asumate.</p>');
        $pdf->Ln(2);
        $pdf->writeHTML('<p style="text-align:justify">7.2. Prin forța majoră se înțelege un eveniment independent de voința părților, imprevizibil și insurmontabil, apărut după încheierea contractului.</p>');
        $pdf->Ln(2);
        $pdf->writeHTML('<p style="text-align:justify">7.3. Partea care invocă forța majoră este obligată să notifice cealaltă parte în cel mai scurt timp posibil și să ia toate măsurile pentru limitarea consecințelor.</p>');
        $pdf->Ln(4);

        // ── VIII-X. CLAUZE FINALE ──
        self::titlu_sectiune($pdf, 'VIII. NOTIFICĂRILE ÎNTRE PĂRȚI', $r,$g,$b);
        $pdf->writeHTML('<p style="text-align:justify">8.1. Orice notificare adresată de una dintre părți celeilalte este valabil îndeplinită dacă va fi transmisă la sediul prevăzut în partea introductivă a prezentului contract sau pe email.</p>');
        $pdf->Ln(4);

        self::titlu_sectiune($pdf, 'IX. SOLUȚIONAREA LITIGIILOR', $r,$g,$b);
        $pdf->writeHTML('<p style="text-align:justify">9.1. Toate neînțelegerile vor fi rezolvate pe cale amiabilă. În caz contrar, părțile se vor adresa instanțelor judecătorești competente.</p>');
        $pdf->Ln(4);

        self::titlu_sectiune($pdf, 'X. CLAUZE FINALE', $r,$g,$b);
        $pdf->writeHTML('<p style="text-align:justify">10.1. Modificarea prezentului contract se face numai prin act adițional încheiat între părțile contractante.</p>');
        $pdf->Ln(2);
        $pdf->writeHTML('<p style="text-align:justify">10.2. Prezentul contract s-a încheiat în 2 (două) exemplare, câte unul pentru fiecare parte, azi <strong>' . self::fmt_date($data['data_contract']) . '</strong>, data semnării lui.</p>');
        $pdf->Ln(10);

        // ── SEMNATURI ──
        $pdf->SetFont('dejavusans','B',10);
        $pdf->SetTextColor($r,$g,$b);
        $pdf->Cell(90,7,'SPONSOR,',0,0,'C');
        $pdf->Cell(90,7,'BENEFICIAR,',0,1,'C');
        $pdf->SetTextColor(0,0,0);
        $pdf->SetFont('dejavusans','',9);

        if ( $data['tip_sponsor'] === 'juridica' ) {
            $sp_name = strtoupper($data['sp_denumire']) . ' ' . $data['sp_forma_juridica'];
            $sp_rep  = $data['sp_reprezentant'];
            $sp_func = $data['sp_functie'];
        } else {
            $sp_name = strtoupper($data['sp_pf_nume']) . ' ' . strtoupper($data['sp_pf_prenume']);
            $sp_rep  = '';
            $sp_func = '';
        }

        $pdf->Cell(90,5,$sp_name,0,0,'C');
        $pdf->Cell(90,5,strtoupper($org_nume),0,1,'C');
        if ($sp_rep) {
            $pdf->Cell(90,5,$sp_rep,0,0,'C');
            $pdf->Cell(90,5,$org_rep ?: '',0,1,'C');
        }
        if ($sp_func) {
            $pdf->Cell(90,5,$sp_func,0,0,'C');
            $pdf->Cell(90,5,$org_functie ?: '',0,1,'C');
        }

        // Spatiu semnatura
        $pdf->Ln(15);
        $pdf->SetDrawColor(100,100,100);
        $pdf->Line(22, $pdf->GetY(), 100, $pdf->GetY());
        $pdf->SetX(112);
        $pdf->Line(112, $pdf->GetY(), 190, $pdf->GetY());
        $pdf->Ln(5);
        $pdf->SetFont('dejavusans','I',8);
        $pdf->SetTextColor(100,100,100);
        $pdf->Cell(90,4,'(semnătura și ștampila)',0,0,'C');
        $pdf->Cell(90,4,'(semnătura și ștampila)',0,1,'C');

        // Footer
        $pdf->Ln(6);
        $pdf->SetFont('dejavusans','I',7);
        $pdf->SetTextColor(150,150,150);
        $pdf->Cell(0,4,'Document generat electronic — necesită semnătură olografă pentru valabilitate juridică',0,1,'C');

        // Salveaza
        $upload_dir = wp_upload_dir();
        $dir = $upload_dir['basedir'] . '/contracte-sponsorizare/';
        if (!file_exists($dir)) wp_mkdir_p($dir);

        $slug = preg_replace('/[^A-Za-z0-9_]/', '_', $data['tip_sponsor'] === 'juridica' ? $data['sp_denumire'] : ($data['sp_pf_nume'].'_'.$data['sp_pf_prenume']));
        $filename = 'Contract_Sponsorizare_' . $data['nr_contract'] . '_' . substr($slug,0,30) . '_' . $id . '.pdf';
        $filepath = $dir . $filename;
        $pdf->Output($filepath, 'F');
        return file_exists($filepath) ? $filepath : '';
    }

    private static function titlu_sectiune($pdf, $text, $r, $g, $b) {
        $pdf->SetFont('dejavusans','B',10);
        $pdf->SetTextColor($r,$g,$b);
        $pdf->Cell(0,7,$text,0,1);
        $pdf->SetFont('dejavusans','',10);
        $pdf->SetTextColor(0,0,0);
        $pdf->Ln(1);
    }

    private static function fmt_date($date) {
        if (!$date) return '_______________';
        if (preg_match('/^(\d{4})-(\d{2})-(\d{2})$/', $date, $m))
            return $m[3].'.'.$m[2].'.'.$m[1];
        return $date;
    }

    private static function hex2rgb($hex) {
        $hex = ltrim($hex,'#');
        if (strlen($hex)==3) $hex = $hex[0].$hex[0].$hex[1].$hex[1].$hex[2].$hex[2];
        return array(hexdec(substr($hex,0,2)), hexdec(substr($hex,2,2)), hexdec(substr($hex,4,2)));
    }

    private static function generate_fallback( $data, $id ) {
        $fallback_file = defined('OVPSPO_PATH') ? OVPSPO_PATH . 'includes/class-pdf-fallback.php' : '';
        if ( $fallback_file && file_exists($fallback_file) ) require_once $fallback_file;
        if ( ! class_exists('OVPSPO_PDF_Fallback') ) return '';

        $tip = $data['tip_sponsorizare'] ?? 'baneasca';
        $tip_label = array('baneasca'=>'Bănesc','bunuri'=>'Bunuri','servicii'=>'Servicii');
        $rows = array(
            'Sponsor'      => ($data['sponsor_nume'] ?? ''),
            'CIF/CNP'      => ($data['sponsor_cif'] ?? ''),
            'Beneficiar'   => OVPSPO_Settings::get('org_nume',''),
            'Tip'          => $tip_label[$tip] ?? $tip,
            'Sumă/Valoare' => ($data['suma'] ?? '') . ' RON',
            'Data'         => gmdate('d.m.Y'),
        );
        $pdf_content = OVPSPO_PDF_Fallback::generate('Contract de Sponsorizare', $rows,
            'PDF generat în modul urgență. Instalați OVPSPO_TCPDF pentru contractul complet.');
        $upload_dir = wp_upload_dir();
        $dir = $upload_dir['basedir'] . '/contracte/';
        if ( ! file_exists($dir) ) wp_mkdir_p($dir);
        $path = $dir . 'contract_fallback_' . intval($id) . '_' . gmdate('YmdHis') . '.pdf';
        file_put_contents($path, $pdf_content); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_file_put_contents
        return file_exists($path) ? $path : '';
    }

    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;
    }

    /**
     * Verifica daca OVPSPO_TCPDF e disponibil, altfel intoarce false
     * pentru a folosi fallback-ul
     */
    private static function has_tcpdf() {
        return self::load_tcpdf();
    }
}
} // end class_exists
