namespace DarkWynterEngine.Draw
{
    #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 System.Xml;
    using System.Diagnostics;
    #endregion
    using DarkWynterEngine.Physics;

    /// <summary>
    /// Camera class
    /// </summary>
    public class Camera
    {
        /// <summary>
        /// Viewport associated with this Camera
        /// </summary>
        public Viewport viewport;

        /// <summary>
        /// Allows user to move camera around relative the Mass's currentPosition 
        /// </summary>
        public Vector3 offset = new Vector3(700, 200, 700);

        /// <summary>
        /// Constructor
        /// </summary>
        public Camera()
        {
            viewport = new Viewport();
        }


        public Matrix GetViewMatrix(Mass mass)
        {
            // Calculate new camera position relative to current position
            Vector3 cameraPosition = mass.currentPosition - (offset * mass.normalVector);

            // Calculate new lookAtPosition in the opposite direction of cameraPosition relative to current position
            Vector3 lookAtPosition = mass.currentPosition + mass.normalVector + (offset * mass.normalVector);

            // Use just the height value or camera goes wobbly sideways
            Vector3 upVector = mass.upVector + new Vector3(0, offset.Y, 0);

            // Make sure camera doesn't go below player position (clipping)
            if(cameraPosition.Y < mass.currentPosition.Y)
                cameraPosition.Y = mass.currentPosition.Y;

            // return final view matrix
            return Matrix.CreateLookAt(
                    cameraPosition,
                    lookAtPosition,
                    upVector
                );

        }


        public Matrix GetProjectionMatrix()
        {
            return

            Matrix.CreatePerspectiveFieldOfView(
                    (float)Math.PI / 5,
                    viewport.Width / viewport.Height,
                    0.3f, 100000f
                );

        }
    }
}