//---------------------------------------------------------------------------------------------------------------------------------------------------
// <copyright file="PauseScreen.cs" company="DarkWynter Studios">
//     Copyright (C)2007 DarkWynter Studios.  All rights reserved.
// </copyright>
//---------------------------------------------------------------------------------------------------------------------------------------------------
// {Contact : darkwynter.com for licensing information
//---------------------------------------------------------------------------------------------------------------------------------------------------

namespace DarkWynter.Engine.Menus.GameScreens
{
    #region Using Statements
    using System;
    using System.Collections.Generic;
    using Microsoft.Xna.Framework;
    using Microsoft.Xna.Framework.Audio;
    using Microsoft.Xna.Framework.Content;
    using Microsoft.Xna.Framework.Graphics;
    using Microsoft.Xna.Framework.Input;
    using Microsoft.Xna.Framework.Storage;
    using DarkWynter.Engine;
    using DarkWynter.Engine.Audio;
    using DarkWynter.Engine.GameObjects;
    using DarkWynter.Engine.Globals;
    using DarkWynter.Engine.ObjectLib;
    using DarkWynter.Engine.Controllers;
    using DarkWynter.Engine.Menus;
    using DarkWynter.Stream;
    using GameObjects;
    #endregion

    /// <summary>
    /// The Pause Screen
    /// </summary>
    public class PauseScreen : GameScreen
    {
        private Texture2D hintsTexture;
        private GameMenu playerPauseMenu;

        /// <summary>
        /// Pause Screen constructor
        /// </summary>
        public PauseScreen(Enums_Engine.EngineState GameEngineState)
            :base(GameEngineState)
        {
            //Instantiate the GameMenu
            menu = new GameMenu("", 0, 0);

            playerPauseMenu = new GameMenu("Paused", 150, 30);//Statics_Engine.GAME_WINDOW_WIDTH / 2, Statics_Engine.GAME_WINDOW_HEIGHT / 2);
            playerPauseMenu.SetDrawMenuTitle(false);

            playerPauseMenu.AddMenuOption("Invert rotation", "No", "Yes");
            playerPauseMenu.AddMenuOption("Rumble", "Yes", "No");
            playerPauseMenu.AddMenuOption("ShadowMap1", "Yes", "No");
            playerPauseMenu.AddMenuOption("ShadowMap2", "Yes", "No");
            playerPauseMenu.AddMenuOption("Terrain Bump Mapping", "Yes", "No");
            playerPauseMenu.AddMenuOption("Terrain Multi-Texturing", "Yes", "No");
            //playerPauseMenu.AddMenuOption("Number Of Terrain Textures", "4", "3", "2");
            playerPauseMenu.AddMenuOption("Light Sources", "2", "1");
            playerPauseMenu.AddMenuOption("Music", "On", "Off");
            playerPauseMenu.AddMenuOption("Sound Effects", "On", "Off");

            SetBackground(Statics_Engine.SystemSettings.content.Load<Texture2D>("Content/_textures/black"), 0.3f);
            //pauseScreen.SetHintsTexture(Statics_Engine.SystemSettings.content.Load<Texture2D>("_textures/black"));

            SetDefaults();
        }

        /// <summary>
        /// Set pause options for current player.
        /// </summary>
        /// <param name="player">Player that paused.</param>
        public void SetPlayerOptions(Player player)
        {
            if (player.controlsInverted)
            {
                ((GameMenuOption)playerPauseMenu.GetMenuElement("Invert rotation")).SetCurrentIndex(1);
            }
            else
            {
                ((GameMenuOption)playerPauseMenu.GetMenuElement("Invert rotation")).SetCurrentIndex(0);
            }

            //if (player.rumbleEnabled)
            //{
            //    ((GameMenuOption)playerPauseMenu.GetMenuElement("Rumble")).SetCurrentIndex(0);
            //}
            //else
            //{
            //    ((GameMenuOption)playerPauseMenu.GetMenuElement("Rumble")).SetCurrentIndex(1);
            //}
        }

        /// <summary>
        /// Reset default values.
        /// </summary>
        public void SetDefaults()
        {
            // ShadowMap1
            if (Statics_Engine.SystemSettings.enableShadowMap1)
            {
                ((GameMenuOption)playerPauseMenu.GetMenuElement("ShadowMap1")).SetCurrentIndex(0);
            }
            else
            {
                ((GameMenuOption)playerPauseMenu.GetMenuElement("ShadowMap1")).SetCurrentIndex(1);
            }

            if (Statics_Engine.SystemSettings.enableShadowMap2)
            {
                ((GameMenuOption)playerPauseMenu.GetMenuElement("ShadowMap2")).SetCurrentIndex(0);
            }
            else
            {
                ((GameMenuOption)playerPauseMenu.GetMenuElement("ShadowMap2")).SetCurrentIndex(1);
            }

            if (Statics_Engine.SystemSettings.enableTerrainBumpMapping)
            {
                ((GameMenuOption)playerPauseMenu.GetMenuElement("Terrain Bump Mapping")).SetCurrentIndex(0);
            }
            else
            {
                ((GameMenuOption)playerPauseMenu.GetMenuElement("Terrain Bump Mapping")).SetCurrentIndex(1);
            }

            if (Statics_Engine.SystemSettings.enableTerrainMultiTexturing)
            {
                ((GameMenuOption)playerPauseMenu.GetMenuElement("Terrain Multi-Texturing")).SetCurrentIndex(0);
            }
            else
            {
                ((GameMenuOption)playerPauseMenu.GetMenuElement("Terrain Multi-Texturing")).SetCurrentIndex(1);
            }

            if (Statics_Engine.SystemSettings.singleLightSource)
            {
                ((GameMenuOption)playerPauseMenu.GetMenuElement("Light Sources")).SetCurrentIndex(0);
            }
            else
            {
                ((GameMenuOption)playerPauseMenu.GetMenuElement("Light Sources")).SetCurrentIndex(1);
            }

            if (Statics_Engine.SystemSettings.music)
            {
                ((GameMenuOption)playerPauseMenu.GetMenuElement("Music")).SetCurrentIndex(0);
            }
            else
            {
                ((GameMenuOption)playerPauseMenu.GetMenuElement("Music")).SetCurrentIndex(1);
            }

            if (Statics_Engine.SystemSettings.soundFX)
            {
                ((GameMenuOption)playerPauseMenu.GetMenuElement("Sound Effects")).SetCurrentIndex(0);
            }
            else
            {
                ((GameMenuOption)playerPauseMenu.GetMenuElement("Sound Effects")).SetCurrentIndex(1);
            }
        }

        /// <summary>
        /// Menu start button pressed method
        /// </summary>
        /// <param name="objectLibrary">Object Library</param>
        public override void MenuStart(ObjectLibrary objectLibrary)
        {
            Audio.MenuStart();
            //Commit menu changes
            Commit(objectLibrary);

            //Resume the game
            Statics_Engine.SystemSettings.gameState = Enums_Engine.EngineState.GAME_MODE;
            Statics_Engine.PlayerSettings.playerThatPaused = -1;

            Statics_Engine.SystemSettings.screenSaverTimer.Reset();
            Statics_Engine.SystemSettings.screenSaverTimer.Start();
        }
        /// <summary>
        /// Menu back button pressed method
        /// </summary>
        public override void MenuBack()
        {
            // No going back from pause menu
        }

        /// <summary>
        /// Commit changes to the pause menu.
        /// </summary>
        /// <param name="objectLibrary">ObjectLibrary containing player that paused.</param>
        public void Commit(ObjectLibrary objectLibrary)
        {
            GameMenuOption option;      // Text Option

            // Player controller setup
            option = (GameMenuOption)playerPauseMenu.GetMenuElement("Invert rotation");
            if (option.GetActiveOption() == "Yes")
            {
                objectLibrary.humans[Statics_Engine.PlayerSettings.playerThatPaused].controlsInverted = true;
            }
            else
            {
                objectLibrary.humans[Statics_Engine.PlayerSettings.playerThatPaused].controlsInverted = false;
            }

            // Player rumble
            //option = (GameMenuOption)playerPauseMenu.GetMenuElement("Rumble");
            //if (option.GetActiveOption() == "Yes")
            //{
            //    ((Human)objectLibrary.humans[Statics_Engine.PlayerSettings.playerThatPaused]).rumbleEnabled = true;
            //}
            //else
            //{
            //    ((Human)objectLibrary.humans[Statics_Engine.PlayerSettings.playerThatPaused]).rumbleEnabled = false;
            //}

            option = (GameMenuOption)playerPauseMenu.GetMenuElement("ShadowMap1");
            if (option.GetActiveOption() == "Yes")
            {
                Statics_Engine.SystemSettings.enableShadowMap1 = true;
            }
            else
            {
                Statics_Engine.SystemSettings.enableShadowMap1 = false;
            }

            option = (GameMenuOption)playerPauseMenu.GetMenuElement("ShadowMap2");
            if (option.GetActiveOption() == "Yes")
            {
                Statics_Engine.SystemSettings.enableShadowMap2 = true;
            }
            else
            {
                Statics_Engine.SystemSettings.enableShadowMap2 = false;
            }

            option = (GameMenuOption)playerPauseMenu.GetMenuElement("Terrain Bump Mapping");
            if (option.GetActiveOption() == "Yes")
            {
                Statics_Engine.SystemSettings.enableTerrainBumpMapping = true;
            }
            else
            {
                Statics_Engine.SystemSettings.enableTerrainBumpMapping = false;
            }

            option = (GameMenuOption)playerPauseMenu.GetMenuElement("Terrain Multi-Texturing");
            if (option.GetActiveOption() == "Yes")
            {
                Statics_Engine.SystemSettings.enableTerrainMultiTexturing = true;
            }
            else
            {
                Statics_Engine.SystemSettings.enableTerrainMultiTexturing = false;
            }

            option = (GameMenuOption)playerPauseMenu.GetMenuElement("Light Sources");
            if (option.GetActiveOption() == "1")
            {
                Statics_Engine.SystemSettings.singleLightSource = true;
                option = (GameMenuOption)playerPauseMenu.GetMenuElement("ShadowMap2");
                option.NextOption();
                //Statics_Engine.enableShadowMap2 = false;
            }
            else
            {
                Statics_Engine.SystemSettings.singleLightSource = false;
            }

            option = (GameMenuOption)playerPauseMenu.GetMenuElement("Music");
            if (option.GetActiveOption() == "On")
            {
                Statics_Engine.SystemSettings.music = true;
            }
            else
            {
                Statics_Engine.SystemSettings.music = false;
            }

            option = (GameMenuOption)playerPauseMenu.GetMenuElement("Sound Effects");
            if (option.GetActiveOption() == "On")
            {
                Statics_Engine.SystemSettings.soundFX = true;
            }
            else
            {
                Statics_Engine.SystemSettings.soundFX = false;
            }
        }

        /// <summary>
        /// Draw the pause menu.
        /// </summary>
        /// <param name="spriteBatch">Spritebatch used to draw.</param>
        /// <param name="graphicsDevice">Graphics device to draw.</param>
        public void Draw(SpriteBatch spriteBatch, GraphicsDevice graphicsDevice)
        {
            graphicsDevice.Viewport = Statics_Stream.RenderSettings.defaultViewport;
            base.Draw(spriteBatch);
            // Now draw the menu for THIS player
            if (Statics_Engine.PlayerSettings.playerThatPaused != -1)
            {
                //Figure out how many players there are and if we need to shrink the font
                if (Statics_Engine.SystemSettings.TOTAL_PLAYERS > 2)
                {
                    //use smaller font
                    playerPauseMenu.SetFont(Statics_Stream.Fonts.ComicSansSmall);
                }
                else
                {
                    //use bigger font
                    playerPauseMenu.SetFont(Statics_Stream.Fonts.ComicSans);
                }
                spriteBatch.End();
                graphicsDevice.Viewport = Statics_Stream.RenderSettings.cameraList[Statics_Engine.PlayerSettings.playerThatPaused].viewport;
                spriteBatch.Begin(SpriteBlendMode.AlphaBlend);
                //draw hints background
                if (hintsTexture != null)
                {
                    spriteBatch.Draw(hintsTexture, new Rectangle(0,0,graphicsDevice.Viewport.Width, graphicsDevice.Viewport.Height), Color.White);
                }
                playerPauseMenu.Draw(spriteBatch);
                spriteBatch.End();
                //restart spritebatch for later
                spriteBatch.Begin(SpriteBlendMode.AlphaBlend);
            }
        }
    }
}