fetchAll("SELECT status, COUNT(*) as total FROM media_queue GROUP BY status"); $result = ['pending' => 0, 'processing' => 0, 'done' => 0, 'failed' => 0, 'permanently_failed' => 0]; foreach ($stats as $s) { $result[$s['status']] = intval($s['total']); } $result['total'] = array_sum($result); // Últimos 5 errores $lastErrors = $db->fetchAll("SELECT id, media_id, media_url, status, attempts, result, created_at FROM media_queue WHERE status IN ('failed','permanently_failed') ORDER BY created_at DESC LIMIT 5"); echo json_encode(['success' => true, 'stats' => $result, 'last_errors' => $lastErrors], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); break; case 'retry': $id = intval($_GET['id'] ?? 0); if (!$id) { echo json_encode(['success' => false, 'error' => 'Se requiere id']); exit; } $db->query("UPDATE media_queue SET status = 'pending', attempts = 0, result = NULL WHERE id = :id", ['id' => $id]); echo json_encode(['success' => true, 'message' => "Item #{$id} marcado para reintento"]); break; case 'retry_all': $db->query("UPDATE media_queue SET status = 'pending', attempts = 0, result = NULL WHERE status IN ('failed', 'permanently_failed')"); $affected = $db->fetch("SELECT ROW_COUNT() as cnt"); echo json_encode(['success' => true, 'message' => "Todos los fallidos marcados para reintento"]); break; case 'list': default: $status = $_GET['status'] ?? null; $limit = min(intval($_GET['limit'] ?? 50), 200); $where = ''; $params = []; if ($status) { $where = ' WHERE status = :status'; $params['status'] = $status; } $rows = $db->fetchAll( "SELECT mq.*, c.message_type, c.filename as conv_filename, c.content as conv_content FROM media_queue mq LEFT JOIN conversations c ON c.id = mq.conversation_id {$where} ORDER BY mq.created_at DESC LIMIT {$limit}", $params ); // Stats rápidas $statsRaw = $db->fetchAll("SELECT status, COUNT(*) as total FROM media_queue GROUP BY status"); $stats = []; foreach ($statsRaw as $s) $stats[$s['status']] = intval($s['total']); echo json_encode([ 'success' => true, 'stats' => $stats, 'count' => count($rows), 'items' => $rows ], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); break; } } catch (Exception $e) { http_response_code(500); echo json_encode(['success' => false, 'error' => $e->getMessage()]); }