#region Using Statements
using System;

#endregion // Using Statements

// This file is part of the ANX.Framework created by the
// "ANX.Framework developer group" and released under the Ms-PL license.
// For details see: http://anxframework.codeplex.com/license

namespace ANX.Framework.Graphics
{
    public class DynamicVertexBuffer : VertexBuffer, IDynamicGraphicsResource
    {
        public virtual event EventHandler<EventArgs> ContentLost;

        #region Private Members
        private bool isContentLost;

        #endregion

        public DynamicVertexBuffer(GraphicsDevice graphicsDevice, Type vertexType, int vertexCount, BufferUsage usage)
            : base(graphicsDevice, vertexType, vertexCount, usage)
        {
            graphicsDevice.DeviceReset += new EventHandler<EventArgs>(graphicsDevice_DeviceReset);
        }

        public DynamicVertexBuffer(GraphicsDevice graphicsDevice, VertexDeclaration vertexDeclaration, int vertexCount, BufferUsage usage)
            : base(graphicsDevice, vertexDeclaration, vertexCount, usage)
        {
            graphicsDevice.DeviceReset += new EventHandler<EventArgs>(graphicsDevice_DeviceReset);
        }

        ~DynamicVertexBuffer()
        {
            base.GraphicsDevice.DeviceReset -= graphicsDevice_DeviceReset;
        }

        private void graphicsDevice_DeviceReset(object sender, EventArgs e)
        {
            SetContentLost(true);
        }

        public void SetData<T>(int offsetInBytes, T[] data, int startIndex, int elementCount, int vertexStride, SetDataOptions options) where T : struct
        {
            //TODO: SetDataOptions not used
            base.SetData<T>(offsetInBytes, data, startIndex, elementCount, vertexStride);
        }

        public void SetData<T>(T[] data, int startIndex, int elementCount, SetDataOptions options) where T : struct
        {
            //TODO: SetDataOptions not used
            base.SetData<T>(data, startIndex, elementCount);
        }

        public bool IsContentLost
        {
            get
            {
                return this.isContentLost;
            }
        }

        public void SetContentLost(bool isContentLost)
        {
            this.isContentLost = isContentLost;
            if (isContentLost)
            {
                raise_ContentLost(this, EventArgs.Empty);
            }
        }

        protected void raise_ContentLost(object sender, EventArgs args)
        {
            if (ContentLost != null)
            {
                ContentLost(sender, args);
            }
        }

    }
}