<?php
declare(strict_types=1);
/**
 * Plugin Name: ESI_peppol
 * Description: Woocommerce peppol gateway
 * Version: 0.1.0
 * Author: Esi informatique
 * Text Domain: esi_peppol
 * RequiresPHP: 7.0
 * RequiresPlugins: woocommerce/woocommerce.php
 */

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

// Vérification de la version minimale de PHP requise
if (version_compare(PHP_VERSION, '7.0.0', '<')) {
    // Afficher un message d'erreur dans l'admin
    add_action('admin_notices', function () {
        if (!function_exists('esc_html__') || !function_exists('esc_html')) {
            // Fallback si les fonctions WordPress ne sont pas encore chargées
            echo '<div class="notice notice-error"><p><strong>ESI Peppol</strong> : Ce plugin nécessite PHP 7.0.0 ou supérieur. Vous utilisez actuellement PHP ' . htmlspecialchars(PHP_VERSION, ENT_QUOTES, 'UTF-8') . '. Veuillez mettre à jour votre version de PHP.</p></div>';
            return;
        }
        ?>
        <div class="notice notice-error">
            <p>
                <strong><?php esc_html_e('ESI Peppol', 'esi_peppol'); ?></strong> : 
                <?php
                printf(
                    /* translators: 1: Version PHP actuelle, 2: Version PHP minimale requise */
                    esc_html__('Ce plugin nécessite PHP %2$s ou supérieur. Vous utilisez actuellement PHP %1$s. Veuillez mettre à jour votre version de PHP.', 'esi_peppol'),
                    esc_html(PHP_VERSION),
                    '7.0.0'
                );
                ?>
            </p>
        </div>
        <?php
    });
    
    // Désactiver le plugin si la version PHP est trop ancienne
    add_action('admin_init', function () {
        if (function_exists('deactivate_plugins') && function_exists('plugin_basename')) {
            deactivate_plugins(plugin_basename(__FILE__));
        }
    });
    
    return;
}

// Fonction pour vérifier si WooCommerce est actif
function esi_peppol_is_woocommerce_active(): bool {
    // Vérifier si la classe WooCommerce existe (WooCommerce chargé)
    if (class_exists('WooCommerce')) {
        return true;
    }
    
    // Vérifier si WooCommerce est dans la liste des plugins actifs
    if (!function_exists('is_plugin_active')) {
        if (file_exists(ABSPATH . 'wp-admin/includes/plugin.php')) {
            require_once ABSPATH . 'wp-admin/includes/plugin.php';
        }
    }
    
    if (function_exists('is_plugin_active')) {
        return is_plugin_active('woocommerce/woocommerce.php');
    }
    
    // Fallback : vérifier dans la liste des plugins actifs
    $active_plugins = get_option('active_plugins', []);
    if (in_array('woocommerce/woocommerce.php', $active_plugins, true)) {
        return true;
    }
    
    // Vérifier aussi dans les plugins réseau (multisite)
    if (is_multisite()) {
        $network_plugins = get_site_option('active_sitewide_plugins', []);
        if (isset($network_plugins['woocommerce/woocommerce.php'])) {
            return true;
        }
    }
    
    return false;
}

// Vérification de la dépendance WooCommerce
if (!esi_peppol_is_woocommerce_active()) {
    // Afficher un message d'erreur dans l'admin
    add_action('admin_notices', function () {
        if (!function_exists('esc_html__') || !function_exists('esc_html')) {
            // Fallback si les fonctions WordPress ne sont pas encore chargées
            echo '<div class="notice notice-error"><p><strong>ESI Peppol</strong> : Ce plugin nécessite WooCommerce. Veuillez installer et activer WooCommerce avant d\'utiliser ce plugin.</p></div>';
            return;
        }
        ?>
        <div class="notice notice-error">
            <p>
                <strong><?php esc_html_e('ESI Peppol', 'esi_peppol'); ?></strong> : 
                <?php esc_html_e('Ce plugin nécessite WooCommerce. Veuillez installer et activer WooCommerce avant d\'utiliser ce plugin.', 'esi_peppol'); ?>
            </p>
        </div>
        <?php
    });
    
    // Désactiver le plugin si WooCommerce n'est pas disponible
    add_action('admin_init', function () {
        if (function_exists('deactivate_plugins') && function_exists('plugin_basename')) {
            deactivate_plugins(plugin_basename(__FILE__));
        }
    });
    
    // Empêcher le chargement du reste du plugin
    return;
}

define('ESI_PEPPOL_VERSION', '0.1.0');
define('ESI_PEPPOL_DIR', plugin_dir_path(__FILE__));
define('ESI_PEPPOL_URL', plugin_dir_url(__FILE__));

use ESI_PEPPOL\controllers\PEPPOL_Plugin;

// Autoloader simple pour les classes PEPPOL (contrôleurs, modèles...) et celles avec namespace
spl_autoload_register(function ($class) {

    if (strpos($class, 'ESI_PEPPOL\\') === 0 || strpos($class, 'PEPPOL_') === 0) {
        
        // Gestion des classes avec namespace ESI_PEPPOL
        if (strpos($class, 'ESI_PEPPOL') === 0) {
            $base_dir = __DIR__ . '/app/';
            
            $relative_class = substr($class, strlen('ESI_PEPPOL\\'));

            // Mapping simple pour les classes PEPPOL_
            if (strpos($relative_class, 'controllers\\PEPPOL_') === 0) {
                $class_name = substr($relative_class, strlen('controllers\\PEPPOL_'));
                // Pour PEPPOL_Event_Controller -> Event_Controller.php
                $file = $base_dir . 'controllers/' . $class_name . '.php';
                
                if (file_exists($file)) {
                    require_once $file;
                    return;
                }
            }

            if (strpos($relative_class, 'views\\PEPPOL_') === 0) {
                $class_name = substr($relative_class, strlen('views\\PEPPOL_'));
                $file = $base_dir . 'views/' . $class_name . '.php';
                
                if (file_exists($file)) {
                    require_once $file;
                    return;
                }
            }

            if (strpos($relative_class, 'models\\PEPPOL_') === 0) {
                $class_name = substr($relative_class, strlen('models\\PEPPOL_'));
                $file = $base_dir . 'models/' . $class_name . '.php';
                
                if (file_exists($file)) {
                    require_once $file;
                    return;
                }
            }

            if (strpos($relative_class, 'helpers\\PEPPOL_') === 0) {
                $class_name = substr($relative_class, strlen('helpers\\PEPPOL_'));
                $file = $base_dir . 'helpers/' . $class_name . '.php';
                
                if (file_exists($file)) {
                    require_once $file;
                    return;
                }
            }

            // Mapping explicite pour les classes PEPPOL_ dont le nom de fichier
            // ne suit pas strictement le schéma "NomDeClasse.php".
            switch ($relative_class) {
                case 'controllers\\PEPPOL_Plugin':
                    $file = $base_dir . 'controllers/Plugin.php';
                    break;
                case 'controllers\\PEPPOL_Woocommerce_controller':
                    $file = $base_dir . 'controllers/Woocommerce_controller.php';
                    break;
                case 'controllers\\PEPPOL_peppol_controller':
                    $file = $base_dir . 'controllers/Peppol_controller.php';
                    break;
                case 'controllers\\PEPPOL_Webhook_controller':
                    $file = $base_dir . 'controllers/Webhook_controller.php';
                    break;
                case 'models\\PEPPOL_Main_model':
                    $file = $base_dir . 'models/Main_model.php';
                    break;

                case 'helpers\\PEPPOL_Woo_Helper':
                    // Helper WooCommerce : fichier réel situé dans "app/helper/woo_helper.php"
                    // Attention : sur les systèmes Linux, la casse et le nom du dossier/import doivent correspondre.
                    $file = $base_dir . 'helper/woo_helper.php';
                    break;
                default:
                    // Fallback : essayer le mapping standard
                    $file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';
                    break;
            }

            if (file_exists($file)) {
                require_once $file;
                return;
            }
        }
    }
});

// Hook d'activation du plugin avec vérification WooCommerce
register_activation_hook(
    __FILE__,
    function () {
        // Vérifier si WooCommerce est actif avant l'activation
        if (!esi_peppol_is_woocommerce_active()) {
            deactivate_plugins(plugin_basename(__FILE__));
            wp_die(
                esc_html__('ESI Peppol nécessite WooCommerce pour fonctionner. Veuillez installer et activer WooCommerce avant d\'activer ce plugin.', 'esi_peppol'),
                esc_html__('Dépendance manquante', 'esi_peppol'),
                ['back_link' => true]
            );
        }
        // Déléguer à PEPPOL_Plugin::activate() si WooCommerce est disponible
        PEPPOL_Plugin::activate();
    }
);

// Menu et pages d'administration du plugin
add_action(
    'admin_menu',
    [PEPPOL_Plugin::class, 'add_admin_menu']
);

// Assets d'administration
add_action(
    'admin_enqueue_scripts',
    [PEPPOL_Plugin::class, 'enqueue_admin_assets']
);

// AJAX admin pour test de connexion API
add_action(
    'wp_ajax_esi_peppol_test_connection',
    [PEPPOL_Plugin::class, 'ajax_test_connection']
);

// AJAX admin pour renvoyer une facture Peppol depuis la page de logs
add_action(
    'wp_ajax_esi_peppol_resend_invoice',
    [PEPPOL_Plugin::class, 'ajax_resend_invoice']
);

// AJAX admin pour consulter le statut d'une facture Peppol depuis la page de logs
add_action(
    'wp_ajax_esi_peppol_check_invoice_status',
    [PEPPOL_Plugin::class, 'ajax_check_invoice_status']
);

// AJAX admin pour récupérer les détails d'un log Peppol
add_action(
    'wp_ajax_esi_peppol_get_log_details',
    [PEPPOL_Plugin::class, 'ajax_get_log_details']
);

// AJAX admin pour détecter les champs TVA
add_action(
    'wp_ajax_esi_peppol_detect_vat_fields',
    [PEPPOL_Plugin::class, 'ajax_detect_vat_fields']
);

// AJAX admin pour sauvegarder le champ TVA sélectionné
add_action(
    'wp_ajax_esi_peppol_save_vat_field',
    [PEPPOL_Plugin::class, 'ajax_save_vat_field']
);

// Champ TVA de la boutique dans les réglages WooCommerce > Général.
add_filter(
    'woocommerce_general_settings',
    [PEPPOL_Plugin::class, 'filter_woocommerce_general_settings']
);

// Initialisation générale du plugin (hooks WooCommerce, etc.)
add_action(
    'plugins_loaded',
    static function () {
        $plugin = new PEPPOL_Plugin();
        $plugin->init();
    },
    20
);

// Enregistrement des routes REST API pour les webhooks
add_action(
    'rest_api_init',
    [\ESI_PEPPOL\controllers\PEPPOL_Webhook_controller::class, 'register_routes']
);