using System;
using System.Windows;
using Microsoft.Phone.Controls;
using System.IO.IsolatedStorage;
using Microsoft.Phone.BackgroundTransfer;
using System.Collections.Generic;
using System.Windows.Controls;

namespace BackgroundFileTransferSample
{
    public partial class MainPage : PhoneApplicationPage
    {
        // Liste der Transferanfragen
        private IEnumerable<BackgroundTransferRequest> myTransferRequests;

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

        // Ereignismethode, die beim Anzeigen der Anwendung aufgerufen wird
        protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            RefreshGUI(true);
        }

        private void RefreshGUI(bool p_Initialize)
        {
            if (myTransferRequests != null)
            {
                // alle alten Tranfereintraege freigeben
                foreach (var request in myTransferRequests)
                {
                    request.Dispose();
                }
            }

            // Transfereintraege vom BackgroundTransferService beziehen
            myTransferRequests = BackgroundTransferService.Requests;            

            // Transfereintraege der ListBox zuweisen
            TransferListBox.ItemsSource = myTransferRequests;

            // wird die Aktualisierung der grafischen Oberfläche initial aufgerufen?
            if (p_Initialize)
            {
                // jeder Transferanfrage das TransferProgressChanged und TransferStatusChanged-Ereignis hinzufuegen
                foreach (var transferRequest in myTransferRequests)                
                {                    
                    transferRequest.TransferProgressChanged += new EventHandler<BackgroundTransferEventArgs>(transferRequest_TransferProgressChanged);
                    transferRequest.TransferStatusChanged += new EventHandler<BackgroundTransferEventArgs>(transferRequest_TransferStatusChanged);
                }
            }
        }

        // Ereignismethode, wenn sich der TransferStatus aendert
        void transferRequest_TransferStatusChanged(object sender, BackgroundTransferEventArgs e)
        {
            // neuen TransferStatus ueberprufen
            CheckTransferStatus(e.Request);
            // grafische Oberflaeche aktualisieren
            RefreshGUI(false);
        }

        // Ereignismethode, wenn sich der Transferfortschritt aendert
        void transferRequest_TransferProgressChanged(object sender, BackgroundTransferEventArgs e)
        {
            // grafische Oberflaeche aktualisieren
            RefreshGUI(false);
        }

        // Methode, die den TransferStatus auswertet
        private void CheckTransferStatus(BackgroundTransferRequest p_BackgroundTransferRequest)
        {
            // Auswerten des aktuellen TransferStatus
            switch (p_BackgroundTransferRequest.TransferStatus)
            {
                // Download ist abgeschlossen
                case TransferStatus.Completed:

                    // pruefen, ob Download erfolgreich war
                    if (p_BackgroundTransferRequest.StatusCode == 200 || p_BackgroundTransferRequest.StatusCode == 206)
                    {                        
                        MessageBox.Show("Das Herunterladen der Datei \""+ p_BackgroundTransferRequest.Tag + "\" war erfolgreich!" , "Erfolg", MessageBoxButton.OK);
                        // Transferanfrage aus BackgroundTransferService entfernen
                        RemoveTransferRequest(p_BackgroundTransferRequest.RequestId);                   
                    }
                    else
                    {
                        MessageBox.Show("Das Herunterladen der Datei ist gescheitert.\r\nStatusCode: " + p_BackgroundTransferRequest.StatusCode + "\r\nTransferError: " + p_BackgroundTransferRequest.TransferError);
                        // Transferanfrage aus BackgroundTransferService entfernen
                        RemoveTransferRequest(p_BackgroundTransferRequest.RequestId);
                    }
                    break;
                // Download erwartet, dass Geraet mit einer externen Stromversorgung verbunden wird
                case TransferStatus.WaitingForExternalPower:
                    MessageBox.Show("Der Download der Datei \"" + p_BackgroundTransferRequest.Tag + "\" startet, sobald das Gerät mit einer externen Stromversorgung verbunden wird!", "Info", MessageBoxButton.OK);
                    break;
                // Download erwartet, dass Geraet mit einer externen Stromversorgung verbunden wird, da der Stromsparmodus auf dem Geraet aktiv ist
                case TransferStatus.WaitingForExternalPowerDueToBatterySaverMode:
                    MessageBox.Show("Der Download der Datei \"" + p_BackgroundTransferRequest.Tag + "\" startet, sobald das Gerät mit einer externen Stromversorgung verbunden wird, da der Stromsparmodus auf dem Gerät aktiviert ist!", "Info", MessageBoxButton.OK);
                    break;
                // Download erwartet eine unterstützte Datenverbindung (2G, EDGE oder GPRS)
                case TransferStatus.WaitingForNonVoiceBlockingNetwork:
                    MessageBox.Show("Der Download der Datei \"" + p_BackgroundTransferRequest.Tag + "\" startet, sobald eine unterstützte Datenverbindung (2G, EDGE oder GPRS) besteht!", "Info", MessageBoxButton.OK);
                    break;
                // Download erwartet eine WLAN-Verbindung
                case TransferStatus.WaitingForWiFi:
                    MessageBox.Show("Der Download der Datei \"" + p_BackgroundTransferRequest.Tag + "\" startet, sobald das Gerät über eine WLAN-Verbindung verfügt!", "Info", MessageBoxButton.OK);
                    break;          
            }

            // grafische Oberflaeche aktualisieren
            RefreshGUI(false);
        }

        // Methode, um Transferanfrage aus dem BackgroundTransferService zu entfernen
        private void RemoveTransferRequest(string p_RequestId)
        {
            // Transferanfrage anhand der RequestId im BackgroundTransferService suchen
            BackgroundTransferRequest transferReuqestToRemove = BackgroundTransferService.Find(p_RequestId);

            if (transferReuqestToRemove != null)
            {
                // heruntergelade Dateien aus Isolated Storage loeschen
                using (IsolatedStorageFile isolatedStorageFile = IsolatedStorageFile.GetUserStoreForApplication())
                {
                    if (isolatedStorageFile.FileExists(transferReuqestToRemove.DownloadLocation.OriginalString))
                    {
                        isolatedStorageFile.DeleteFile(transferReuqestToRemove.DownloadLocation.OriginalString);
                    }                    
                }

                try
                {
                    // gefundene Transferanfrage aus BackgroundTransferService entfernen
                    BackgroundTransferService.Remove(transferReuqestToRemove);
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Beim Entfernen der Transferanfrage ist ein Fehler aufgetreten: " + ex.Message, "Fehler", MessageBoxButton.OK);
                } 
            }
        }
      
        // Ereignismethode der Downloads waehlen-Schaltflaeche
        private void btn_ChooseDownloads_Click(object sender, RoutedEventArgs e)
        {
            // Downloads waehlen Seite aufrufen
            NavigationService.Navigate(new Uri("/AddDownloadsPage.xaml", UriKind.RelativeOrAbsolute));
        }

        // Ereignismethode der X-Schaltflaeche um Transferanfragen zu loeschen
        private void btn_Cancel_Click(object sender, RoutedEventArgs e)
        {
            // Methode zum Entfernen der Transferanfrage aufrufen, RequestId wird aus Tag-Eigenschaft der Schaltflaeche gelesen
            RemoveTransferRequest(((Button)sender).Tag as string);
            // grafische Oberflaeche aktualisieren
            RefreshGUI(false);
        }
    }
}