<?php
/**
 * Système de recadrage d'images AJAX
 * Version sécurisée - WordPress.org compliant
 */

// 🔐 GET ATTACHMENT URL
add_action('wp_ajax_wprg_get_attachment_url', 'wprg_get_attachment_url');

function wprg_get_attachment_url() {
    // Vérification du nonce en PREMIÈRE LIGNE
    check_ajax_referer('wprg_cropper_nonce', 'nonce');

    // Vérification des permissions (obligatoire pour les actions sensibles)
    if (!current_user_can('upload_files')) {
        wp_send_json_error(['message' => 'Permission refusée']);
    }

    // Validation de l'ID de l'attachment
    $attachment_id = isset($_POST['attachment_id']) ? intval($_POST['attachment_id']) : 0;
    if ($attachment_id <= 0) {
        wp_send_json_error(['message' => 'ID de l\'attachment invalide']);
    }

    // Vérifier que c'est bien une image
    if (!wp_attachment_is_image($attachment_id)) {
        wp_send_json_error(['message' => 'Le fichier n\'est pas une image valide']);
    }

    $url = wp_get_attachment_url($attachment_id);
    if (!$url) {
        wp_send_json_error(['message' => 'URL de l\'image non trouvée']);
    }

    wp_send_json_success([
        'url' => esc_url_raw($url)
    ]);
}

// 🔐 CROP IMAGE
add_action('wp_ajax_wprg_crop_image', 'wprg_crop_image');

function wprg_crop_image() {
    // Vérification du nonce en PREMIÈRE LIGNE
    check_ajax_referer('wprg_cropper_nonce', 'nonce');

    // Vérification des permissions (obligatoire pour les actions sensibles)
    if (!current_user_can('upload_files')) {
        wp_send_json_error(['message' => 'Permission refusée']);
    }

    // Validation des données requises
    $attachment_id = isset($_POST['attachment_id']) ? intval($_POST['attachment_id']) : 0;
    $crop_data_raw = isset($_POST['crop_data']) ? wp_unslash($_POST['crop_data']) : '';
    
    if (empty($attachment_id) || empty($crop_data_raw)) {
        wp_send_json_error(['message' => 'Données manquantes']);
    }
    
    // Décoder et valider les données JSON
    $crop_data = json_decode($crop_data_raw, true);
    if (!is_array($crop_data)) {
        wp_send_json_error(['message' => 'Données de recadrage invalides']);
    }

    // Vérifier que l'attachment existe et est une image
    if (!wp_attachment_is_image($attachment_id)) {
        wp_send_json_error(['message' => 'L\'attachment n\'est pas une image valide']);
    }

    // Valider et nettoyer les coordonnées de recadrage
    $x = isset($crop_data['x']) ? intval($crop_data['x']) : 0;
    $y = isset($crop_data['y']) ? intval($crop_data['y']) : 0;
    $width = isset($crop_data['width']) ? intval($crop_data['width']) : 0;
    $height = isset($crop_data['height']) ? intval($crop_data['height']) : 0;

    if ($width <= 0 || $height <= 0) {
        wp_send_json_error(['message' => 'Dimensions de recadrage invalides']);
    }

    if ($width > 5000 || $height > 5000) {
        wp_send_json_error(['message' => 'Dimensions trop grandes']);
    }

    // Récupérer le chemin du fichier
    $file = get_attached_file($attachment_id);
    if (!$file || !file_exists($file)) {
        wp_send_json_error(['message' => 'Fichier image non trouvé']);
    }

    // Initialiser l'éditeur d'image
    $editor = wp_get_image_editor($file);
    if (is_wp_error($editor)) {
        wp_send_json_error(['message' => 'Impossible de charger l\'éditeur d\'image: ' . $editor->get_error_message()]);
    }

    // Effectuer le recadrage
    $result = $editor->crop($x, $y, $width, $height, 1080, 1920);
    if (is_wp_error($result)) {
        wp_send_json_error(['message' => 'Échec du recadrage: ' . $result->get_error_message()]);
    }

    // Sauvegarder l'image recadrée
    $saved = $editor->save();
    if (is_wp_error($saved)) {
        wp_send_json_error(['message' => 'Échec de la sauvegarde: ' . $saved->get_error_message()]);
    }

    // Créer une nouvelle attachment pour l'image recadrée
    $filename = basename($saved['path']);
    $filetype = wp_check_filetype($filename, null);

    $attachment = [
        'post_mime_type' => $filetype['type'],
        'post_title'     => sanitize_file_name($filename),
        'post_content'   => '',
        'post_status'    => 'inherit',
        'guid'           => esc_url_raw($saved['path'])
    ];

    $new_attachment_id = wp_insert_attachment($attachment, $saved['path']);
    if (!$new_attachment_id || is_wp_error($new_attachment_id)) {
        wp_send_json_error(['message' => 'Impossible de créer la nouvelle attachment']);
    }

    // Générer les métadonnées
    require_once(ABSPATH . 'wp-admin/includes/image.php');
    $meta = wp_generate_attachment_metadata($new_attachment_id, $saved['path']);
    wp_update_attachment_metadata($new_attachment_id, $meta);

    // Si un post_id est fourni, définir cette image comme miniature
    $post_id = isset($_POST['post_id']) ? intval($_POST['post_id']) : 0;
    if ($post_id > 0) {
        // Vérifier les permissions sur le post
        if (current_user_can('edit_post', $post_id)) {
            set_post_thumbnail($post_id, $new_attachment_id);
        }
    }

    // Nettoyer les caches
    clean_post_cache($post_id);

    wp_send_json_success([
        'attachment_id' => $new_attachment_id,
        'thumbnail_url' => esc_url_raw(wp_get_attachment_url($new_attachment_id))
    ]);
}