namespace AscNet.Logging
{
    public class ThreadSafeStreamWriter : IDisposable
    {
        private static ThreadSafeStreamWriter? _instance;

        private static StreamWriter _writer;

        private bool disposedValue;

        // TODO: add support for configuring
        private string _logFilePath = "log.log";

        private object _lock = new object();

        private ThreadSafeStreamWriter()
        {
            _writer = new StreamWriter(_logFilePath, true);
#if !RELEASE
            _writer.AutoFlush = true;
#endif
        }

        public static ThreadSafeStreamWriter Instance
        {
            get
            {
                return _instance ??= new ThreadSafeStreamWriter();
            }
        }

        public void AppendLine(string line)
        {
            lock (_lock)
            {
                _writer.WriteLine(line);
            }
        }

        protected virtual void Dispose(bool disposing)
        {
            if (!disposedValue)
            {
                if (disposing)
                {
                    _writer.Flush();
                    _writer.Close();
                    _writer.Dispose();
                }
                disposedValue = true;
            }
        }

        public void Dispose()
        {
            Dispose(disposing: true);
            GC.SuppressFinalize(this);
        }
    }
}
