using System;
using System.IO;
using System.Text;

namespace StandardScene.MagCarSimulator
{
    /// <summary>
    /// 模拟器日志：UI 回调 + 写入 exe 旁 <c>log/</c> 目录。
    /// </summary>
    public static class MagCarSimLog
    {
        private static readonly object SyncRoot = new object();
        private static StreamWriter _writer;
        private static bool _enabled = true;
        private static string _logDirectory;

        public static event Action<string> MessageWritten;

        public static string CurrentFilePath { get; private set; }

        public static void Configure(MagCarSimConfig config)
        {
            lock (SyncRoot)
            {
                _enabled = config == null || config.EnableFileLog;
                _logDirectory = ResolveLogDirectory(config?.LogDirectory);
                if (_enabled)
                {
                    EnsureWriterUnlocked();
                }
                else
                {
                    CloseWriterUnlocked();
                }
            }
        }

        public static string GetLogDirectory()
        {
            return _logDirectory ?? ResolveLogDirectory("log");
        }

        public static void WriteLine(string message)
        {
            if (string.IsNullOrEmpty(message))
            {
                return;
            }

            MessageWritten?.Invoke(message);

            if (!_enabled)
            {
                return;
            }

            lock (SyncRoot)
            {
                EnsureWriterUnlocked();
                _writer?.WriteLine(message);
            }
        }

        public static void Shutdown()
        {
            lock (SyncRoot)
            {
                if (_writer != null)
                {
                    try
                    {
                        _writer.WriteLine($"===== 会话结束 {DateTime.Now:yyyy-MM-dd HH:mm:ss} =====");
                    }
                    catch
                    {
                    }
                }

                CloseWriterUnlocked();
            }
        }

        private static void EnsureWriterUnlocked()
        {
            if (!_enabled)
            {
                return;
            }

            if (_writer != null)
            {
                return;
            }

            Directory.CreateDirectory(GetLogDirectory());
            var fileName = $"magcar-sim_{DateTime.Now:yyyyMMdd}.log";
            CurrentFilePath = Path.Combine(GetLogDirectory(), fileName);
            _writer = new StreamWriter(CurrentFilePath, true, new UTF8Encoding(encoderShouldEmitUTF8Identifier: false))
            {
                AutoFlush = true
            };
            _writer.WriteLine($"[{DateTime.Now:HH:mm:ss}] 文件日志已启用: {CurrentFilePath}");
        }

        private static void CloseWriterUnlocked()
        {
            try
            {
                _writer?.Flush();
                _writer?.Dispose();
            }
            catch
            {
            }

            _writer = null;
        }

        private static string ResolveLogDirectory(string configuredPath)
        {
            if (string.IsNullOrWhiteSpace(configuredPath))
            {
                return Path.Combine(AppContext.BaseDirectory, "log");
            }

            return Path.IsPathRooted(configuredPath)
                ? configuredPath
                : Path.Combine(AppContext.BaseDirectory, configuredPath);
        }
    }
}
