using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Xml.XPath;

// Namespace für die Remoteverbindung unter Verwendung der Microsoft.Smartdevice.Connectivity.dll
using Microsoft.SmartDevice.Connectivity;

namespace DeploymentExample
{
    class XNADeployment
    {
        static void Main(string[] args)
        {
            // Product ID der Anwendung
            var productID = new Guid("ba971892-de57-4fa4-b7e6-65d9d6da5af7");

            // Initialisierung des Datastore Managers
            DatastoreManager myDatastoreManager = new DatastoreManager(CultureInfo.CurrentUICulture.LCID);

            // Auswählen der Windows Phone 7 Plattform
            Platform WP7SDK = myDatastoreManager.GetPlatforms().Single(p => p.Name == "Windows Phone 7");

            // Auswählen des Gerätes; hier der Emulator
            Device WP7Device = WP7SDK.GetDevices().Single(d => d.Name == "Windows Phone 7 Emulator");

            // für die Verbindung zu einem Endgerät
            // Device WP7Device = WP7SDK.GetDevices().Single(d => d.Name == "Windows Phone 7 Device");

            // Verbindung zum Emulator/Gerät herstellen
            WP7Device.Connect();

            // Prüfung, ob ist Emulator/Gerät verdunden ist
            if (WP7Device.IsConnected())
            {
                // Prüfung, ob Anwendung bereits installiert ist
                if (WP7Device.IsApplicationInstalled(productID))
                {
                    // Anwendung deinstallieren
                    WP7Device.GetApplication(productID).Uninstall();
                }

                // Auslesen der Cachedatei als XML
                XPathDocument xapCacheFile = new XPathDocument("XapCacheFile.xml");
               
                IEnumerable<XPathNavigator> pathNavigator = xapCacheFile.CreateNavigator().Select("//file").Cast<XPathNavigator>();
                
                List<string> fileList = new List<string>();
                List<string> pathList = new List<string>();
                
                foreach (XPathNavigator navigator in pathNavigator)
                {
                    // Auslesen der Sourcenamen und Pfade
                    fileList.Add(navigator.GetAttribute("source", string.Empty));
                    pathList.Add(navigator.GetAttribute("archivePath", string.Empty));
                }

                try
                {
                    // Anwendung installieren
                    // benoetigte Parameter, die vor der Ausfuehrung entsprechend gesetzt werden muessen
                    //
                    // Produkt ID der bereitzustellenden Applikation, Produkt ID der bereitzustellenden Applikation, Kategorie, Icondatei, Applikation
                    var installApp = WP7Device.InstallApplication(productID, productID, "Game", "test.png", "test.xap");

                    // Setzen der Sourcenamen und Pfade
                    installApp.UpdateInstalledFilesInfo(fileList.ToArray(), pathList.ToArray());

                    // Anwendung starten
                    installApp.Launch();
                }
                catch (ArgumentException)
                {
                    Console.WriteLine("Sie haben falsche bzw. ungültige Argumente beim Aufruf der InstallApplication-Methode angegeben!");
                }                                       
            }
        }
    }
}
