<?php
namespace LivraisonAPI;

class Webhook {
    public function __construct() {
        add_action('rest_api_init', [$this, 'register_webhook_routes']);
    }

    public function register_webhook_routes() {
        register_rest_route('sendi-api/v1', '/webhook', [
            'methods' => 'POST',
            'callback' => [$this, 'handle_webhook'],
            'permission_callback' => '__return_true'
        ]);
    }

    public function handle_webhook($request) {
        $data = $request->get_json_params();
        
        if (empty($data)) {
            return new \WP_REST_Response([
                'success' => false,
                'error' => 'Données manquantes'
            ], 400);
        }

        // Vérifier la signature du webhook
        $signature = $request->get_header('x-webhook-signature');
        if (empty($signature)) {
            return new \WP_REST_Response([
                'success' => false,
                'error' => 'Signature manquante'
            ], 401);
        }

        // Vérifier la validité du webhook
        $secret = get_option('livraison_api_webhook_secret', '');
        if (empty($secret)) {
            return new \WP_REST_Response([
                'success' => false,
                'error' => 'Webhook non configuré'
            ], 500);
        }

        // Vérifier la signature
        $expected_signature = hash_hmac('sha256', json_encode($data), $secret);
        if ($signature !== $expected_signature) {
            return new \WP_REST_Response([
                'success' => false,
                'error' => 'Signature invalide'
            ], 401);
        }

        // Traiter l'événement
        $event = $data['event'] ?? '';
        $payload = $data['data'] ?? [];

        switch ($event) {
            case 'order.created':
                $this->handle_order_created($payload);
                break;
            case 'order.updated':
                $this->handle_order_updated($payload);
                break;
            case 'order.delivered':
                $this->handle_order_delivered($payload);
                break;
            default:
                break;
        }

        return new \WP_REST_Response([
            'success' => true,
            'message' => 'Webhook traité avec succès'
        ], 200);
    }

    private function handle_order_created($payload) {
        $order_id = intval( $payload['order_id'] ?? 0 );
        $course_id = sanitize_text_field( $payload['course_id'] ?? '' );
        $code_secret = sanitize_text_field( $payload['code_secret'] ?? '' );

        if ( $order_id > 0 && ! empty( $course_id ) && ! empty( $code_secret ) ) {
            global $wpdb;
            $table_name = $wpdb->prefix . 'livraison_api_logs';

            // ✅ CORRECTION: mise en cache de la vérification d'existence (course_id)
            // pour éviter un accès direct à la base à chaque appel du webhook,
            // notamment en cas de renvois/doublons de la part du fournisseur.
            $exists_cache_key = 'livraison_order_exists_' . md5( $course_id );
            $exists = wp_cache_get( $exists_cache_key, 'livraison_api' );

            if ( false === $exists ) {
                // ✅ CORRECTION: Utiliser $wpdb->prefix directement dans la requête
                // La table est une constante, pas une donnée utilisateur
                // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared,WordPress.DB.DirectDatabaseQuery.DirectQuery
                $exists = $wpdb->get_var(
                    $wpdb->prepare(
                        "SELECT id FROM {$wpdb->prefix}livraison_api_logs WHERE course_id = %s",
                        $course_id
                    )
                );

                // On met en cache y compris l'absence de résultat (null), sinon
                // wp_cache_get() considérerait que le cache est vide à chaque fois.
                wp_cache_set( $exists_cache_key, $exists ?? '', 'livraison_api', 300 );
            }

            if ( ! $exists ) {
                // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery
                $wpdb->insert(
                    $table_name,
                    [
                        'order_id' => $order_id,
                        'course_id' => $course_id,
                        'code_secret' => $code_secret,
                        'status' => 'created'
                    ],
                    [ '%d', '%s', '%s', '%s' ]
                );

                // ✅ CORRECTION: Supprimer le cache après insertion
                wp_cache_delete( 'livraison_dashboard_stats', 'livraison_api' );
                wp_cache_delete( 'livraison_recent_logs', 'livraison_api' );
                wp_cache_delete( 'livraison_ajax_stats', 'livraison_api' );
                wp_cache_delete( $exists_cache_key, 'livraison_api' );
            }

            // Ajouter une note à la commande
            if (function_exists('wc_get_order')) {
                $order = wc_get_order($order_id);
                if ($order) {
                    $order->add_order_note(
                        sprintf('Commande de livraison créée. Course ID: %s, Code secret: %s', 
                            $course_id, $code_secret
                        )
                    );
                }
            }
        }
    }

    private function handle_order_updated($payload) {
        $order_id = $payload['order_id'] ?? 0;
        $status = $payload['status'] ?? '';

        if ($order_id && function_exists('wc_get_order')) {
            $order = wc_get_order($order_id);
            if ($order) {
                $status_labels = [
                    'pending' => 'En attente',
                    'assigned' => 'Assignée',
                    'in_progress' => 'En cours',
                    'delivered' => 'Livrée',
                    'failed' => 'Échouée',
                    'cancelled' => 'Annulée'
                ];
                $label = $status_labels[$status] ?? $status;
                $order->add_order_note(
                    sprintf('Statut de livraison mis à jour: %s', $label)
                );
            }
        }
    }

    private function handle_order_delivered($payload) {
        $order_id = $payload['order_id'] ?? 0;

        if ($order_id && function_exists('wc_get_order')) {
            $order = wc_get_order($order_id);
            if ($order) {
                $order->add_order_note('Commande livrée avec succès !');
                
                // Mettre à jour le statut de la commande si configuré
                $auto_complete = get_option('livraison_api_auto_complete', 'no');
                if ($auto_complete === 'yes' && $order->get_status() !== 'completed') {
                    $order->update_status('completed', 'Livraison confirmée par l\'API');
                }
            }
        }
    }
}