#region Using Statements
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ANX.Framework.NonXNA;
using ANX.Framework.Graphics;
using ANX.Framework.NonXNA.RenderSystem;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;

#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 RenderTarget2D : Texture2D, IDynamicGraphicsResource
    {
        public event EventHandler<EventArgs> ContentLost;

        #region Private Members
        private DepthFormat depthStencilFormat;
        private int multiSampleCount;
        private RenderTargetUsage usage;
        private bool isContentLost;
        private INativeRenderTarget2D nativeRenderTarget;

        #endregion // Private Members

        #region Constructors
        public RenderTarget2D(GraphicsDevice graphicsDevice, int width, int height)
            : base(graphicsDevice)
        {
            this.width = width;
            this.height = height;

            base.levelCount = 1;
            base.format = SurfaceFormat.Color;

            this.depthStencilFormat = DepthFormat.None;
            this.multiSampleCount = 0;
            this.usage = RenderTargetUsage.DiscardContents;

            this.nativeRenderTarget = AddInSystemFactory.Instance.GetDefaultCreator<IRenderSystemCreator>().CreateRenderTarget(graphicsDevice, width, height, false, SurfaceFormat.Color, this.depthStencilFormat, this.multiSampleCount, this.usage);
            base.nativeTexture = this.nativeRenderTarget as INativeTexture2D;
        }

				public RenderTarget2D(GraphicsDevice graphicsDevice, int width, int height, [MarshalAsAttribute(UnmanagedType.U1)] bool mipMap, SurfaceFormat preferredFormat, DepthFormat preferredDepthFormat)
            : base(graphicsDevice)
        {
            this.depthStencilFormat = DepthFormat.None;
            this.multiSampleCount = 0;
            this.usage = RenderTargetUsage.DiscardContents;

            this.nativeRenderTarget = AddInSystemFactory.Instance.GetDefaultCreator<IRenderSystemCreator>().CreateRenderTarget(graphicsDevice, width, height, false, SurfaceFormat.Color, this.depthStencilFormat, this.multiSampleCount, this.usage);
            base.nativeTexture = this.nativeRenderTarget as INativeTexture2D;
        }

				public RenderTarget2D(GraphicsDevice graphicsDevice, int width, int height, [MarshalAsAttribute(UnmanagedType.U1)]  bool mipMap, SurfaceFormat preferredFormat, DepthFormat preferredDepthFormat, int preferredMultiSampleCount, RenderTargetUsage usage)
            : base(graphicsDevice)
        {
            this.depthStencilFormat = preferredDepthFormat;
            this.multiSampleCount = preferredMultiSampleCount;
            this.usage = usage;

            this.nativeRenderTarget = AddInSystemFactory.Instance.GetDefaultCreator<IRenderSystemCreator>().CreateRenderTarget(graphicsDevice, width, height, false, SurfaceFormat.Color, this.depthStencilFormat, this.multiSampleCount, this.usage);
            base.nativeTexture = this.nativeRenderTarget as INativeTexture2D;
        }

        #endregion // Constructors

        protected override void Dispose([MarshalAs(UnmanagedType.U1)] bool disposeManaged)
        {
            throw new NotImplementedException();
        }

        internal INativeRenderTarget2D NativeRenderTarget
        {
            get
            {
                return this.nativeRenderTarget;
            }
        }

        public DepthFormat DepthStencilFormat
        {
            get
            {
                return this.depthStencilFormat;
            }
        }

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

        public int MultiSampleCount
        {
            get
            {
                return this.multiSampleCount;
            }
        }

        public RenderTargetUsage RenderTargetUsage
        {
            get
            {
                return this.usage;
            }
        }

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

            throw new NotImplementedException();
        }

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