<?php
/**
 * Importe les images externes (manifest.json) dans la médiathèque WP.
 * Pour chaque URL : download → attachment + alt + titre + nom de fichier propre.
 * Sortie : mapping.json  { "<url externe>": "<url médiathèque WP>" }.
 *
 * Lancé via : wp eval-file wp-content/import-into-media.php
 * (manifest.json doit être à côté dans wp-content/).
 */

if (!defined('ABSPATH')) { exit; }
require_once ABSPATH . 'wp-admin/includes/media.php';
require_once ABSPATH . 'wp-admin/includes/file.php';
require_once ABSPATH . 'wp-admin/includes/image.php';

$dir      = dirname(__FILE__);
$manifest = json_decode(file_get_contents($dir . '/manifest.json'), true);
$map      = [];
$errors   = [];

foreach ($manifest as $item) {
    $url = $item['url'];
    $alt = $item['alt'];
    $id  = $item['id'];

    // Extension depuis le chemin de l'URL (avant le ?).
    $path = parse_url($url, PHP_URL_PATH);
    $ext  = strtolower(pathinfo($path, PATHINFO_EXTENSION)) ?: 'jpg';
    $name = sanitize_file_name($id . '.' . $ext); // nom de fichier propre/SEO

    $tmp = download_url($url, 60);
    if (is_wp_error($tmp)) {
        $errors[] = $id . ' : download ' . $tmp->get_error_message();
        continue;
    }

    $file_array = ['name' => $name, 'tmp_name' => $tmp];
    $att_id = media_handle_sideload($file_array, 0, $alt);
    if (is_wp_error($att_id)) {
        @unlink($tmp);
        $errors[] = $id . ' : sideload ' . $att_id->get_error_message();
        continue;
    }

    update_post_meta($att_id, '_wp_attachment_image_alt', $alt);
    wp_update_post(['ID' => $att_id, 'post_title' => $alt]);

    $map[$url] = wp_get_attachment_url($att_id);
}

file_put_contents($dir . '/mapping.json', json_encode($map, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES));
echo "IMPORTED=" . count($map) . " ERRORS=" . count($errors) . "\n";
foreach ($errors as $e) { echo "ERR: $e\n"; }
