<?php
// Start the timer
header('Content-Type: text/plain');
echo "HELLO";

$start_time = microtime(true);

// Loop 1: Simple arithmetic operations
$count1 = 10000000;
for ($i = 0; $i < $count1; $i++) {
    $result = $i * 2 + 5;
}

// Loop 2: String concatenation
$count2 = 1000000;
$string = '';
for ($i = 0; $i < $count2; $i++) {
    $string .= 'Hello, world! ';
}

// Loop 3: Array manipulation
$count3 = 100000;
$array = array();
for ($i = 0; $i < $count3; $i++) {
    $array[] = $i;
}
$reversed_array = array_reverse($array);

// Loop 4: File I/O operations
$count4 = 1000;
$file = 'test_file.txt';
for ($i = 0; $i < $count4; $i++) {
    file_put_contents($file, "Line $i\n", FILE_APPEND);
}
$file_contents = file_get_contents($file);
unlink($file);

// End the timer
$end_time = microtime(true);

// Calculate the total run time
$total_time = $end_time - $start_time;

// Display the results
echo "Loop 1 (Simple arithmetic operations): $count1 iterations\n";
echo "Loop 2 (String concatenation): $count2 iterations\n";
echo "Loop 3 (Array manipulation): $count3 iterations\n";
echo "Loop 4 (File I/O operations): $count4 iterations\n";
echo "\n";
echo "Total run time: " . number_format($total_time, 4) . " seconds\n\n";


// Function to get CPU load with per-core calculations
function getCpuLoad() {
    $load = sys_getloadavg();
    $cores = (int)trim(shell_exec("nproc"));
    
    return [
        'cores' => $cores,
        'loads' => [
            '1min' => $load[0],
            '5min' => $load[1],
            '15min' => $load[2]
        ],
        'per_core' => [
            '1min' => $load[0] / $cores,
            '5min' => $load[1] / $cores,
            '15min' => $load[2] / $cores
        ]
    ];
}

// Function to get memory information
function getMemoryInfo() {
    $free = shell_exec('free');
    $free = trim($free);
    $free_arr = explode("\n", $free);
    $mem = explode(" ", $free_arr[1]);
    $mem = array_filter($mem);
    $mem = array_merge($mem);
    
    return [
        'total' => formatBytes($mem[1] * 1024),
        'used' => formatBytes($mem[2] * 1024),
        'free' => formatBytes($mem[3] * 1024),
        'percentage_used' => round(($mem[2] / $mem[1]) * 100, 2)
    ];
}

// Function to get top processes
function getTopProcesses() {
    // Get CPU intensive processes
    $cpu_processes = shell_exec("ps aux --sort=-%cpu | head -n 6");
    $cpu_processes = trim($cpu_processes);
    
    // Get memory intensive processes
    $mem_processes = shell_exec("ps aux --sort=-%mem | head -n 6");
    $mem_processes = trim($mem_processes);
    
    return [
        'cpu' => $cpu_processes,
        'memory' => $mem_processes
    ];
}

function getNetworkStats() {
    $netdev = file_get_contents('/proc/net/dev');
    $stats = [];
    
    foreach (explode("\n", $netdev) as $line) {
        if (preg_match('/^\s*([^:]+):(.*)/', $line, $matches)) {
            $interface = trim($matches[1]);
            $values = preg_split('/\s+/', trim($matches[2]));
            if ($interface != 'lo') { // Skip loopback
                $stats[$interface] = [
                    'bytes_received' => formatBytes($values[0]),
                    'packets_received' => $values[1],
                    'bytes_transmitted' => formatBytes($values[8]),
                    'packets_transmitted' => $values[9],
                ];
            }
        }
    }
    
    return $stats;
}

// Helper function to format bytes
function formatBytes($bytes, $precision = 6) {
    $units = ['B', 'KB', 'MB', 'GB', 'TB'];
    $bytes = max($bytes, 0);
    $pow = floor(($bytes ? log($bytes) : 0) / log(1024));
    $pow = min($pow, count($units) - 1);
    $bytes /= pow(1024, $pow);
    return round($bytes, $precision) . ' ' . $units[$pow];
}

function logToCSV($cpuInfo, $memInfo, $topProcesses, $networkStats, $total_time) {
    $timestamp = date('Y-m-d H:i:s');
    $csv_file = 'system_monitor.csv';
    
    // Extract top 5 CPU process info with full command
    $cpu_lines = explode("\n", $topProcesses['cpu']);
    $top_cpu_processes = [];
    for ($i = 1; $i <= 5; $i++) {
        if (isset($cpu_lines[$i])) {
            $line = trim($cpu_lines[$i]);
            // Match the first 11 columns of ps output
            if (preg_match('/^\S+\s+\S+\s+(\S+)\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+(.+)$/', $line, $matches)) {
                $top_cpu_processes[] = [
                    'command' => str_replace('"', '""', trim($matches[2])), // Escape quotes for CSV
                    'cpu_usage' => $matches[1]
                ];
            }
        }
    }
    
    // Extract top 5 Memory process info with full command
    $mem_lines = explode("\n", $topProcesses['memory']);
    $top_mem_processes = [];
    for ($i = 1; $i <= 5; $i++) {
        if (isset($mem_lines[$i])) {
            $line = trim($mem_lines[$i]);
            // Match the first 11 columns of ps output
            if (preg_match('/^\S+\s+\S+\s+\S+\s+(\S+)\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+(.+)$/', $line, $matches)) {
                $top_mem_processes[] = [
                    'command' => str_replace('"', '""', trim($matches[2])), // Escape quotes for CSV
                    'mem_usage' => $matches[1]
                ];
            }
        }
    }
    
    // Get network stats for first interface
    $first_interface = array_key_first($networkStats);
    $net_stats = $networkStats[$first_interface];
    
    // Create CSV line parts
    $csv_parts = [
        $timestamp,
        $total_time,
        $cpuInfo['per_core']['1min'],
        $cpuInfo['per_core']['5min'],
        $cpuInfo['per_core']['15min'],
        $memInfo['free'],
        $memInfo['percentage_used']
    ];
    
    // Add top 5 CPU processes
    foreach ($top_cpu_processes as $proc) {
        $csv_parts[] = '"' . $proc['command'] . '"'; // Wrap command in quotes
        $csv_parts[] = $proc['cpu_usage'];
    }
    
    // Pad with empty values if less than 5 CPU processes
    while (count($top_cpu_processes) < 5) {
        $csv_parts[] = '""';
        $csv_parts[] = '0';
        $top_cpu_processes[] = null;
    }
    
    // Add top 5 memory processes
    foreach ($top_mem_processes as $proc) {
        $csv_parts[] = '"' . $proc['command'] . '"'; // Wrap command in quotes
        $csv_parts[] = $proc['mem_usage'];
    }
    
    // Pad with empty values if less than 5 memory processes
    while (count($top_mem_processes) < 5) {
        $csv_parts[] = '""';
        $csv_parts[] = '0';
        $top_mem_processes[] = null;
    }
    
    // Add network stats
    $csv_parts[] = $net_stats['bytes_received'];
    $csv_parts[] = $net_stats['bytes_transmitted'];
    
    // Create CSV line
    $csv_line = implode(',', $csv_parts) . "\n";
    
    // Create header if file doesn't exist
    if (!file_exists($csv_file)) {
        $header_parts = [
            "timestamp", 
            "total_time", 
            "load_1m_per_core",
            "load_5m_per_core",
            "load_15m_per_core",
            "free_memory",
            "mem_usage_percent"
        ];
        
        // Add headers for top 5 CPU processes
        for ($i = 1; $i <= 5; $i++) {
            $header_parts[] = "cpu_command_${i}";
            $header_parts[] = "cpu_usage_${i}";
        }
        
        // Add headers for top 5 memory processes
        for ($i = 1; $i <= 5; $i++) {
            $header_parts[] = "mem_command_${i}";
            $header_parts[] = "mem_usage_${i}";
        }
        
        // Add network headers
        $header_parts[] = "bytes_received";
        $header_parts[] = "bytes_transmitted";
        
        $header = implode(',', $header_parts) . "\n";
        file_put_contents($csv_file, $header);
    }
    
    // Append data
    file_put_contents($csv_file, $csv_line, FILE_APPEND);
}


// Get all system information
$cpuInfo = getCpuLoad();
$memInfo = getMemoryInfo();
$topProcesses = getTopProcesses();
$networkStats = getNetworkStats();
// Output the information
 

echo "=== System Resource Monitor ===\n\n";

echo "CPU Information:\n";
echo "Number of CPU cores: {$cpuInfo['cores']}\n\n";

echo "CPU Load:\n";
echo "1 minute:  {$cpuInfo['loads']['1min']} (Per core: " . number_format($cpuInfo['per_core']['1min'], 2) . ")\n";
echo "5 minutes: {$cpuInfo['loads']['5min']} (Per core: " . number_format($cpuInfo['per_core']['5min'], 2) . ")\n";
echo "15 minutes: {$cpuInfo['loads']['15min']} (Per core: " . number_format($cpuInfo['per_core']['15min'], 2) . ")\n\n";

echo "Memory Usage:\n";
echo "Total Memory: {$memInfo['total']}\n";
echo "Used Memory: {$memInfo['used']}\n";
echo "Free Memory: {$memInfo['free']}\n";
echo "Memory Usage: {$memInfo['percentage_used']}%\n\n";

echo "Top CPU-Intensive Processes:\n";
echo $topProcesses['cpu'] . "\n\n";

echo "Top Memory-Intensive Processes:\n";
echo $topProcesses['memory'] . "\n";

echo "Network Statistics:\n";
foreach ($networkStats as $interface => $stats) {
    echo "Interface: $interface\n";
    echo "  Received: {$stats['bytes_received']} ({$stats['packets_received']} packets)\n";
    echo "  Transmitted: {$stats['bytes_transmitted']} ({$stats['packets_transmitted']} packets)\n";
}

logToCSV($cpuInfo, $memInfo, $topProcesses, $networkStats, $total_time);

?>