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.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using Microsoft.Xna.Framework.Input.Touch;

namespace XNA_Aquarium
{
    //Eine Klasse für die einzelnen Fische
    public class Fisch
    {
        //Im Konstruktor die Position, Richtung und Bewegung per Zufall festlegen
        public Fisch()
        {
            Random rnd = new Random((int)System.DateTime.Now.Ticks);
            posFisch.X = rnd.Next(0, 753);
            posFisch.Y = rnd.Next(0, 253);
            xMovement = rnd.Next(1, 6);
            //Die Richtung wird in diesem Fall direkt über eine SpriteEffects Eigenschaft festgelegt
            spriteEffect = (SpriteEffects)rnd.Next(0, 2);
        }
        //Position des Fisches
        public Vector2 posFisch;
        //Textur des Fisches
        public Texture2D texFisch;
        //Bewegung (Nur X Achse)
        public float xMovement;
        //SpriteEffecs zur Richtungsangabe und zeichnen
        public SpriteEffects spriteEffect;
    }
    public class Fische : Microsoft.Xna.Framework.DrawableGameComponent
    {
        //Lokales spriteBatch Objekt
        SpriteBatch spriteBatch;
        //Lokales Game Objekt
        Game game;
        //"Klopfen" Textur
        Texture2D texBeruehrung;
        //"Klopfen" Position
        Vector2 posBeruehrung;
        //Eine Zeitangabe für die Dauer der Anzeige
        TimeSpan tBeruehrung;
        //Eine Liste für die einzelnen Fische
        List<Fisch> fische = new List<Fisch>();
        //Ein SoundEffect für das "Klopfen"
        SoundEffect sndKlopfen;
        public Fische(Game game)
            : base(game)
        {
            //Game speichern
            this.game = game;
        }

        public override void Initialize()
        {
            //Für die TAP Geste registrieren
            TouchPanel.EnabledGestures = GestureType.Tap;
            base.Initialize();
        }

        protected override void LoadContent()
        {
            //Das spriteBatch Objekt der Game Klasse abfragen
            spriteBatch = (SpriteBatch)game.Services.GetService(typeof(SpriteBatch));
            //Fische erstellen
            int iTexture = 0;
            for (int i = 0; i <= 50; i++)
            {
                if (iTexture > 5)
                    iTexture = 0;
                Fisch fisch = new Fisch();
                fisch.texFisch = game.Content.Load<Texture2D>("Fisch"+iTexture);
                fische.Add(fisch);
                //Kurz warten für den Zufalls-Generator
                System.Threading.Thread.Sleep(5);
                iTexture++;
            }
            //"Klopf" Textur laden
            texBeruehrung = game.Content.Load<Texture2D>("Touch");
            //"Klopf" Sound laden
            sndKlopfen = game.Content.Load<SoundEffect>("Klopfen");
            base.LoadContent();
        }
        public override void Update(GameTime gameTime)
        {
            bool boAktuelleBerührung = false;
            //Prüfen ob Gesten vorhanden sind
            while (TouchPanel.IsGestureAvailable)
            {
                //Die aktuelle Geste auslesen
                GestureSample curGesture = TouchPanel.ReadGesture();
                //Gestentyp prüfen
                switch (curGesture.GestureType)
                {
                    //Double Tap Geste auswerten
                    case GestureType.Tap:
                        //Berührungs(Klopf) Koordinaten auslesen
                        posBeruehrung.X = curGesture.Position.X - texBeruehrung.Width/2;
                        posBeruehrung.Y = curGesture.Position.Y - texBeruehrung.Height/ 2;
                        //Zeitpunkt des "Klopfens" abspeichern
                        tBeruehrung = gameTime.TotalGameTime;
                        //Vibrieren
                        Microsoft.Devices.VibrateController vibrate;
                        vibrate = Microsoft.Devices.VibrateController.Default;
                        vibrate.Start(TimeSpan.FromSeconds(0.05));
                        boAktuelleBerührung = true;
                        //"Klopf" Sound abspielen
                        sndKlopfen.Play();
                        break;
                }
            }
            //"Klopfen" für eine gewisse Zeit anzeigen
            if (posBeruehrung.X != 0 && posBeruehrung.Y != 0)
            {
                if ((gameTime.TotalGameTime.TotalMilliseconds - tBeruehrung.TotalMilliseconds) > 200)
                    posBeruehrung.X = posBeruehrung.Y = 0;
            }
            //Das Klopfen auswerten
            Rectangle rcBerührung = new Rectangle();
            if (boAktuelleBerührung)
            {
                rcBerührung = new Rectangle((int)posBeruehrung.X - 96, (int)posBeruehrung.Y - 96, 192, 192);
            }
            //Fische bewegen
            foreach (Fisch curFisch in fische)
            {
                if (curFisch.spriteEffect == SpriteEffects.None)
                {
                    curFisch.posFisch.X -= curFisch.xMovement;
                    if (curFisch.posFisch.X < 0)
                        curFisch.spriteEffect = SpriteEffects.FlipHorizontally;
                }
                else
                {
                    curFisch.posFisch.X += curFisch.xMovement;
                    if (curFisch.posFisch.X > 752)
                        curFisch.spriteEffect = SpriteEffects.None;
                }
                //Alle Fische in der Nähe des "Klopfens" sollen die Richtung ändern
                if (boAktuelleBerührung)
                {
                    Rectangle rcFisch = new Rectangle((int)curFisch.posFisch.X, (int)curFisch.posFisch.Y, curFisch.texFisch.Width, curFisch.texFisch.Height);
                    if (rcBerührung.Intersects(rcFisch))
                    {
                        if (curFisch.spriteEffect == SpriteEffects.FlipHorizontally)
                        {
                            curFisch.spriteEffect = SpriteEffects.None;
                            curFisch.posFisch.X -= 10;
                        }
                        else
                        {
                            curFisch.spriteEffect = SpriteEffects.FlipHorizontally;
                            curFisch.posFisch.X += 10;
                        }
                    }
                }
            }
            base.Update(gameTime);
        }

        public override void Draw(GameTime gameTime)
        {
            //Alle Fische zeichnen
            foreach (Fisch curFisch in fische)
            {
                spriteBatch.Draw(curFisch.texFisch, curFisch.posFisch, null, Color.White, 0, new Vector2(0, 0),1, curFisch.spriteEffect, 0);
            }
            //"Klopfen" zeichnen
            if (posBeruehrung.X > 0 && posBeruehrung.Y > 0)
                spriteBatch.Draw(texBeruehrung, posBeruehrung, Color.White);
            base.Draw(gameTime);
        }
    }
}
