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

namespace BackgroundFileTransferSample
{
    public partial class AddDownloadsPage : PhoneApplicationPage
    {
        // Liste der herunterladbaren Datei
        private readonly List<string> myDownloadList =
           new List<string>
                {
                    "http://create.msdn.com/assets/cms/images/samples/windowsphonetestfile1.png",  
                    "http://create.msdn.com/assets/cms/images/samples/windowsphonetestfile2.png",  
                    "http://create.msdn.com/assets/cms/images/samples/windowsphonetestfile3A.png",  
                    "http://create.msdn.com/assets/cms/images/samples/windowsphonetestfile4.png",  
                    "http://create.msdn.com/assets/cms/images/samples/windowsphonetestfile5.png",  
                };

        // Hauptkontruktor der Seite AddDownloadsPage
        public AddDownloadsPage()
        {
            InitializeComponent();

            // ListBox mit herunterladbaren Dateien fuellen
            lbx_DownloadableFiles.ItemsSource = myDownloadList;

            // ueberpruefen, ob das Donwload Verzeichnis im Isolated Storeage existiert, falls nicht, wird es angelegt
            using (IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForApplication())
            {
                if (!isoStore.DirectoryExists("/transfers"))
                {
                    isoStore.CreateDirectory("/transfers");
                }
            }
        }

        // Ereignismethode beim Betaetigen der Hinzufuegen Schaltflaeche
        private void btn_AddFile_Click(object sender, RoutedEventArgs e)
        {
            // URL des Downloads
            Uri downloadUri;

            // pruefen, ob bereits 5 Downloadanfragen existieren, falls ja, Hinweismeldung ausgeben und Hinzufuegen abbrechen.
            // alternativ koennte man auch den gewaehlten Downloadpfad speichern und wenn weniger als 5 Download aktiv sind, den
            // zurueckgestellten Download dann hinzufuegen
            if (BackgroundTransferService.Requests.Count() >= 5)
            {
                MessageBox.Show("Das Maximum an Downloads für den BackgroundTransferService wurde erreicht! Die gewählte Datei wird nicht heruntergeladen!");
                return;
            }

            // URL des Downloads aus dem Tag der Schaltflaeche lesen
            try
            {
                downloadUri = new Uri(((Button)sender).Tag.ToString(), UriKind.RelativeOrAbsolute);
            }
            catch (Exception)
            {
                MessageBox.Show("Beim Herauslesen der URL ist eine Fehler aufgetreten. Der Download wurde der Werteschlange nicht hinzugefuegt!", "Fehler", MessageBoxButton.OK);
                return;
            }

            // Transferanfrage mit URL des Downloads erstellenm
            BackgroundTransferRequest backgroundTransferRequest = new BackgroundTransferRequest(downloadUri);

            // Transfermethode setzen
            // GET fuer Herunterladen, POST zum Senden
            backgroundTransferRequest.Method = "GET";

            // ermitteln des Dateinamens des Downloads und Erstellung einer Uri zum Isolated Storage
            string downloadFileName = ((Button)sender).Tag.ToString().Substring(((Button)sender).Tag.ToString().LastIndexOf("/") + 1);
            Uri localFileUri = new Uri("shared/transfers/" + downloadFileName, UriKind.RelativeOrAbsolute);

            // Uri zum Isolated Storagae als Zielpfad fuer den Download setzen
            backgroundTransferRequest.DownloadLocation = localFileUri;

            // Kommentar zum Download setzen, nicht mehr als 4000 Zeichen, als Beispiel den Dateinamen
            backgroundTransferRequest.Tag = downloadFileName;

            // anhand der Status der Auswahlfelder, Transferpraeferenzen setzen
            if (cbx_WiFi.IsChecked == false)
            {
                backgroundTransferRequest.TransferPreferences = TransferPreferences.AllowCellular;
            }
            if (cbx_Power.IsChecked == false)
            {
                backgroundTransferRequest.TransferPreferences = TransferPreferences.AllowBattery;
            }
            if (cbx_WiFi.IsChecked == false && cbx_Power.IsChecked == false)
            {
                backgroundTransferRequest.TransferPreferences = TransferPreferences.AllowCellularAndBattery;
            }

            try
            {
                // Transferanfrage dem BackgroundTransferService hinzufuegen
                BackgroundTransferService.Add(backgroundTransferRequest);
                // benutzete Ressourcen wieder freigeben
                backgroundTransferRequest.Dispose();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Der Download konnte nicht dem BackgroundTransferService hinzugefügt werden. Fehler: " + ex.Message, "Fehler", MessageBoxButton.OK);
            }
        }
    }
}