'error', 'message' => 'DB: ' . $e->getMessage()]); exit; } // Get actual columns from brain_winners $winnerCols = []; try { $stmt = $pdo->query("SELECT column_name FROM information_schema.columns WHERE table_schema='admin' AND table_name='brain_winners' ORDER BY ordinal_position"); $winnerCols = $stmt->fetchAll(PDO::FETCH_COLUMN); } catch (Exception $e) {} switch ($action) { case 'stats': $total = $pdo->query("SELECT COUNT(*) FROM admin.brain_configs")->fetchColumn(); $winners = $pdo->query("SELECT COUNT(*) FROM admin.brain_winners")->fetchColumn(); // Get avg inbox rate - adapt to actual columns $avgInbox = 0; if (in_array('inbox_rate', $winnerCols)) { $avgInbox = $pdo->query("SELECT COALESCE(AVG(inbox_rate), 0) FROM admin.brain_winners")->fetchColumn(); } elseif (in_array('success_rate', $winnerCols)) { $avgInbox = $pdo->query("SELECT COALESCE(AVG(success_rate), 0) FROM admin.brain_winners")->fetchColumn(); } // Count distinct ISPs $isps = 0; if (in_array('isp', $winnerCols)) { $isps = $pdo->query("SELECT COUNT(DISTINCT isp) FROM admin.brain_winners")->fetchColumn(); } elseif (in_array('isp_name', $winnerCols)) { $isps = $pdo->query("SELECT COUNT(DISTINCT isp_name) FROM admin.brain_winners")->fetchColumn(); } echo json_encode([ 'status' => 'ok', 'data' => [ 'total_configs' => (int)$total, 'winners' => (int)$winners, 'avg_inbox' => round((float)$avgInbox, 1), 'isps_covered' => (int)$isps ], 'columns' => $winnerCols ]); break; case 'winners': // Build query dynamically based on actual columns $cols = implode(', ', array_map(fn($c) => "\"$c\"", $winnerCols)); $rows = $pdo->query("SELECT $cols FROM admin.brain_winners ORDER BY id DESC LIMIT 20")->fetchAll(PDO::FETCH_ASSOC); // Normalize field names for frontend $normalized = array_map(function($row) { return [ 'isp' => $row['isp'] ?? $row['isp_name'] ?? $row['target_isp'] ?? '—', 'mua' => $row['mua'] ?? $row['mua_type'] ?? $row['user_agent'] ?? '—', 'encoding' => $row['encoding'] ?? $row['content_encoding'] ?? '—', 'x_mailer' => $row['x_mailer'] ?? $row['mailer'] ?? 'none', 'inbox_rate' => $row['inbox_rate'] ?? $row['success_rate'] ?? 0, 'status' => 'winner', 'raw' => $row ]; }, $rows); echo json_encode(['status' => 'ok', 'data' => $normalized]); break; case 'list': // Get brain_configs $configCols = []; try { $stmt = $pdo->query("SELECT column_name FROM information_schema.columns WHERE table_schema='admin' AND table_name='brain_configs' ORDER BY ordinal_position"); $configCols = $stmt->fetchAll(PDO::FETCH_COLUMN); } catch (Exception $e) {} if (!empty($configCols)) { $cols = implode(', ', array_map(fn($c) => "\"$c\"", $configCols)); $rows = $pdo->query("SELECT $cols FROM admin.brain_configs ORDER BY id DESC LIMIT 30")->fetchAll(PDO::FETCH_ASSOC); } else { $rows = []; } $normalized = array_map(function($row) { return [ 'id' => $row['id'] ?? '—', 'combo' => $row['description'] ?? $row['name'] ?? $row['config_name'] ?? json_encode(array_slice($row, 0, 3)), 'tests' => $row['test_count'] ?? $row['tests'] ?? 0, 'inbox_rate' => $row['inbox_rate'] ?? $row['success_rate'] ?? 0, 'status' => $row['status'] ?? $row['is_active'] ?? 'unknown', 'raw' => $row ]; }, $rows); echo json_encode(['status' => 'ok', 'data' => $normalized]); break; case 'discover': // Trigger a new combo discovery (placeholder — connects to brain engine) echo json_encode([ 'status' => 'ok', 'message' => 'Discovery triggered', 'brain_tables' => [ 'brain_winners' => count($winnerCols) . ' columns', 'columns' => $winnerCols ] ]); break; default: echo json_encode(['status' => 'ok', 'message' => 'Brain Combo API', 'actions' => ['stats', 'winners', 'list', 'discover']]); } ?>