isLoggedIn()) { throw new Exception('Unauthorized'); } $db = Database::getInstance(); // Get current analysis state $stateQuery = $db->query("SELECT * FROM optimization_analysis_state ORDER BY id DESC LIMIT 1"); $state = $stateQuery ? $stateQuery->fetch_assoc() : null; // Get real-time statistics $stats = getCurrentStats($db); // Calculate processing rate (combinations per minute) $processingRate = calculateProcessingRate($db); // Estimate time remaining $timeRemaining = estimateTimeRemaining($stats, $processingRate); // Check if process is actually active (processed something in last 2 minutes) $recentActivity = checkRecentActivity($db); echo json_encode([ 'success' => true, 'is_running' => $state ? (bool)$state['is_running'] : false, 'should_pause' => $state ? (bool)$state['should_pause'] : false, 'stats' => $stats, 'processing_rate' => $processingRate, 'time_remaining' => $timeRemaining, 'recent_activity' => $recentActivity, 'started_at' => $state ? $state['started_at'] : null, 'last_updated' => $state ? $state['last_updated'] : null ]); } catch (Exception $e) { http_response_code(500); echo json_encode([ 'success' => false, 'message' => $e->getMessage() ]); } function getCurrentStats($db) { $stats = []; // Total combinations $totalQuery = $db->query("SELECT COUNT(*) as count FROM panel_directives"); $stats['total'] = $totalQuery ? $totalQuery->fetch_assoc()['count'] : 0; // Processed combinations $processedQuery = $db->query("SELECT COUNT(*) as count FROM panel_directives WHERE llm_checked = 1"); $stats['processed'] = $processedQuery ? $processedQuery->fetch_assoc()['count'] : 0; // Possible combinations $possibleQuery = $db->query("SELECT COUNT(*) as count FROM panel_directives WHERE llm_checked = 1 AND is_impossible = 0"); $stats['possible'] = $possibleQuery ? $possibleQuery->fetch_assoc()['count'] : 0; // Impossible combinations $impossibleQuery = $db->query("SELECT COUNT(*) as count FROM panel_directives WHERE llm_checked = 1 AND is_impossible = 1"); $stats['impossible'] = $impossibleQuery ? $impossibleQuery->fetch_assoc()['count'] : 0; // Pending combinations $stats['pending'] = $stats['total'] - $stats['processed']; // Progress percentage $stats['progress'] = $stats['total'] > 0 ? ($stats['processed'] / $stats['total']) * 100 : 0; return $stats; } function calculateProcessingRate($db) { try { // Get combinations processed in the last 5 minutes $query = $db->query(" SELECT COUNT(*) as count FROM panel_directives WHERE llm_checked = 1 AND updated_at > DATE_SUB(NOW(), INTERVAL 5 MINUTE) "); $recentCount = $query ? $query->fetch_assoc()['count'] : 0; // Calculate rate per minute (combinations in 5 minutes / 5) $ratePerMinute = $recentCount / 5; return round($ratePerMinute, 2); } catch (Exception $e) { return 0; } } function estimateTimeRemaining($stats, $processingRate) { if ($processingRate <= 0 || $stats['pending'] <= 0) { return null; } $minutesRemaining = $stats['pending'] / $processingRate; if ($minutesRemaining < 60) { return round($minutesRemaining) . ' minutes'; } elseif ($minutesRemaining < 1440) { // Less than 24 hours $hours = floor($minutesRemaining / 60); $minutes = round($minutesRemaining % 60); return $hours . 'h ' . $minutes . 'm'; } else { $days = floor($minutesRemaining / 1440); $hours = floor(($minutesRemaining % 1440) / 60); return $days . 'd ' . $hours . 'h'; } } function checkRecentActivity($db) { try { // Check for combinations processed in last 2 minutes $query = $db->query(" SELECT COUNT(*) as count FROM panel_directives WHERE llm_checked = 1 AND updated_at > DATE_SUB(NOW(), INTERVAL 2 MINUTE) "); $recentCount = $query ? $query->fetch_assoc()['count'] : 0; return [ 'has_activity' => $recentCount > 0, 'recent_count' => $recentCount, 'last_activity' => getLastActivity($db) ]; } catch (Exception $e) { return [ 'has_activity' => false, 'recent_count' => 0, 'last_activity' => null ]; } } function getLastActivity($db) { try { $query = $db->query(" SELECT MAX(updated_at) as last_update FROM panel_directives WHERE llm_checked = 1 "); $result = $query ? $query->fetch_assoc() : null; return $result ? $result['last_update'] : null; } catch (Exception $e) { return null; } } ?>