#!/usr/bin/perl
use strict;
use warnings;

# Detect OS
my $os = `uname`;
chomp($os);

# Function to print section header
sub print_header {
    my ($title) = @_;
    print "\n=== $title ===\n";
}

# OS-specific commands
my $uptime_cmd = ($os eq 'Darwin') ? 'uptime' : 'uptime -p';
my $cpu_cmd = ($os eq 'Darwin') ? 'sysctl -n machdep.cpu.brand_string' : 'lscpu | grep "Model name" | cut -d ":" -f2';
my $meminfo_cmd = ($os eq 'Darwin') ? 'sysctl -a | grep vm.stats | grep free' : 'free -h';
my $disk_cmd = ($os eq 'Darwin') ? 'df -h' : 'df -h | grep -v "tmpfs"';
my $network_cmd = ($os eq 'Darwin') ? 'ifconfig | grep -A 1 "inet " | grep 127.0.0.1 -v' : 'ip a | grep -E "inet|inet6" | grep -v "127.0.0.1"';
my $loadavg_cmd = 'cat /proc/loadavg 2>/dev/null || uptime';
my $os_version_cmd = ($os eq 'Darwin') ? 'sw_vers' : 'cat /etc/os-release';

# Print report header
print "=== System Information Report ===\nHostname: $(hostname)\nOS: $os\nGenerated at: $(date)\\n\n";

# OS Version
print_header("OS Version");
my $os_version = `$os_version_cmd`;
print "$os_version";

# Uptime
print_header("Uptime");
my $uptime = `$uptime_cmd`;
print "$uptime";

# CPU Info
print_header("CPU");
my $cpu = `$cpu_cmd`;
$cpu =~ s/\s+$//g;
print "$cpu\n";

# Memory
print_header("Memory");
my $meminfo = `$meminfo_cmd`;
$meminfo =~ s/\s+$//g;
print "$meminfo";

# Disk Usage
print_header("Disk Usage");
my $disk = `$disk_cmd`;
print "$disk";

# Network
print_header("Network Interfaces");
my $network = `$network_cmd`;
print "$network";

# System Load
print_header("System Load");
my $loadavg = `$loadavg_cmd`;
print "$loadavg";

# Kernel and Boot Info
print_header("Kernel and Boot Info");
my $kernel = `uname -a`;
$kernel =~ s/\s+$//g;
print "Kernel: $kernel\n";

if ($os ne 'Darwin') {
    my $boot = `cat /proc/version`;
    print "Boot: $boot\n";
}

print "\n=== Report End ===\n";