using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using Serilog.Core;
using Serilog.Events;
using Serilog.Formatting;


namespace Admin.Core.Serilog.Es
{
    public class UDPSink : ILogEventSink, IDisposable
    {
        private Socket _socket = new Socket(SocketType.Dgram, ProtocolType.Udp);
        private readonly ITextFormatter _formatter;

        public UDPSink(IPAddress ipAddress, int port, ITextFormatter formatter)
        {
            _socket.Connect(ipAddress, port);
            _formatter = formatter;
        }

        public void Emit(LogEvent logEvent)
        {
            var sb = new StringBuilder();

            using (var sw = new StringWriter(sb))
                _formatter.Format(logEvent, sw);

            sb.Replace("RenderedMessage", "message");

            _socket.Send(Encoding.UTF8.GetBytes(sb.ToString()));
        }

        public void Dispose()
        {
            _socket?.Dispose();
            _socket = null;
        }
    }
}