#region --- License ---
/* Licensed under the MIT/X11 license.
 * Copyright (c) 2006-2008 the OpenTK Team.
 * This notice may not be removed from any source distribution.
 * See license.txt for licensing detailed licensing details.
 */
#endregion

#region --- Using directives ---

using System;
using System.Drawing;
using System.Globalization;

#endregion

namespace OpenTK
{
    using OpenTK.Graphics;

    /// <summary>Defines the display mode for a render window.</summary>
    [Obsolete]
    public sealed class DisplayMode
    {
        #region --- Private Variables ---

        private int width, height;
        private ColorMode color_format, auxilliary_color_format;

        private int depthBits, stencilBits;

        private float refreshRate;
        private bool vsync;
        private bool fullscreen;
        private int buffers;
        private bool stereo;

        #endregion

        #region --- Constructors ---

        public DisplayMode(DisplayMode mode)
            : this(mode.width, mode.height, mode.color_format, mode.depthBits, mode.stencilBits, mode.auxilliary_color_format.BitsPerPixel,
                   mode.buffers, mode.fullscreen, mode.stereo, mode.vsync, mode.refreshRate) { }

        public DisplayMode() : this(640, 480) { }

        /// <summary>
        /// Constructs a new DisplayMode from the specified parameters.
        /// </summary>
        /// <param name="width">The Width of the DisplayMode, in pixels.</param>
        /// <param name="height">The Height of the DisplayMode, in pixels.</param>
        /// <param name="color">The ColorMode of the color buffer.</param>
        /// <param name="depth">The number of bits in the depth buffer.</param>
        /// <param name="stencil">The number of bits in the stencil buffer.</param>
        /// <param name="aux">The number of bits in the auxilliary buffer.</param>
        /// <param name="fullscreen">Set to true for a fullscreen DisplayMode.</param>
        /// <param name="stereo">Set to true for a DisplayMode with stereographic capabilities.</param>
        /// <param name="buffers">The number of render buffers. Typical values include one (single-), two (double-) or three (triple-buffering).</param>
        /// <param name="vsync">Set to true to sync the updates to the screen refresh rate.</param>
        /// <param name="refresh">The desired RefreshRate. Taken into account only for Fullscreen DisplayModes.</param>
        public DisplayMode(int width, int height, ColorMode color, int depth, int stencil, int aux, int buffers,
            bool fullscreen, bool stereo, bool vsync, float refresh)
        {
            this.Width = width;
            this.Height = height;
            this.Color = color;
            this.DepthBits = depth;
            this.StencilBits = stencil;
            this.AuxBits = aux;
            this.Buffers = buffers;
            this.Fullscreen = fullscreen;
            this.Stereo = stereo;
            this.Vsync = vsync;
            this.RefreshRate = refresh;
        }

        /// <summary>
        /// Constructs a new DisplayMode.
        /// </summary>
        /// <param name="width">The Width of the DisplayMode in pixels.</param>
        /// <param name="height">The Height of the DisplayMode in pixels.</param>
        public DisplayMode(int width, int height)
            : this(width, height, DisplayDevice.Default.BitsPerPixel, 16, 0, 0, 2, false, false, false, 0.0f)
        {
        }

        /// <summary>
        /// Constructs a new DisplayMode.
        /// </summary>
        /// <param name="width">The Width of the DisplayMode in pixels.</param>
        /// <param name="height">The Height of the DisplayMode in pixels.</param>
        /// <param name="color">The ColorMode of the color buffer.</param>
        public DisplayMode(int width, int height, ColorMode color)
            : this(width, height, color, 16, 0, 0, 2, false, false, false, 0.0f)
        {
        }

        /// <summary>
        /// Constructs a new DisplayMode.
        /// </summary>
        /// <param name="width">The Width of the DisplayMode in pixels.</param>
        /// <param name="height">The Height of the DisplayMode in pixels.</param>
        /// <param name="color">The ColorMode of the color buffer.</param>
        /// <param name="depth">The number of bits in the depth buffer.</param>
        public DisplayMode(int width, int height, ColorMode color, int depth)
            : this(width, height, color, depth, 0, 0, 2, false, false, false, 0.0f)
        {
        }

        /// <summary>
        /// Constructs a new DisplayMode.
        /// </summary>
        /// <param name="width">The Width of the DisplayMode in pixels.</param>
        /// <param name="height">The Height of the DisplayMode in pixels.</param>
        /// <param name="color">The ColorMode of the color buffer.</param>
        /// <param name="depth">The number of bits in the depth buffer.</param>
        /// <param name="fullscreen">True for a fullscreen DisplayMode, false otherwise.</param>
        public DisplayMode(int width, int height, ColorMode color, int depth, bool fullscreen)
            : this(width, height, color, depth, 0, 0, 2, fullscreen, false, false, 0.0f)
        {
        }

        #endregion

        #region --- Public Properties ---
#if false
        #region public int ColorDepth

        /// <summary>
        /// Gets an OpenTK.Graphics.ColorMode that describes the color format of this DisplayMode.
        /// </summary>
        public ColorMode ColorDepth
        {
            get { return color_format; }
            private set { color_format = value; }
        }

        #endregion

        #region public int AuxilliaryColorDepth

        /// <summary>
        /// Gets an OpenTK.Graphics.ColorMode that describes the color format of this DisplayMode.
        /// </summary>
        public ColorMode AuxilliaryColorDepth
        {
            get { return auxilliary_color_format; }
            private set { auxilliary_color_format = value; }
        }

        #endregion

        #region public int Depth

        /// <summary>
        /// Gets a System.Int32 that contains the bits per pixel for the depth buffer
        /// of this DisplayMode.
        /// </summary>
        public int Depth
        {
            get { return depthBits; }
            private set { depthBits = value; }
        }

        #endregion

        #region public int Stencil

        /// <summary>
        /// Gets a System.Int32 that contains the bits per pixel for the stencil buffer
        /// of this DisplayMode.
        /// </summary>
        public int Stencil
        {
            get { return stencilBits; }
            private set { stencilBits = value; }
        }

        #endregion
#endif
        #region Obsolete Properties

        #region public bool Stereo

        /// <summary>
        /// Gets a System.Boolean indicating whether this DisplayMode is stereoscopic.
        /// </summary>
        [Obsolete("Use GraphicsMode.Stereo instead.")]
        public bool Stereo
        {
            get { return this.stereo; }
            private set { this.stereo = value; }
        }

        #endregion

        #region public int Buffers

        /// <summary>
        /// Gets a System.Int32 containing the number of buffers associated with this
        /// DisplayMode.
        /// </summary>
        [Obsolete("Use GraphicsMode.Buffers instead.")]
        public int Buffers
        {
            get { return this.buffers; }
            private set { this.buffers = value; }
        }

        #endregion

        [Obsolete("Use GameWindow.Fullscreen instead.")]
        public bool Fullscreen
        {
            get { return this.fullscreen; }
            internal set { this.fullscreen = value; }
        }

        [Obsolete("Use GraphicsContext.VSync, GLControl.VSync or GameWindow.VSync instead.")]
        public bool Vsync
        {
            get { return this.vsync; }
            internal set { this.vsync = value; }
        }

        [Obsolete("Use OpenTK.Graphics.DisplayDevice.RefreshRate instead.")]
        public float RefreshRate
        {
            get { return this.refreshRate; }
            private set { this.refreshRate = value; }
        }

        #region public ColorFormat Color
        
        [Obsolete("Use GraphicsMode.Color instead.")]
        public ColorMode Color
        {
            get { return this.color_format; }
            internal set { this.color_format = value; }
        }

        #endregion

        #region public int Height

        /// <summary>
        /// Gets or sets the Height of the DisplayMode. Height is the vertical span measured in pixels.
        /// </summary>
        [Obsolete("Use GameWindow.Height or GLControl.Height instead.")]
        public int Height
        {
            get { return height; }
            set
            {
                if (value > 0 /* && (value < Screen[0].Height) */)
                {
                    height = value;
                }
            }
        }

        #endregion

        #region public int Width

        /// <summary>
        /// Gets or sets the Width of the DisplayMode. Width is the horizontal span measured in pixels.
        /// </summary>
        [Obsolete("Use GameWindow.Width or GLControl.Width instead.")]
        public int Width
        {
            get { return width; }
            set
            {
                if (value > 0)
                {
                    width = value;
                }
            }
        }

        #endregion

        [Obsolete("Use GraphicsMode.Depth instead.")]
        public int DepthBits
        {
            get { return this.depthBits; }
            internal set { this.depthBits = value; }
        }

        [Obsolete("Use GraphicsMode.Stencil instead.")]
        public int StencilBits
        {
            get { return this.stencilBits; }
            internal set { this.stencilBits = value; }
        }

        [Obsolete("Use GraphicsMode.AuxilliaryColorDepth instead.")]
        public int AuxBits
        {
            get { return this.auxilliary_color_format.BitsPerPixel; }
            internal set { this.auxilliary_color_format = value; }
        }

        #endregion

        #endregion

        internal GraphicsMode ToGraphicsMode()
        {
            return new GraphicsMode(this.Color.BitsPerPixel, this.DepthBits, this.StencilBits, 0, this.AuxBits, this.Buffers, this.Stereo);
        }

        #region --- Overrides ---

        /// <summary>
        /// Describes this DisplayMode instance.
        /// </summary>
        /// <returns>Returns a System.String that describes this DisplayMode instance.</returns>
        public override string ToString()
        {
            return string.Format("Display Mode: {0}, depth: {1}, stencil {2}, aux {3} refresh {4}Hz",
                Color.ToString(),
                DepthBits,
                StencilBits,
                AuxBits,
                RefreshRate
            );
        }

        #endregion
    }

    public class DisplayModeMatchOptions { }
}