using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
using System.IO;
using System.Text;

namespace WebApi
{
    internal static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            // 设置全局异常处理
            SetupGlobalExceptionHandling();
            
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainView());
        }

        /// <summary>
        /// 设置全局异常处理
        /// </summary>
        private static void SetupGlobalExceptionHandling()
        {
            // 设置异常处理模式，让程序继续运行而不是崩溃
            Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
            
            // 处理UI线程异常
            Application.ThreadException += Application_ThreadException;
            
            // 处理非UI线程异常
            AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
        }

        /// <summary>
        /// 处理UI线程异常
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
        {
            try
            {
                string errorMessage = GetExceptionDetails(e.Exception);
                
                // 记录异常日志
                LogException(errorMessage, "UI线程异常");
                
                // 显示友好的错误提示
                MessageBox.Show(
                    $"程序遇到错误，但已自动处理，程序将继续运行。\n\n错误信息：{e.Exception.Message}\n\n详细信息已记录到日志文件中。",
                    "程序错误",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Warning
                );
            }
            catch (Exception ex)
            {
                // 如果异常处理本身出错，至少尝试显示基本信息
                MessageBox.Show($"程序遇到严重错误：{ex.Message}", "严重错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        /// <summary>
        /// 处理非UI线程异常
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            try
            {
                Exception exception = e.ExceptionObject as Exception;
                if (exception != null)
                {
                    string errorMessage = GetExceptionDetails(exception);
                    
                    // 记录异常日志
                    LogException(errorMessage, "非UI线程异常");
                    
                    // 如果是终止性异常，显示更严重的提示
                    if (e.IsTerminating)
                    {
                        MessageBox.Show(
                            $"程序遇到严重错误，可能需要重启。\n\n错误信息：{exception.Message}\n\n详细信息已记录到日志文件中。",
                            "严重错误",
                            MessageBoxButtons.OK,
                            MessageBoxIcon.Error
                        );
                    }
                }
            }
            catch (Exception ex)
            {
                // 最后的保险措施
                MessageBox.Show($"程序遇到无法处理的错误：{ex.Message}", "致命错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        /// <summary>
        /// 获取异常详细信息
        /// </summary>
        /// <param name="exception"></param>
        /// <returns></returns>
        private static string GetExceptionDetails(Exception exception)
        {
            StringBuilder sb = new StringBuilder();
            sb.AppendLine($"异常时间：{DateTime.Now:yyyy-MM-dd HH:mm:ss}");
            sb.AppendLine($"异常类型：{exception.GetType().Name}");
            sb.AppendLine($"异常消息：{exception.Message}");
            sb.AppendLine($"异常堆栈：{exception.StackTrace}");
            
            if (exception.InnerException != null)
            {
                sb.AppendLine("内部异常：");
                sb.AppendLine(GetExceptionDetails(exception.InnerException));
            }
            
            return sb.ToString();
        }

        /// <summary>
        /// 记录异常日志
        /// </summary>
        /// <param name="errorMessage"></param>
        /// <param name="exceptionType"></param>
        private static void LogException(string errorMessage, string exceptionType)
        {
            try
            {
                string logDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Logs");
                if (!Directory.Exists(logDir))
                {
                    Directory.CreateDirectory(logDir);
                }

                string logFile = Path.Combine(logDir, $"Exception_{DateTime.Now:yyyy-MM-dd}.log");
                
                StringBuilder logContent = new StringBuilder();
                logContent.AppendLine($"==================== {exceptionType} ====================");
                logContent.AppendLine(errorMessage);
                logContent.AppendLine(new string('=', 50));
                logContent.AppendLine();

                File.AppendAllText(logFile, logContent.ToString(), Encoding.UTF8);
            }
            catch
            {
                // 如果日志记录失败，也不要抛出异常
            }
        }
    }
}
