using System.Text;
using MassTransit.Mediator;
using Microsoft.Extensions.Logging;
using NetCoreServer;
using Server.Packets;

namespace Server;

public class AuthSession : TcpSession
{
    private readonly IMediator _mediator;
    private readonly ILogger<AuthSession> _logger;

    public AuthSession(TcpServer
        server, IMediator mediator, ILogger<AuthSession> logger) : base(server)
    {
        _mediator = mediator;
        _logger = logger;
    }

    protected override void OnReceived(byte[] buffer, long offset, long size)
    {
        Console.WriteLine($"Length: {size} & offset: {offset}");
        Span<byte> decryptedBuffer = new byte[size];

        // xor every value after the first 8 bytes
        var dataBuffer = Decrypt(new ArraySegment<byte>(buffer, 8, (int)size - 8).ToArray());

        Console.WriteLine("Length " + BitConverter.ToUInt16(buffer, 0));
        var opCode = BitConverter.ToUInt16(buffer.ToArray(), 2);
        Console.WriteLine("Packet Op Code: " + opCode);
        Console.WriteLine("Some Value: " + buffer[4]);
        var clientAliveTime = BitConverter.ToUInt16(buffer.ToArray(), 5);
        Console.WriteLine("Client Alive time: " + clientAliveTime);
        Console.WriteLine("Might be a flag:" + buffer[7]);

        Console.WriteLine("Full buffer: " + Encoding.ASCII.GetString(dataBuffer.ToArray()));

        RawPacket rawPacket = new RawPacket((OperationCode)opCode, dataBuffer, clientAliveTime, buffer[0],
            buffer[3],
            Id, this);
        Parallel.Invoke(() => _mediator.Send(rawPacket));
        _logger.LogInformation("Connection from: {@RemoteEndpoint}", Socket.RemoteEndPoint?.ToString());
        base.OnReceived(decryptedBuffer.ToArray(), offset, decryptedBuffer.Length);
    }

    private byte[] Decrypt(byte[] buffer)
    {
        for (int i = 0; i < buffer.Length; ++i)
        {
            buffer[i] = (byte)(buffer[i] ^ i ^ (3 * (0xFE - i)));
        }

        return buffer;
    }
}