<?php
/**
 * OVP-Sponsorizare
 *
 * @package   OVPSPO_Sponsorizare
 * @author    Ovidiu Pantiru - OVP-Digital
 * @copyright 2024 Ovidiu Pantiru
 * @license   GPL-2.0+
 * @link      https://ovidiupantiru.ro
 */

if ( ! defined( 'ABSPATH' ) ) exit;

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

    public static function init() {
        add_action('wp_ajax_ovpspo_contract_submit',        array(__CLASS__,'handle'));
        add_action('wp_ajax_nopriv_ovpspo_contract_submit', array(__CLASS__,'handle'));
    }

    public static function handle() {
        // Rate limiting simplu - previne spam
        if ( ! check_ajax_referer('ovpspo_contract_submit','ovpspo_contract_nonce',false) ) {
            wp_send_json_error(array('message'=>'Cerere invalidă. Reîncarcă pagina.'));
        }

        $p = wp_unslash( $_POST ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
        $tip_sponsor      = sanitize_text_field($p['tip_sponsor'] ?? 'juridica');
        $tip_sponsorizare = sanitize_text_field($p['tip_sponsorizare'] ?? 'baneasca');

        $data = array(
            'tip_sponsor'       => $tip_sponsor,
            'tip_sponsorizare'  => $tip_sponsorizare,
            'nr_contract'       => sanitize_text_field($p['nr_contract'] ?? ''),
            'data_contract'     => sanitize_text_field($p['data_contract'] ?? ''),
            'sp_scop'           => sanitize_textarea_field($p['sp_scop'] ?? ''),
            'gdpr'              => !empty($p['gdpr']) ? 1 : 0,
            // Juridica
            'sp_denumire'       => sanitize_text_field($p['sp_denumire'] ?? ''),
            'sp_forma_juridica' => sanitize_text_field($p['sp_forma_juridica'] ?? 'SRL'),
            'sp_localitate'     => sanitize_text_field($p['sp_localitate'] ?? ''),
            'sp_strada'         => sanitize_text_field($p['sp_strada'] ?? ''),
            'sp_judet'          => sanitize_text_field($p['sp_judet'] ?? ''),
            'sp_reg_com'        => sanitize_text_field($p['sp_reg_com'] ?? ''),
            'sp_cui'            => sanitize_text_field($p['sp_cui'] ?? ''),
            'sp_reprezentant'   => sanitize_text_field($p['sp_reprezentant'] ?? ''),
            'sp_functie'        => sanitize_text_field($p['sp_functie'] ?? ''),
            'sp_email'          => sanitize_email($p['sp_email'] ?? ''),
            // Fizica
            'sp_pf_nume'        => sanitize_text_field($p['sp_pf_nume'] ?? ''),
            'sp_pf_prenume'     => sanitize_text_field($p['sp_pf_prenume'] ?? ''),
            'sp_pf_cnp'         => sanitize_text_field($p['sp_pf_cnp'] ?? ''),
            'sp_pf_localitate'  => sanitize_text_field($p['sp_pf_localitate'] ?? ''),
            'sp_pf_strada'      => sanitize_text_field($p['sp_pf_strada'] ?? ''),
            'sp_pf_judet'       => sanitize_text_field($p['sp_pf_judet'] ?? ''),
            'sp_pf_ci'          => sanitize_text_field($p['sp_pf_ci'] ?? ''),
            'sp_pf_email'       => sanitize_email($p['sp_pf_email'] ?? ''),
            // Baneasca
            'sp_suma'           => floatval($p['sp_suma'] ?? 0),
            'sp_data_limita'    => sanitize_text_field($p['sp_data_limita'] ?? ''),
            // Bunuri
            'sp_bunuri_desc'    => sanitize_textarea_field($p['sp_bunuri_desc'] ?? ''),
            'sp_bunuri_valoare' => floatval($p['sp_bunuri_valoare'] ?? 0),
            'sp_bunuri_data'    => sanitize_text_field($p['sp_bunuri_data'] ?? ''),
            // Servicii
            'sp_servicii_desc'  => sanitize_textarea_field($p['sp_servicii_desc'] ?? ''),
            'sp_servicii_valoare'=> floatval($p['sp_servicii_valoare'] ?? 0),
            'sp_servicii_data'  => sanitize_text_field($p['sp_servicii_data'] ?? ''),
        );

        // Email sponsor
        $sp_email = $tip_sponsor === 'juridica' ? $data['sp_email'] : $data['sp_pf_email'];

        // ── Validare ──
        $errors = array();
        if ( empty($data['nr_contract']) )  $errors[] = 'Numărul contractului este obligatoriu.';
        if ( empty($data['data_contract'])) $errors[] = 'Data contractului este obligatorie.';

        if ( $tip_sponsor === 'juridica' ) {
            if ( empty($data['sp_denumire']) )    $errors[] = 'Denumirea firmei este obligatorie.';
            if ( empty($data['sp_cui']) )         $errors[] = 'CUI-ul este obligatoriu.';
            if ( empty($data['sp_reg_com']) )     $errors[] = 'Nr. Registrul Comerțului este obligatoriu.';
            if ( empty($data['sp_reprezentant'])) $errors[] = 'Reprezentantul legal este obligatoriu.';
            if ( empty($data['sp_email']) || !is_email($data['sp_email']) ) $errors[] = 'Email-ul sponsorului este obligatoriu și trebuie să fie valid.';
        } else {
            if ( empty($data['sp_pf_nume']) )    $errors[] = 'Numele este obligatoriu.';
            if ( empty($data['sp_pf_prenume']) ) $errors[] = 'Prenumele este obligatoriu.';
            if ( empty($data['sp_pf_email']) || !is_email($data['sp_pf_email']) ) $errors[] = 'Email-ul sponsorului este obligatoriu și trebuie să fie valid.';
        }

        if ( $tip_sponsorizare === 'baneasca' ) {
            if ( $data['sp_suma'] <= 0 )         $errors[] = 'Suma sponsorizată trebuie să fie pozitivă.';
            if ( empty($data['sp_data_limita'])) $errors[] = 'Data limită virament este obligatorie.';
        } elseif ( $tip_sponsorizare === 'bunuri' ) {
            if ( empty($data['sp_bunuri_desc'])) $errors[] = 'Descrierea bunurilor este obligatorie.';
            if ( empty($data['sp_bunuri_data'])) $errors[] = 'Data predare bunuri este obligatorie.';
        } else {
            if ( empty($data['sp_servicii_desc'])) $errors[] = 'Descrierea serviciilor este obligatorie.';
            if ( empty($data['sp_servicii_data'])) $errors[] = 'Termenul prestare servicii este obligatoriu.';
        }

        if ( !$data['gdpr'] ) $errors[] = 'Acordul GDPR este obligatoriu.';

        if ( !empty($errors) ) {
            wp_send_json_error(array('message' => implode('<br>',$errors)));
        }

        // ── Salveaza in DB ──
        global $wpdb;
        $table = $wpdb->prefix . 'contracte_sponsorizare';

        // Creeaza tabela daca nu exista
        if ( $wpdb->get_var( $wpdb->prepare( "SHOW TABLES LIKE %s", $table ) ) !== $table ) { // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
            require_once ABSPATH . 'wp-admin/includes/upgrade.php';
            $charset = $wpdb->get_charset_collate();
            dbDelta( "CREATE TABLE IF NOT EXISTS $table (
                id               BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
                data_trimitere   DATETIME NOT NULL,
                nr_contract      VARCHAR(50),
                data_contract    DATE,
                tip_sponsor      VARCHAR(20),
                sponsor_nume     VARCHAR(200),
                sponsor_cui      VARCHAR(20),
                sponsor_email    VARCHAR(200),
                tip_sponsorizare VARCHAR(20),
                suma             DECIMAL(12,2) DEFAULT 0,
                pdf_path         VARCHAR(255),
                ip               VARCHAR(45),
                PRIMARY KEY (id)
            ) $charset;" );
        }

        if ( $wpdb->get_var( $wpdb->prepare( "SHOW TABLES LIKE %s", $table ) ) === $table ) { // phpcs:ignore WordPress.DB.DirectDatabaseQuery
            $sp_name = $tip_sponsor === 'juridica'
                ? $data['sp_denumire'] . ' ' . $data['sp_forma_juridica']
                : $data['sp_pf_nume'] . ' ' . $data['sp_pf_prenume'];
            $wpdb->insert( $table, array( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery
                'data_trimitere'   => current_time('mysql'),
                'nr_contract'      => $data['nr_contract'],
                'data_contract'    => $data['data_contract'],
                'tip_sponsor'      => $tip_sponsor,
                'sponsor_nume'     => $sp_name,
                'sponsor_cui'      => $tip_sponsor === 'juridica' ? $data['sp_cui'] : $data['sp_pf_cnp'],
                'sponsor_email'    => $sp_email,
                'tip_sponsorizare' => $tip_sponsorizare,
                'suma'             => $tip_sponsorizare === 'baneasca' ? $data['sp_suma'] : ($tip_sponsorizare === 'bunuri' ? $data['sp_bunuri_valoare'] : $data['sp_servicii_valoare']),
                'ip'               => isset( $_SERVER['REMOTE_ADDR'] ) ? sanitize_text_field( wp_unslash( $_SERVER['REMOTE_ADDR'] ) ) : '',
            ));
            $id = $wpdb->insert_id;
        } else {
            $id = time();
        }

        // ── Genereaza PDF ──
        $pdf_path = '';
        try {
            $pdf_path = OVPSPO_PDF_Contract::generate($data, $id);
            if ( $pdf_path && $wpdb->get_var( $wpdb->prepare( "SHOW TABLES LIKE %s", $table ) ) === $table ) { // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
                $wpdb->update($table, array('pdf_path'=>$pdf_path), array('id'=>$id));
            }
        } catch (Exception $e) {
        }

        $attachments = ($pdf_path && file_exists($pdf_path)) ? array($pdf_path) : array();

        // ── Email catre SPONSOR (principal - pentru semnare) ──
        OVPSPO_Email_Contract::send_sponsor($data, $sp_email, $attachments);

        // ── Email catre ADMIN/BENEFICIAR (notificare) ──
        OVPSPO_Email_Contract::send_admin($data, $attachments);

        wp_send_json_success(array(
            'message' => '✅ Contractul de sponsorizare a fost generat!<br><br>' .
                '📧 L-am trimis pe email-ul tău pentru <strong>semnare manuală</strong>.<br>' .
                'După ce îl semnezi, trimite-l și beneficiarului <strong>' . esc_html(OVPSPO_Settings::get('org_nume','')) . '</strong> pentru contrasemnare.',
        ));
    }
}
} // end class_exists
