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

namespace DarkWynter.Game
{
    #region Using Statements
    using System;
    using System.Collections.Generic;
    using System.Text;
    using Microsoft.Xna.Framework;
    using Microsoft.Xna.Framework.Input;
    using DarkWynter.Engine;
    using DarkWynter.Engine.Globals;
    using DarkWynter.Engine.Utilities;
    using DarkWynter.Engine.Controllers;
    #endregion

    /// <summary>
    /// Game Controller for getting player inputs in-game
    /// </summary>
    public class GameController : Controller
    {
        /// <summary>
        /// Controller Type
        /// </summary>
        public static Enums_Engine.ControllerType playerControllerType = Enums_Engine.ControllerType.PC_ONLY;

        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="playerNumber">Player index for this controller</param>
        public GameController(int playerNumber): base(playerNumber)
        {
            Add(new KeyboardControl(Keys.W, MoveForward, 0));
            Add(new KeyboardControl(Keys.A, MoveLeft, 0));
            Add(new KeyboardControl(Keys.D, MoveRight, 0));
            Add(new KeyboardControl(Keys.S, MoveBackward, 0));

            Add(new KeyboardControl(Keys.Space, Jump, 10));

            Add(new KeyboardControl(Keys.D1, IncrementTemperature, 100));
            Add(new KeyboardControl(Keys.D2, DecrementTemperature, 100));
            Add(new KeyboardControl(Keys.D3, IncrementDelta, 100));
            Add(new KeyboardControl(Keys.D4, DecrementDelta, 100));

            Add(new KeyboardControl(Keys.Z, ZoomIn, 100));
            Add(new KeyboardControl(Keys.X, ZoomOut, 100));
            Add(new KeyboardControl(Keys.LeftShift, MovementToggle, 100));
            Add(new KeyboardControl(Keys.F12, FPSToggle, 100));
            Add(new KeyboardControl(Keys.OemTilde, CompilerConsoleToggle, 100));
            Add(new KeyboardControl(Keys.Escape, Escape, 100));

            Add(new MouseControl(Enums_Engine.ControlType.Motion, Rotate, 0));
            Add(new MouseControl(Enums_Engine.ControlType.LeftButton, Attack, 0));
            Add(new MouseControl(Enums_Engine.ControlType.RightButton, Defend, 0));
            Add(new MouseControl(Enums_Engine.ControlType.ScrollWheel, ChangeWeapon, 0));
        }

        private void Escape(ControllerBoolEventArgs args)
        {
            Statics_Engine.SystemSettings.gameState = Enums_Engine.EngineState.EXIT;
        }
        private void CompilerConsoleToggle(ControllerBoolEventArgs args)
        {
            Statics_Engine.SystemSettings.enableCompilerConsole = !Statics_Engine.SystemSettings.enableCompilerConsole;
        }
        private void IncrementTemperature(ControllerBoolEventArgs args)
        {
            args.objectLibrary.humans[playerNumber].AttackTemperature(true);
        }
        private void DecrementTemperature(ControllerBoolEventArgs args)
        {
            args.objectLibrary.humans[playerNumber].AttackTemperature(false);
        }
        private void IncrementDelta(ControllerBoolEventArgs args)
        {
            args.objectLibrary.humans[playerNumber].AttackMagnitude(true);
        }
        private void DecrementDelta(ControllerBoolEventArgs args)
        {
            args.objectLibrary.humans[playerNumber].AttackMagnitude(false);
        }
        private void FPSToggle(ControllerBoolEventArgs args)
        {
            Statics_Engine.SystemSettings.enableFPSDisplay = !Statics_Engine.SystemSettings.enableFPSDisplay;
        }
        private void MovementToggle(ControllerBoolEventArgs args)
        {
            args.objectLibrary.humans[playerNumber].ToggleMovementType();
        }
        private void MoveForward(ControllerBoolEventArgs args)
        {
            args.objectLibrary.humans[playerNumber].Translate(new Vector2(0, 10));
        }
        private void MoveBackward(ControllerBoolEventArgs args)
        {
            args.objectLibrary.humans[playerNumber].Translate(new Vector2(0, -10));
        }
        private void MoveLeft(ControllerBoolEventArgs args)
        {
            args.objectLibrary.humans[playerNumber].Translate(new Vector2(-10, 0));
        }
        private void MoveRight(ControllerBoolEventArgs args)
        {
            args.objectLibrary.humans[playerNumber].Translate(new Vector2(10,0));
        }
        private void Rotate(ControllerVec2EventArgs args)
        {
            args.objectLibrary.humans[playerNumber].Rotate(args.value);
        }
        private void Jump(ControllerBoolEventArgs args)
        {
            args.objectLibrary.humans[playerNumber].Jump(args.objectLibrary);
        }
        private void ZoomIn(ControllerBoolEventArgs args)
        {
            args.objectLibrary.humans[playerNumber].Zoom(true);
        }
        private void ZoomOut(ControllerBoolEventArgs args)
        {
            args.objectLibrary.humans[playerNumber].Zoom(false);
        }
        private void Attack(ControllerBoolEventArgs args)
        {
            args.objectLibrary.humans[playerNumber].ChangeAttackAmount(0.5f);
        }
        private void Defend(ControllerBoolEventArgs args)
        {
            args.objectLibrary.humans[playerNumber].ChangeAttackAmount(-0.5f);
        }
        private void ChangeWeapon(ControllerIntEventArgs args)
        {
            args.objectLibrary.humans[playerNumber].AttackModeSwitching(args.value);
        }
    }
}