import React, { useState, useEffect, useCallback } from 'react'; import { CheckCircleIcon, XCircleIcon, AlertTriangleIcon, Loader2Icon, ActivityIcon, ClockIcon, GlobeIcon, RefreshCwIcon, TestTubeIcon, SettingsIcon as WrenchIcon } from '../../icons'; import { useSiteStore } from '../../store/siteStore'; import { useToast } from '../../components/ui/toast/ToastContainer'; import { API_BASE_URL, fetchAPI } from '../../services/api'; // Types for WordPress integration debugging interface IntegrationHealth { api_status: 'healthy' | 'error'; api_message: string; last_api_check: string; plugin_active: boolean; plugin_version: string; debug_mode: boolean; sync_healthy: boolean; pending_syncs: number; last_sync: string | null; } interface SyncEvent { type: 'sync' | 'error' | 'webhook' | 'debug'; action: string; description: string; timestamp: string; details?: any; } interface DataValidation { field_name: string; igny8_value: string; wp_value: string; matches: boolean; error?: string; } export default function WordPressIntegrationDebug() { // State const [debugEnabled, setDebugEnabled] = useState(false); const [loading, setLoading] = useState(false); const [initializing, setInitializing] = useState(true); const [pollingInterval, setPollingInterval] = useState(null); const [integrationHealth, setIntegrationHealth] = useState(null); const [syncEvents, setSyncEvents] = useState([]); const [dataValidation, setDataValidation] = useState([]); const [integrationId, setIntegrationId] = useState(null); // Get active site from store const { activeSite } = useSiteStore(); const toast = useToast(); // Check if integration exists for the active site useEffect(() => { const checkIntegration = async () => { if (!activeSite) { setInitializing(false); return; } try { setInitializing(true); const data = await fetchAPI(`/v1/integration/integrations/?site_id=${activeSite.id}`); const integrations = data.results || []; if (integrations.length > 0) { const wpIntegration = integrations.find((i: any) => i.platform === 'wordpress'); if (wpIntegration) { setIntegrationId(wpIntegration.id); setDebugEnabled(wpIntegration.credentials_json?.debug_enabled || false); } } } catch (error) { console.error('[WP-DEBUG] Failed to check integration:', error); } finally { setInitializing(false); } }; checkIntegration(); }, [activeSite]); // Helper to make authenticated API calls with debug awareness const apiCall = async (path: string, method: string = 'GET', body?: any) => { // Always allow debug-status calls to check if integration exists if (!integrationId && !path.includes('/integrations/?')) { console.log('[WP-DEBUG] Skipping API call - no integration configured:', path); return { response: { ok: false, status: 0 } as Response, data: null }; } const options: RequestInit = { method, }; if (body && method !== 'GET') { options.body = JSON.stringify(body); } try { if (debugEnabled) { console.log('[WP-DEBUG] API Call:', method, path, body ? { body } : {}); } const data = await fetchAPI(path, options); if (debugEnabled) { console.log('[WP-DEBUG] API Response:', data); } return { response: { ok: true, status: 200 } as Response, data }; } catch (error: any) { if (debugEnabled) { console.error('[WP-DEBUG] API Error:', error); } const errorData = error.response || { detail: error.message || 'Request failed' }; return { response: { ok: false, status: error.status || 500 } as Response, data: errorData }; } }; // Toggle debug mode const toggleDebugMode = async (enabled: boolean) => { if (!activeSite) { toast.error('Please select a site first'); return; } if (!integrationId) { toast.error('No WordPress integration found for this site'); return; } try { setLoading(true); // Set local debug state first for immediate UI response setDebugEnabled(enabled); if (enabled) { console.log('[WP-DEBUG] 🎯 WordPress Debug mode ENABLED for site:', activeSite.name); toast.success('WordPress debug mode enabled - verbose logging started'); // Start polling for updates startPolling(); // Trigger debug mode on WordPress plugin if integrated await apiCall(`/v1/integration/integrations/${integrationId}/trigger-debug/`, 'POST', { debug_enabled: true }); // Load initial debug data await loadDebugData(); } else { console.log('[WP-DEBUG] πŸ”’ WordPress Debug mode DISABLED'); toast.info('WordPress debug mode disabled - reduced logging'); // Stop polling stopPolling(); // Disable debug on WordPress await apiCall(`/v1/integration/integrations/${integrationId}/trigger-debug/`, 'POST', { debug_enabled: false }); } } catch (error) { console.error('[WP-DEBUG] Failed to toggle debug mode:', error); toast.error('Failed to toggle WordPress debug mode'); setDebugEnabled(!enabled); // Revert } finally { setLoading(false); } }; // Start polling for debug data const startPolling = () => { if (pollingInterval) return; const interval = setInterval(() => { if (debugEnabled && activeSite) { loadDebugData(); } }, 5000); // Poll every 5 seconds when debug is enabled setPollingInterval(interval); console.log('[WP-DEBUG] ⏰ Started polling for WordPress debug updates'); }; // Stop polling const stopPolling = () => { if (pollingInterval) { clearInterval(pollingInterval); setPollingInterval(null); console.log('[WP-DEBUG] ⏸️ Stopped polling'); } }; // Load all debug data const loadDebugData = useCallback(async () => { if (!activeSite || !integrationId) { console.log('[WP-DEBUG] Skipping load - no site or integration'); return; } try { setLoading(true); console.log('[WP-DEBUG] πŸ“Š Loading WordPress debug data for site:', activeSite.name); // Load integration health await loadIntegrationHealth(); // Load sync events if debug is enabled if (debugEnabled) { await loadSyncEvents(); await loadDataValidation(); } console.log('[WP-DEBUG] βœ… WordPress debug data loaded successfully'); } catch (error) { console.error('[WP-DEBUG] ❌ Failed to load WordPress debug data:', error); // Don't show toast error on initial load } finally { setLoading(false); } }, [activeSite, integrationId, debugEnabled]); // Load integration health const loadIntegrationHealth = async () => { if (!integrationId) return; try { const { data } = await apiCall(`/v1/integration/integrations/${integrationId}/debug-status/`); if (data?.health) { setIntegrationHealth(data.health); console.log('[WP-DEBUG] πŸ’š Integration health loaded'); } } catch (error) { console.error('[WP-DEBUG] Failed to load integration health:', error); } }; // Load sync events const loadSyncEvents = async () => { if (!integrationId) return; try { const { data } = await apiCall(`/v1/integration/integrations/${integrationId}/debug-status/?include_events=true`); if (data?.events) { setSyncEvents(data.events); console.log('[WP-DEBUG] πŸ“œ Loaded', data.events.length, 'WordPress sync events'); } } catch (error) { console.error('[WP-DEBUG] Failed to load sync events:', error); } }; // Load data validation matrix const loadDataValidation = async () => { if (!integrationId) return; try { const { data } = await apiCall(`/v1/integration/integrations/${integrationId}/debug-status/?include_validation=true`); if (data?.validation) { setDataValidation(data.validation); console.log('[WP-DEBUG] 🧩 Loaded WordPress data validation matrix'); } } catch (error) { console.error('[WP-DEBUG] Failed to load data validation:', error); } }; // Interactive tools const testConnection = async () => { if (!integrationId) { toast.error('No WordPress integration found'); return; } try { setLoading(true); console.log('[WP-DEBUG] πŸ”§ Testing connection to WordPress...'); const { data } = await apiCall(`/v1/integration/integrations/${integrationId}/test-connection/`, 'POST'); if (data?.success) { toast.success('WordPress connection test successful'); await loadIntegrationHealth(); // Refresh health data } else { toast.error('WordPress connection test failed: ' + (data?.message || 'Unknown error')); } } catch (error) { console.error('[WP-DEBUG] Connection test error:', error); toast.error('WordPress connection test failed'); } finally { setLoading(false); } }; // Load initial data when component mounts or integration changes useEffect(() => { if (!initializing && integrationId) { loadDebugData(); } }, [integrationId, initializing]); // Start/stop polling based on debug state useEffect(() => { if (debugEnabled && integrationId) { startPolling(); } else { stopPolling(); } return () => stopPolling(); }, [debugEnabled, integrationId]); // Effects - Load initial data when site changes or integration found useEffect(() => { if (activeSite && integrationId && !initializing) { loadDebugData(); // Auto-start polling for real-time updates if debug enabled if (debugEnabled) { startPolling(); } } return () => { stopPolling(); }; }, [activeSite, integrationId, initializing]); // Show loading state while initializing if (initializing) { return (

Loading WordPress integration...

); } // Show message if no integration is configured if (!integrationId) { return (

No WordPress Integration Found

This site doesn't have a WordPress integration configured yet.

Please configure a WordPress integration in the Settings β†’ Integration page first.

); } const resyncSiteMetadata = async () => { if (!activeSite) return; try { setLoading(true); console.log('[WP-DEBUG] πŸ”„ Re-syncing WordPress site metadata...'); const { data } = await apiCall(`/integration/integrations/${activeSite.id}/resync-metadata/`, 'POST'); if (data?.success) { toast.success('WordPress site metadata re-synced successfully'); await loadDebugData(); // Refresh all data } else { toast.error('WordPress re-sync failed: ' + data?.message); } } catch (error) { console.error('[WP-DEBUG] Metadata resync error:', error); toast.error('WordPress metadata re-sync failed'); } finally { setLoading(false); } }; const validatePostSync = async (taskId?: number) => { if (!activeSite) return; const id = taskId || prompt('Enter Task ID to validate WordPress sync:'); if (!id) return; try { setLoading(true); console.log('[WP-DEBUG] πŸ” Validating WordPress post sync for task:', id); const { data } = await apiCall(`/integration/integrations/${activeSite.id}/validate-content/${id}/`); if (data) { toast.success('WordPress post validation completed'); setDataValidation(data.validation || []); } else { toast.error('WordPress validation failed: ' + data?.message); } } catch (error) { console.error('[WP-DEBUG] Post validation error:', error); toast.error('WordPress post validation failed'); } finally { setLoading(false); } }; return (
{/* No WordPress Integration Found */} {initializing ? (

Checking for WordPress integration...

) : !integrationId && activeSite ? (

No WordPress Integration Found

This site doesn't have a WordPress integration configured yet.

Please configure a WordPress integration in Settings β†’ Integration page first.

) : !activeSite ? (

No Site Selected

Please select a site to view WordPress integration debug data.

) : ( <> {/* Integration Health Summary */}

WordPress Bridge Health

{integrationHealth ? (
API Connection {integrationHealth.api_status === 'healthy' ? ( ) : ( )}

{integrationHealth.api_message}

Last: {new Date(integrationHealth.last_api_check).toLocaleTimeString()}
Plugin Status {integrationHealth.plugin_active ? ( ) : ( )}

Version: {integrationHealth.plugin_version || 'Unknown'}

Debug: {integrationHealth.debug_mode ? 'Enabled' : 'Disabled'}
Sync Status {integrationHealth.sync_healthy ? ( ) : ( )}

{integrationHealth.pending_syncs || 0} pending

Last: {integrationHealth.last_sync ? new Date(integrationHealth.last_sync).toLocaleTimeString() : 'Never'}
) : (
Loading WordPress integration health...
)}
{/* Live Action Logs */}

Live WordPress Sync Events

{syncEvents.length > 0 ? (
{syncEvents.slice().reverse().map((event, idx) => (
{event.type} {event.action}

{event.description}

{event.details && (
View Details
                              {typeof event.details === 'string' ? event.details : JSON.stringify(event.details, null, 2)}
                            
)}
{new Date(event.timestamp).toLocaleTimeString()}
))}
) : (

No WordPress sync events yet. Actions will appear here in real-time.

Content publishing, metadata sync, and webhook calls will be logged here.

)}
{/* Data Validation Matrix */} {dataValidation.length > 0 && (

Data Sync Validation

{dataValidation.map((validation, idx) => ( ))}
Field IGNY8 Value WordPress Value Status
{validation.field_name} {validation.igny8_value || empty} {validation.wp_value || empty} {validation.matches ? ( ) : (
{validation.error && ( {validation.error} )}
)}
)} )}
); }