using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace JakeZoom {
    /// <summary>
    /// To jest główny typ Twojej gry.
    /// </summary>
    public class Game1 : Microsoft.Xna.Framework.Game {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;

        // Świat gry

        Texture2D jakeTexture;
        Rectangle jakeRect;

        int getPercentage(int percentage, int inputValue) {
            return (inputValue * percentage) / 100;
        }


        public Game1() {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }

        /// <summary>
        /// Umożliwia ewentualną inicjalizację przed uruchomieniem właściwej gry.
        /// W tym miejscu można odnaleźć wszystkie wymagane zasoby i załadować treści
        /// related content. Wywołanie metody base.Initialize spowoduje przeszukanie wszystkich komponentów
        /// i ich inicjalizację.
        /// </summary>
        protected override void Initialize() {
            jakeRect = new Rectangle(
                    0, // współrzędna pozioma lewego, górnego rogu
                    0, // współrzędna pionowa lewego, górnego rogu
                    6000, // szerokość prostokąta
                    4500); // wysokość prostokąta

            base.Initialize();
        }

        /// <summary>
        /// Metoda LoadContent jest wywoływana tylko raz dla całej gry i jako taka jest właściwym miejscem
        /// dla kodu ładującego treść.
        /// </summary>
        protected override void LoadContent() {
            // Tworzy nowy obiekt klasy SpriteBatch, którego można używać do rysowania tekstur.
            spriteBatch = new SpriteBatch(GraphicsDevice);

            jakeTexture = this.Content.Load<Texture2D > ("jake");

            int displayWidth = GraphicsDevice.Viewport.Width;
            int displayHeight = GraphicsDevice.Viewport.Height;

            int scaledWidth = jakeTexture.Width * 10;
            int scaledHeight = jakeTexture.Height * 10;

            jakeRect = new Rectangle(
                    -(scaledWidth / 2) + (displayWidth / 2),
                    -(scaledHeight / 2) + (displayHeight / 2),
                    scaledWidth, scaledHeight);
        }

        /// <summary>
        /// Metoda UnloadContent jest wywoływana tylko raz dla całej gry i jako taka jest właściwym miejscem
        /// dla kodu usuwającego całą treść z pamięci.
        /// </summary>
        protected override void UnloadContent() {
            // TODO: Należy usunąć całą treść, którą nie zarządza ContentManager.
        }

        /// <summary>
        /// Umożliwia grze wykonywanie logiki związanej z aktualizacją świata gry,
        /// sprawdzaniem kolizji, pobieraniem danych wejściowych czy odtwarzaniem dźwięków.
        /// </summary>
        /// <param name="gameTime">Udostępnia wartości reprezentujące bieżący czas.</param>
        protected override void Update(GameTime gameTime) {
            // Pozwala opuścić grę
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();

            if (jakeRect.Width > graphics.GraphicsDevice.Viewport.Width) {
                int widthChange = getPercentage(1, jakeRect.Width);
                int heightChange = getPercentage(1, jakeRect.Height);
                jakeRect.Width = jakeRect.Width - widthChange;
                jakeRect.Height = jakeRect.Height - heightChange;
                jakeRect.X = jakeRect.X + (widthChange / 2);
                jakeRect.Y = jakeRect.Y + (heightChange / 2);
            }

            base.Update(gameTime);
        }

        /// <summary>
        /// Ta metoda jest wywoływana w momencie, w którym gra musi narysować swój świat.
        /// </summary>
        /// <param name="gameTime">Udostępnia wartości reprezentujące bieżący czas.</param>
        protected override void Draw(GameTime gameTime) {
            GraphicsDevice.Clear(Color.CornflowerBlue);

            spriteBatch.Begin();
            spriteBatch.Draw(jakeTexture, jakeRect, Color.White);
            spriteBatch.End();

            base.Draw(gameTime);
        }
    }
}
