using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Management;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;

namespace MeterVision.Util
{
    public class RegistrationHelper
    {
        // 生成机器码
        public static string GenerateMachineCode()
        {
            // 获取硬件信息
            //string hddSerial = GetHDDSerial();
            string cpuId = GetCPUId();
            //string macAddress = GetMACAddress();

            // 组合硬件信息并生成哈希
            using (SHA256 sha256 = SHA256.Create())
            {
                //byte[] hashBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(hddSerial + cpuId + macAddress));
                byte[] hashBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(cpuId));
                return Convert.ToBase64String(hashBytes);
            }
        }


        // 生成注册码（使用私钥签名）
        //public static string GenerateRegistrationCode(string machineCode, DateTime expirationDate, RSA privateKey)
        //{
        //    // 将机器码和有效期组合成明文
        //    string plainText = $"{machineCode}|{expirationDate:yyyy-MM-dd}";

        //    // 使用私钥对明文进行签名
        //    byte[] dataToSign = Encoding.UTF8.GetBytes(plainText);
        //    byte[] signature = privateKey.SignData(dataToSign, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);

        //    // 将签名和明文组合成注册码
        //    return Convert.ToBase64String(signature) + "|" + plainText;
        //}

        public static bool ValidateRegistrationCode(string registrationCode, RSA publicKey, out DateTime expirationDate)
        {
            try
            {
                string[] parts = registrationCode.Split('|');
                byte[] signature = Convert.FromBase64String(parts[0]);
                string plainText = parts[1];

                // 验证签名
                byte[] dataToVerify = Encoding.UTF8.GetBytes(plainText);
                bool isValid = publicKey.VerifyData(dataToVerify, signature, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);

                if (isValid)
                {
                    string[] dataParts = plainText.Split('|');
                    string machineCode = dataParts[0];
                    expirationDate = DateTime.Parse(dataParts[1]);

                    // 验证机器码是否匹配
                    if (machineCode == GenerateMachineCode())
                    {
                        // 验证有效期
                        if (DateTime.Now <= expirationDate)
                        {
                            return true;
                        }
                    }
                }
            }
            catch
            {
                // 捕获任何异常，表示验证失败
            }

            expirationDate = DateTime.MinValue;
            return false;
        }


        // 获取硬盘序列号
        private static string GetHDDSerial()
        {
            // 实现获取硬盘序列号的逻辑
            return "HDD_SERIAL_12345";
        }


        // 获取MAC地址
        private static string GetMACAddress()
        {
            // 实现获取MAC地址的逻辑
            return "00-1A-2B-3C-4D-5E";
        }

        public static string GetCPUId()
        {
            try
            {
                // 查询CPU的ProcessorId
                using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Processor"))
                {
                    foreach (ManagementObject cpu in searcher.Get())
                    {
                        if (cpu["ProcessorId"] != null)
                        {
                            return cpu["ProcessorId"].ToString().Trim();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("获取CPU ID时出错: " + ex.Message);
            }

            //return "无法获取CPU ID";
            return "CPU_ID_ABCDEF";
        }


        //private string GetMachineCode()
        //{
        //    string cpuId = string.Empty;
        //    using (var searcher = new ManagementObjectSearcher("SELECT ProcessorId FROM Win32_Processor"))
        //    {
        //        foreach (ManagementObject obj in searcher.Get())
        //        {
        //            if (!string.IsNullOrEmpty(cpuId)) break; // 只取第一个CPU ID
        //            cpuId = obj["ProcessorId"]?.ToString();
        //        }
        //    }

        //    string diskSerial = string.Empty;
        //    using (var searcher = new ManagementObjectSearcher("SELECT VolumeSerialNumber FROM Win32_LogicalDisk WHERE DeviceID='C:'"))
        //    {
        //        foreach (ManagementObject obj in searcher.Get())
        //        {
        //            diskSerial = obj["VolumeSerialNumber"]?.ToString();
        //            break; // C盘的序列号
        //        }
        //    }

        //    return $"{cpuId}{diskSerial}";
        //}
        //------------------------------------------------------
    }
}
