using System;
using System.Windows;
using Microsoft.Phone.Controls;
using Microsoft.Phone.BackgroundAudio;
using Microsoft.Phone.Shell;
using System.Windows.Threading;
using System.Diagnostics;

namespace BackgroundAudioPlayerStreamSample
{
    public partial class MainPage : PhoneApplicationPage
    {
        // Zeitgeber fuer die Aktualisierung des Fortschrittsbalkens
        private DispatcherTimer myDispatcherTimer;

        // Hauptkonstruktor
        public MainPage()
        {
            InitializeComponent();

            // PlayStateChanged-Ereignis initialisieren
            BackgroundAudioPlayer.Instance.PlayStateChanged += new EventHandler(Instance_PlayStateChanged);

            // Zeitgeber mit entsprechendem Ereignis initialisieren
            myDispatcherTimer = new DispatcherTimer();
            myDispatcherTimer.Interval = TimeSpan.FromSeconds(0.5);
            myDispatcherTimer.Tick += new EventHandler(myDispatcherTimer_Tick);
        }

        // Ereignismethode des Zeitgebers
        void myDispatcherTimer_Tick(object sender, EventArgs e)
        {
            if (BackgroundAudioPlayer.Instance.Track != null)
            {
                // wenn die Trackinfos gesetzt wurden und das Maximum des Fortschrittbalkens ungleich der Gesamtsekunden der Dauer ist, dann Gesamtsekunden der Dauer als Maximum des Fortschrittbalkens setzen
                if (BackgroundAudioPlayer.Instance.Track.Duration.TotalSeconds != 0 && pgb_Duration.Maximum != BackgroundAudioPlayer.Instance.Track.Duration.TotalSeconds)
                    pgb_Duration.Maximum = BackgroundAudioPlayer.Instance.Track.Duration.TotalSeconds;

                // aktuelle Abspielposition im Fortschrittbalken setzen
                pgb_Duration.Value = BackgroundAudioPlayer.Instance.Position.TotalSeconds;
                // aktuelle Position anzeigen
                tbk_CurrentPosition.Text = string.Format("{0:00}:{1:00}:{2:00}", BackgroundAudioPlayer.Instance.Position.TotalHours, BackgroundAudioPlayer.Instance.Position.TotalMinutes, BackgroundAudioPlayer.Instance.Position.Seconds);
            }
        }

        // Ereignismethode fuer die Aenderung des Wiedergabestatus
        void Instance_PlayStateChanged(object sender, EventArgs e)
        {
            // Wiedergabestatus auswerten
            switch (BackgroundAudioPlayer.Instance.PlayerState)
            {
                // Wiedergabe wurde pausiert   
                case PlayState.Paused:
                    // Zeitgeberereignisbehandlung durchführen
                    myDispatcherTimer_Tick(null, null);
                    // Zeitgeber anhalten
                    myDispatcherTimer.Stop();
                    // Schaltflaechen setzen 
                    ((ApplicationBarIconButton)ApplicationBar.Buttons[2]).Text = "Abspielen";
                    ((ApplicationBarIconButton)ApplicationBar.Buttons[2]).IconUri = new Uri("/AppBarIcons/appbar.transport.play.rest.png", UriKind.Relative);
                    ((ApplicationBarIconButton)ApplicationBar.Buttons[0]).IsEnabled = false;
                    ((ApplicationBarIconButton)ApplicationBar.Buttons[1]).IsEnabled = true;
                    ((ApplicationBarIconButton)ApplicationBar.Buttons[3]).IsEnabled = false;
                    break;

                // Wiedergabe laeuft
                case PlayState.Playing:
                    // wenn das Maximum des Fortschrittbalkens ungleich der Gesamtsekunden der Dauer ist, dann Gesamtsekunden der Dauer als Maximum des Fortschrittbalkens setzen
                    if (pgb_Duration.Maximum != BackgroundAudioPlayer.Instance.Track.Duration.TotalSeconds)
                        pgb_Duration.Maximum = BackgroundAudioPlayer.Instance.Track.Duration.TotalSeconds;

                    // Zeitgeberereignisbehandlung durchführen
                    myDispatcherTimer_Tick(null, null);
                    // Zeitgeber starten
                    myDispatcherTimer.Start();
                    // Schaltflaechen setzen
                    ((ApplicationBarIconButton)ApplicationBar.Buttons[2]).Text = "Pausieren";
                    ((ApplicationBarIconButton)ApplicationBar.Buttons[2]).IconUri = new Uri("/AppBarIcons/appbar.transport.pause.rest.png", UriKind.Relative);
                    ((ApplicationBarIconButton)ApplicationBar.Buttons[0]).IsEnabled = true;
                    ((ApplicationBarIconButton)ApplicationBar.Buttons[1]).IsEnabled = true;
                    ((ApplicationBarIconButton)ApplicationBar.Buttons[3]).IsEnabled = true;
                    break;

                // Wiedergabe wurde gestoppt
                case PlayState.Stopped:
                    // Zeitgeber anhalten
                    myDispatcherTimer.Stop();
                    // Fortschrittsbalken zuruecksetzen
                    pgb_Duration.Value = 0;
                    // Positionsangabe loeschen
                    tbk_CurrentPosition.Text = string.Empty;
                    // Song auf Null setzen
                    BackgroundAudioPlayer.Instance.Track = null;
                    // Schaltflaechen setzen
                    ((ApplicationBarIconButton)ApplicationBar.Buttons[2]).Text = "Abspielen";
                    ((ApplicationBarIconButton)ApplicationBar.Buttons[2]).IconUri = new Uri("/AppBarIcons/appbar.transport.play.rest.png", UriKind.Relative);
                    ((ApplicationBarIconButton)ApplicationBar.Buttons[0]).IsEnabled = false;
                    ((ApplicationBarIconButton)ApplicationBar.Buttons[1]).IsEnabled = false;
                    ((ApplicationBarIconButton)ApplicationBar.Buttons[3]).IsEnabled = false;         
                    break;
            }

            // Songinformation in UI setzen
            SetTrackInfoInGUI();
        }

        // Ereignismethode, die beim Anzeigen der Anwendung aufgerufen wird
        protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            // Lautstaerke der Hintergrundwiedergabe fuer den Schieberegler setzen
            sld_Volume.Value = BackgroundAudioPlayer.Instance.Volume;

            // Wiedergabestatus auswerten
            switch (BackgroundAudioPlayer.Instance.PlayerState)
            {
                // Wiedergabe wurde pausiert
                case PlayState.Paused:
                    // Gesamtsekunden der Dauer als Maximum des Fortschrittbalkens setzen
                    pgb_Duration.Maximum = BackgroundAudioPlayer.Instance.Track.Duration.TotalSeconds;
                    // Zeitgeberereignisbehandlung durchführen
                    myDispatcherTimer_Tick(null, null);
                    // Schaltflaechen setzen
                    ((ApplicationBarIconButton)ApplicationBar.Buttons[2]).Text = "Abspielen";
                    ((ApplicationBarIconButton)ApplicationBar.Buttons[2]).IconUri = new Uri("/AppBarIcons/appbar.transport.play.rest.png", UriKind.Relative);
                    ((ApplicationBarIconButton)ApplicationBar.Buttons[0]).IsEnabled = false;
                    ((ApplicationBarIconButton)ApplicationBar.Buttons[1]).IsEnabled = true;
                    ((ApplicationBarIconButton)ApplicationBar.Buttons[3]).IsEnabled = false;
                    break;

                    // Wiedergabe laeuft
                case PlayState.Playing:
                    // Gesamtsekunden der Dauer als Maximum des Fortschrittbalkens setzen
                    pgb_Duration.Maximum = BackgroundAudioPlayer.Instance.Track.Duration.TotalSeconds;
                    // Zeitgeberereignisbehandlung durchführen
                    myDispatcherTimer_Tick(null, null);
                    // Zeitgeber starten
                    myDispatcherTimer.Start();
                    // Schaltflaechen setzen
                    ((ApplicationBarIconButton)ApplicationBar.Buttons[2]).Text = "Pausieren";
                    ((ApplicationBarIconButton)ApplicationBar.Buttons[2]).IconUri = new Uri("/AppBarIcons/appbar.transport.pause.rest.png", UriKind.Relative);
                    ((ApplicationBarIconButton)ApplicationBar.Buttons[0]).IsEnabled = true;
                    ((ApplicationBarIconButton)ApplicationBar.Buttons[1]).IsEnabled = true;
                    ((ApplicationBarIconButton)ApplicationBar.Buttons[3]).IsEnabled = true;
                    break;

                case PlayState.Stopped:
                    // Maximum des Fortschrittbalkens auf 0 setzen
                    pgb_Duration.Value = 0;
                    // Schaltflaechen setzen
                    ((ApplicationBarIconButton)ApplicationBar.Buttons[2]).Text = "Abspielen";
                    ((ApplicationBarIconButton)ApplicationBar.Buttons[2]).IconUri = new Uri("/AppBarIcons/appbar.transport.play.rest.png", UriKind.Relative);
                    ((ApplicationBarIconButton)ApplicationBar.Buttons[0]).IsEnabled = false;
                    ((ApplicationBarIconButton)ApplicationBar.Buttons[1]).IsEnabled = false;
                    ((ApplicationBarIconButton)ApplicationBar.Buttons[3]).IsEnabled = false;
                    break;
            }

            // aktuelle Songinformationen setzen
            SetTrackInfoInGUI();
        }

        // Methode zum Setzen der aktuellen Songinformationen
        private void SetTrackInfoInGUI()
        {
            // pruefen, ob sich derzeit ein Song im BackgroundAudioPlayer befindet
            if (BackgroundAudioPlayer.Instance.Track != null)
            {
                // aktuelle Songinformationen setzen
                tbk_Title.Text = BackgroundAudioPlayer.Instance.Track.Title;
                tbk_Artist.Text = BackgroundAudioPlayer.Instance.Track.Artist;
                tbk_Album.Text = BackgroundAudioPlayer.Instance.Track.Album;
            }
            else
            {
                // Anzeigewerte löschen
                tbk_Title.Text = "";
                tbk_Artist.Text = "";
                tbk_Album.Text = "";
            }
        }

        // Ereignismethode der Abspielen-Schaltflaeche
        private void abib_Play_Click(object sender, EventArgs e)
        {
            BackgroundAudioPlayer.Instance.Volume = 1;
            // pruefen, ob der BackgroundAudioPlayer gerade etwas wiedergibt
            if (BackgroundAudioPlayer.Instance.PlayerState == PlayState.Playing)
                // Wiedergabe pausieren
                BackgroundAudioPlayer.Instance.Pause();
            else
                // Wiedergabe starten bzw. fortsetzen
                BackgroundAudioPlayer.Instance.Play();
        }

        // Ereignismethode der Stoppen-Schaltflaeche
        private void abib_Stop_Click(object sender, EventArgs e)
        {
            // Wiedergabe stoppen
            BackgroundAudioPlayer.Instance.Stop();
        }

        // Ereignismethode der Vorheriger-Schaltflaeche
        private void abib_Previous_Click(object sender, EventArgs e)
        {
            // vorherigen Song wiedergeben
            BackgroundAudioPlayer.Instance.SkipPrevious();
        }

        // Ereignismethode der Next-Schaltflaeche
        private void abib_Next_Click(object sender, EventArgs e)
        {
            // naechsten Song wiedergeben
            BackgroundAudioPlayer.Instance.SkipNext();
        }

        // Ereignismethode des Lautstaerkeschieberegler
        private void sld_Volume_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            // wenn der Lautstaerkeschieberegler, Wert fuer Lautstaerke setzen
            if(sld_Volume!=null)
                BackgroundAudioPlayer.Instance.Volume = sld_Volume.Value;
        }
    }
}