using System.Runtime.CompilerServices;
using MemoryPack;

namespace Phantom.Common.Messages.ToServer;

[MemoryPackable]
public sealed partial record SimpleReplyMessage(
	[property: MemoryPackOrder(0)] uint SequenceId,
	[property: MemoryPackOrder(1)] int EnumValue
) : IMessageToServer {
	public static SimpleReplyMessage FromEnum<TEnum>(uint sequenceId, TEnum enumValue) where TEnum : Enum {
		if (Unsafe.SizeOf<TEnum>() != Unsafe.SizeOf<int>()) {
			throw new ArgumentException("Enum type " + typeof(TEnum).Name + " is not compatible with int.", nameof(TEnum));
		}

		return new SimpleReplyMessage(sequenceId, Unsafe.As<TEnum, int>(ref enumValue));
	}

	public Task Accept(IMessageToServerListener listener) {
		return listener.HandleSimpleReply(this);
	}
}