<?php
// Fichier : src/Admin/Actions/PaymentsActions.php
// Version 1.2 - Amélioration de la sécurité et de la flexibilité

namespace ComptaFlowPro\Admin\Actions;

use ComptaFlowPro\Services\JournalEntryGenerator;

defined('ABSPATH') || exit;

class PaymentsActions
{
    /**
     * Enregistre l'écouteur pour l'action de paiement.
     */
    public static function boot(): void
    {
        add_action('admin_post_comptaflow_mark_as_paid', [self::class, 'handleMarkAsPaid']);
    }

    /**
     * Gère la soumission du formulaire "Marquer comme payé".
     */
    public static function handleMarkAsPaid(): void
    {
        // 1. Sécurité et validation des permissions
        // NOTE: Si d'autres rôles que les admins doivent utiliser cette fonction,
        // il faudra remplacer 'manage_options' par une capacité plus appropriée.
        if (!current_user_can('manage_options')) {
            wp_die('Permissions insuffisantes.');
        }

        // AMÉLIORATION : Utilisation de la fonction standard de WordPress pour la sécurité
        check_admin_referer('comptaflow_mark_paid_nonce');

        // 2. Récupération et nettoyage des données (via $_REQUEST pour plus de flexibilité)
        $tx_id        = isset($_REQUEST['tx_id']) ? intval($_REQUEST['tx_id']) : 0;
        $payment_date = !empty($_REQUEST['payment_date']) ? sanitize_text_field(wp_unslash($_REQUEST['payment_date'])) : current_time('Y-m-d');
        $method       = !empty($_REQUEST['payment_method']) ? sanitize_text_field(wp_unslash($_REQUEST['payment_method'])) : 'VIREMENT';
        $redirect_to  = !empty($_REQUEST['redirect_to']) ? esc_url_raw(wp_unslash($_REQUEST['redirect_to'])) : admin_url();

        if ($tx_id === 0) {
            wp_die('ID de transaction manquant.');
        }

        global $wpdb;
        $hub_table     = $wpdb->prefix . 'cfp_transactions';
        $journal_table = $wpdb->prefix . 'cfp_journal_entries';
        
        $transaction = $wpdb->get_row($wpdb->prepare("SELECT * FROM $hub_table WHERE id = %d", $tx_id));
        if (!$transaction || $transaction->payment_status === 'PAID') {
            wp_safe_redirect(add_query_arg('status', 'already_paid', $redirect_to));
            exit;
        }

        $wpdb->query('START TRANSACTION');
        $ok = true;

        // 4. Générer les écritures de règlement dans le journal
        try {
            $amount = (float) $transaction->amount_ttc;
            $is_sale = $transaction->type === 'SALE';
            $tiers_account = $is_sale ? '411' : '401';
            $libelle = $is_sale ? 'Encaissement client' : 'Règlement fournisseur';

            $base_entry = [
                'uuid' => wp_generate_uuid4(),
                'date_ecriture' => $payment_date,
                'journal_code' => 'BQ',
                'libelle' => sprintf('%s | %s | %s', $libelle, date_i18n('d/m/Y', strtotime($payment_date)), $transaction->partner_name),
                'piece_ref' => 'PAY-' . $transaction->id,
                'created_by' => get_current_user_id(),
                'source' => 'MANUAL_PAYMENT',
                'transaction_id' => $tx_id,
            ];

            $res1 = $wpdb->insert($journal_table, array_merge($base_entry, [
                'compte_num' => $tiers_account,
                'debit' => $is_sale ? 0 : $amount,
                'credit' => $is_sale ? $amount : 0,
            ]));
            if($res1 === false) $ok = false;
            
            $res2 = $wpdb->insert($journal_table, array_merge($base_entry, [
                'uuid' => wp_generate_uuid4(),
                'compte_num' => '512',
                'debit' => $is_sale ? $amount : 0,
                'credit' => $is_sale ? 0 : $amount,
            ]));
            if($res2 === false) $ok = false;

        } catch (\Exception $e) {
            $ok = false;
        }

        // 5. Mettre à jour la transaction dans le Hub
        if ($ok) {
            $res3 = $wpdb->update(
                $hub_table,
                [
                    'payment_status' => 'PAID',
                    'payment_date'   => $payment_date,
                    'payment_method' => $method,
                ],
                ['id' => $tx_id]
            );
            if ($res3 === false) $ok = false;
        }

        // 6. Finaliser la transaction
        if ($ok) {
            $wpdb->query('COMMIT');
            wp_safe_redirect(add_query_arg('payment_status', 'success', $redirect_to));
        } else {
            $wpdb->query('ROLLBACK');
            wp_safe_redirect(add_query_arg('payment_status', 'error', $redirect_to));
        }
        exit;
    }
}