using System.IO;

namespace MossyUpdater.Services
{
    public class FileLogger : ILogger
    {
        private readonly string _logPath;
        private readonly SemaphoreSlim _semaphore = new(1, 1);

        public FileLogger()
        {
            var appDataPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
            var appFolder = Path.Combine(appDataPath, "MossyUpdater");
            Directory.CreateDirectory(appFolder);
            _logPath = Path.Combine(appFolder, "log.txt");
        }

        public async Task LogInfoAsync(string message)
        {
            await WriteLogAsync(LogLevel.Info, message);
        }

        public async Task LogWarningAsync(string message)
        {
            await WriteLogAsync(LogLevel.Warning, message);
        }

        public async Task LogErrorAsync(string message, Exception? exception = null)
        {
            var fullMessage = exception != null ? $"{message} - Exception: {exception}" : message;
            await WriteLogAsync(LogLevel.Error, fullMessage);
        }

        private async Task WriteLogAsync(LogLevel level, string message)
        {
            await _semaphore.WaitAsync();
            try
            {
                var timestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                var logEntry = $"[{timestamp}] [{level}] {message}{Environment.NewLine}";
                await File.AppendAllTextAsync(_logPath, logEntry);
            }
            catch
            {
            }
            finally
            {
                _semaphore.Release();
            }
        }
    }
}