namespace Oculus.Platform
{
  using System;
  using System.Runtime.InteropServices;

  public sealed class Packet : IDisposable
  {
    private readonly ulong size;
    private readonly IntPtr packetHandle;

    public Packet(IntPtr packetHandle)
    {
      this.packetHandle = packetHandle;
      size = (ulong) CAPI.ovr_Packet_GetSize(packetHandle);
    }

    /**
     * Copies all the bytes in the payload into byte[] destination.  ex:
     *   Package package ...
     *   byte[] destination = new byte[package.Size];
     *   package.ReadBytes(destination);
     */
    public ulong ReadBytes(byte[] destination)
    {
      if ((ulong) destination.LongLength < size)
      {
        throw new System.ArgumentException(String.Format("Destination array was not big enough to hold {0} bytes", size));
      }
      Marshal.Copy(CAPI.ovr_Packet_GetBytes(packetHandle), destination, 0, (int) size);
      return size;
    }

    public UInt64 SenderID
    {
      get { return CAPI.ovr_Packet_GetSenderID(packetHandle); }
    }

    public ulong Size
    {
      get { return size; }
    }

    #region IDisposable

    ~Packet()
    {
      Dispose();
    }

    public void Dispose()
    {
      CAPI.ovr_Packet_Free(packetHandle);
      GC.SuppressFinalize(this);
    }

    #endregion
  }
}
