/*
 * <copyright>
        Company="公司"
        2020-2025
        Author=JCH
        Path=XiaoZhiSharp_ConsoleApp.Core.TickTimer.cs
 * <copyright>
 * --------------------------------------------------------------
 * 机器名称：JCH
 * 文件名：TickTimer.cs
 * 版本号：V1.0.0.0
 * 创建人：JCH
 * 创建时间：2025/9/25 17:37:10
 * 描述：
 * --------------------------------------------------------------
 * 修改时间：2025/9/25 17:37:10
 * 修改人：JCH
 * 版本号：V1.0.0.0
 * 描述：
 * --------------------------------------------------------------
 */

using Newtonsoft.Json.Linq;
using XiaoZhiSharp;
using XiaoZhiSharp.Kernels;
using XiaoZhiSharp.Utils;

namespace XiaoZhiSharp_ConsoleApp.Core
{
    public class TickTimer
    {
        #region Singleton
        private static volatile TickTimer instance;
        private static readonly object syncRoot = new object();
        private TickTimer()
        {

        }
        public static TickTimer TT
        {
            get
            {
                if (instance == null)
                {
                    lock (syncRoot)
                    {
                        if (instance == null)
                        {
                            instance = new TickTimer();
                        }
                    }
                }

                return instance;
            }
        }

        #endregion Singleton

        #region Properties
        public PushTimer PushTimer { get { return PushFactory.Push.PushTimer; } }

        #endregion Properties

        private XiaoZhiAgent _agent;
        private SystemMonitor monitor = new SystemMonitor();
        public void RunTimer(XiaoZhiAgent agent)
        {
            _agent = agent;
            string appsettingJson = File.ReadAllText(Path.Combine(Environment.CurrentDirectory, "Configs", "AppSettingConfig.json"));
            // 快速从json文件中获取配置信息
            var appsetting = Newtonsoft.Json.JsonConvert.DeserializeObject<JObject>(appsettingJson);
            var pushTimerIntervalStr = appsetting?["App"]?["UploadSysInfoInterval"]?.ToString();
            int pushTimerInterval = 1000; // 默认值1秒钟
            if (int.TryParse(pushTimerIntervalStr, out pushTimerInterval))
            {
                PushTimer.PushTimerInterval = pushTimerInterval;
            }
            PushTimer.OnPushTimer += OnSystemMessagePushTickTimer;
            PushTimer.IsPushTimer = true;
        }

        private void OnSystemMessagePushTickTimer(object? sender, EventArgs e)
        {
            try
            {
                var sessionId = string.Empty;
                if (_agent.ConnectState != System.Net.WebSockets.WebSocketState.Open)
                {
                    #region 操作系统资源使用情况
                    var hardwareInfo = XiaoZhiSharp.Global.HardwareInfo;
                    hardwareInfo.RefreshCPUList(includePercentProcessorTime: true);
                    hardwareInfo.RefreshVideoControllerList();
                    hardwareInfo.RefreshMemoryStatus();
                    hardwareInfo.RefreshDriveList();

                    foreach (var cpuItem in hardwareInfo.CpuList)
                    {
                        //Console.WriteLine(cpuItem);

                        foreach (var cpuCore in cpuItem.CpuCoreList)
                        {
                            //Console.WriteLine(cpuCore);
                        }
                    }
                    var cpu = hardwareInfo.CpuList.Count > 0 ? hardwareInfo.CpuList.First().PercentProcessorTime : 0;
                    /*-----------------*/
                    foreach (var hardware in hardwareInfo.VideoControllerList)
                    {
                        //Console.WriteLine(hardware);
                    }
                    var gpu = 0d;//XiaoZhiSharp.Global.FormatBytes(hardwareInfo.VideoControllerList.Last().AdapterRAM);

                    var gpuInfo = monitor.GetHardwareInfo();
                    gpu = gpuInfo.GpuUsage;
                    /*-----------------*/
                    //Console.WriteLine(hardwareInfo.MemoryStatus);
                    double memory = ((double)hardwareInfo.MemoryStatus.TotalPhysical - hardwareInfo.MemoryStatus.AvailablePhysical) / hardwareInfo.MemoryStatus.TotalPhysical * 100;
                    /*-----------------*/
                    double totalDisk = 0;
                    double usedDisk = 0;
                    foreach (var drive in hardwareInfo.DriveList)
                    {
                        //Console.WriteLine(drive);

                        foreach (var partition in drive.PartitionList.Where(p => p.PrimaryPartition))
                        {
                            //Console.WriteLine(partition);

                            foreach (var volume in partition.VolumeList)
                            {
                                //Console.WriteLine(volume);

                                totalDisk += volume.Size;
                                usedDisk += (volume.Size - volume.FreeSpace);
                            }
                        }
                    }
                    var disk = usedDisk / totalDisk * 100;
                    var os = new XiaoZhiSharp.Models.OSModel
                    {
                        CPU = cpu,
                        GPU = gpu,
                        Memory = memory,
                        Disk = disk
                    };
                    #endregion 操作系统资源使用情况
                    #region GPS定位信息
                    var timestamp = DateTime.Now;
                    var gps = new XiaoZhiSharp.Models.GPSModel
                    {
                        Year = timestamp.Year,
                        Month = timestamp.Month,
                        Day = timestamp.Day,
                        Hour = timestamp.Hour,
                        Minute = timestamp.Minute,
                        Second = timestamp.Second,
                        Longitude = 0,
                        Latitude = 0,
                        Altitude = 0,
                        Speed = 0,
                        Heading = 0,
                        //Course = 0,
                        //CrabAngle = 0,
                        GPSSatellitesInView = 0,
                        GPSSatellitesUsed = 0,
                        BDSatellitesInView = 0,
                        BDSatellitesUsed = 0,
                        PDOP = 0,
                        HDOP = 0,
                        VDOP = 0,
                        //TDOP = 0
                    };
                    string appsettingJson = File.ReadAllText(Path.Combine(Environment.CurrentDirectory, "Configs", "AppSettingConfig.json"));
                    // 快速从json文件中获取配置信息
                    var appsetting = Newtonsoft.Json.JsonConvert.DeserializeObject<JObject>(appsettingJson);
                    var gpsDataFilePath = appsetting?["App"]?["GPSDataFilePath"]?.ToString();
                    if (!string.IsNullOrEmpty(gpsDataFilePath) && File.Exists(gpsDataFilePath))
                    {
                        var gpsDataJson = File.ReadAllText(gpsDataFilePath);
                        gps = Newtonsoft.Json.JsonConvert.DeserializeObject<XiaoZhiSharp.Models.GPSModel>(gpsDataJson);
                    }
                    else
                    {
                        LogConsole.Warning("GPS数据文件路径无效或文件不存在，无法获取GPS定位信息");
#if DEBUG
                        gpsDataFilePath = Path.Combine(Environment.CurrentDirectory, "Configs", "gpsdata.json");
                        var gpsDataJson = File.ReadAllText(gpsDataFilePath);
                        gps = Newtonsoft.Json.JsonConvert.DeserializeObject<XiaoZhiSharp.Models.GPSModel>(gpsDataJson);
#endif
                    }
                    #endregion GPS定位信息

                    #region /* --采用 Newtonsoft.Json.Linq 构建 JSON 对象--*/
                    /*
                    JObject jsonObj = new JObject
                    {
                        ["session_id"] = sessionId,
                        ["type"] = "msgpush",
                        ["OS"] = new JObject
                        {
                            ["CPU"] = cpu,
                            ["GPU"] = gpu,
                            ["Memory"] = memory,
                            ["Disk"] = disk
                        },
                        ["GPS"] = new JObject
                        {
                            ["DateTime"] = cpu,
                            ["GPU"] = gpu,
                            ["Memory"] = memory,
                            ["Disk"] = disk
                        }
                    };*/
                    #endregion /* --采用 Newtonsoft.Json.Linq 构建 JSON 对象--*/
                    var jsonObj = new XiaoZhiSharp.Models.MsgPushModel
                    {
                        SessionId = sessionId,
                        Type = "msgpush",
                        OS = os,
                        GPS = gps
                    };

                    string msg = Newtonsoft.Json.JsonConvert.SerializeObject(jsonObj);
                    LogConsole.InfoLine(msg);

                    this._agent.ChatMessage(msg);
                }
            }
            catch (Exception ex)
            {
                LogConsole.Warning(ex.Message);
            }
        }
    }
}
