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;


namespace XNA_Aquarium
{
    public class Seestern : Microsoft.Xna.Framework.DrawableGameComponent
    {
        //Lokales spriteBatch Objekt
        SpriteBatch spriteBatch;
        //Lokales Game Objekt
        Game game;
        //Textur für den Seestern
        Texture2D texStern;
        //Position des Seesterns
        Vector2 posSeeStern;
        //Bewegungssound für den Seestern
        SoundEffect sndSeeStern;
        //Eine Soundinstanz für wiederholtes abspielen des Sounds
        SoundEffectInstance sndInstanz;
        //Panning des Sounds (Bewegung des Signals von links<=>links (Kopfhörer nötig)
        float sndPanning;
        //Accelerometer
        Microsoft.Devices.Sensors.Accelerometer accelerometer = new Microsoft.Devices.Sensors.Accelerometer();
        public Seestern(Game game)
            : base(game)
        {
            //Game speichern
            this.game = game;
        }

        public override void Initialize()
        {
            //Seestern in der linken unteren Ecke des Aquariums positionieren
            posSeeStern.X = 0;
            posSeeStern.Y = 300;
            //Acceleromter registrieren und starten
            accelerometer.ReadingChanged += new EventHandler<Microsoft.Devices.Sensors.AccelerometerReadingEventArgs>(accelerometer_ReadingChanged);
            accelerometer.Start();
            //Das Panning berechnen
            sndPanning = 2.0f / 800;
            base.Initialize();
        }

        void accelerometer_ReadingChanged(object sender, Microsoft.Devices.Sensors.AccelerometerReadingEventArgs e)
        {
            //Y Achsen verlagerung >< 0.3 bewirkt ein rutschen des Seesterns
            bool boMoveing = false;
            if (e.Y < -0.3)
            {
                if(game.GraphicsDevice.PresentationParameters.DisplayOrientation == DisplayOrientation.LandscapeLeft)
                    posSeeStern.X += 2 + (float)-e.Y;
                else
                    posSeeStern.X -= 2 + (float)-e.Y;
                boMoveing = true;
            }
            if (e.Y > 0.3)
            {
                if (game.GraphicsDevice.PresentationParameters.DisplayOrientation == DisplayOrientation.LandscapeLeft)
                    posSeeStern.X -= 2 + (float)e.Y;
                else
                    posSeeStern.X += 2 + (float)e.Y;
                boMoveing = true;
            }
            //ggf. Sound abspielen
            if (sndInstanz != null)
            {
                if (!boMoveing)
                {
                    //Keine Bewegung, kein Sound mehr
                    if (sndInstanz.State == SoundState.Playing)
                        sndInstanz.Stop();
                }
                else
                {
                    //Nur abspielen wenn keine Kollision mit Rand erfolgt
                    if (posSeeStern.X > 0 && posSeeStern.X < 752)
                    {
                        if (sndInstanz.State != SoundState.Playing)
                        {
                            sndInstanz.Play();
                        }
                        //aktuelles Panning errechnen
                        sndInstanz.Pan = -1 + Math.Abs(posSeeStern.X * sndPanning);
                    }
                    else
                        sndInstanz.Stop();
                }
            }
        }

        protected override void LoadContent()
        {
            //Das spriteBatch Objekt der Game Klasse abfragen
            spriteBatch = (SpriteBatch)game.Services.GetService(typeof(SpriteBatch));
            //Seestern Textur laden
            texStern = game.Content.Load<Texture2D>("Stern");
            //Sound laden
            sndSeeStern = game.Content.Load<SoundEffect>("Seestern");
            //Sound Instanz erzeugen
            sndInstanz = sndSeeStern.CreateInstance();
            //Sound-Schleife setzen
            sndInstanz.IsLooped = true;
            base.LoadContent();
        }

        public override void Update(GameTime gameTime)
        {
            //Seestern positionieren & Seitenkollision prüfen
            if (posSeeStern.X < 0)
                posSeeStern.X = 0;
            if (posSeeStern.X > 800 - texStern.Width)
                posSeeStern.X = 800 - texStern.Width;
            base.Update(gameTime);
        }

        public override void Draw(GameTime gameTime)
        {
            //Seestern zeichen
            spriteBatch.Draw(texStern, posSeeStern, Color.White);
            base.Draw(gameTime);
        }
    }
}
