<?php
/**
 * Repara mensajes de WhatsApp con media pendiente: busca los mensajes de tipo
 * imagen/audio/video/documento/sticker que quedaron SIN archivo (media_path
 * NULL) y les baja la media desde Evolution API (getBase64FromMediaMessage).
 * Idempotente: solo toca los que estan sin archivo. Uso: php reparar_media_whatsapp.php
 */
define('CRON_MODE', true);
$rootDir = dirname(dirname(__FILE__));
require $rootDir . '/config/config.php';
require $rootDir . '/app/helpers/WhatsAppHelper.php';

$db = Database::getInstance();
$pendientes = $db->fetchAll(
    "SELECT wm.id, wm.message_id, wm.tipo, wm.instancia_id
     FROM whatsapp_mensajes wm
     WHERE wm.media_path IS NULL
       AND wm.tipo IN ('image', 'audio', 'video', 'document', 'sticker')
       AND wm.message_id NOT LIKE 'local_%'
     ORDER BY wm.id DESC LIMIT 100"
);

if (!$pendientes) { echo "No hay mensajes con media pendiente.\n"; exit; }
echo count($pendientes) . " mensaje(s) con media pendiente...\n";

$instancias = array();
$ok = 0; $fallo = 0;
foreach ($pendientes as $msg) {
    $iid = (int)$msg['instancia_id'];
    if (!isset($instancias[$iid])) {
        $instancias[$iid] = $db->fetchOne("SELECT * FROM whatsapp_instancias WHERE id = :id", array('id' => $iid));
    }
    $instancia = $instancias[$iid];
    if (!$instancia) { $fallo++; continue; }

    $b64 = WhatsAppHelper::obtenerMediaDeApi($instancia, $msg['message_id']);
    if (!$b64) {
        echo "  msg {$msg['id']} ({$msg['tipo']}): la API no entrego la media\n";
        $fallo++;
        continue;
    }
    $mediaPath = WhatsAppHelper::guardarMediaEntrante($b64, $msg['tipo'], null);
    if ($mediaPath) {
        $db->update('whatsapp_mensajes', array('media_path' => $mediaPath), 'id = :id', array('id' => $msg['id']));
        echo "  msg {$msg['id']} ({$msg['tipo']}): recuperado -> $mediaPath\n";
        $ok++;
    } else {
        $fallo++;
    }
}
echo "Listo: $ok recuperado(s), $fallo sin recuperar.\n";
