using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Xml;
using System.Xml.XPath;
using Microsoft.SmartDevice.Connectivity;

namespace DeploymentApplication
{
    public class MainFormController
    {
        private MainForm myMainForm;

        private Guid productID;
        private DatastoreManager myDatastoreManager;
        private Device WP7Device;
        private Platform WP7SDK;

        public string ExceptionMessage {get;private set;}
        
        public MainFormController(MainForm pMainForm)
        {
            myMainForm = pMainForm;

            // Initialisiere WP7 Plattform
            myDatastoreManager = new DatastoreManager(CultureInfo.CurrentUICulture.LCID);
            WP7SDK = myDatastoreManager.GetPlatforms().Single(p => p.Name == "Windows Phone 7");
        }

        public string GetProductID(string pFile)
        {
            try
            {
                // Auslesen der ProductID aus der Manifestdatei
                XmlDocument myXmlDocument = new XmlDocument();
                myXmlDocument.Load(pFile);
                XmlElement root = myXmlDocument.DocumentElement;
                return root["App"].Attributes["ProductID"].Value;
            }
            catch (Exception ex)
            {
                ExceptionMessage = ex.Message;
                return null;
            }
        }

        /// <summary>
        /// 
        /// </summary>
        public void DeploySilverlightApp()
        {
            myMainForm.tb_SilverStatus.Text += "Bereitstellung wurde gestartet\r\n";

            try
            {
                // bilden der ProductID als GUID
                productID = new Guid(myMainForm.tb_SilverPID.Text);
            }
            catch (Exception)
            {
                myMainForm.tb_SilverStatus.Text += "ProductID konnte nicht erstellt werden\r\n";
                return;
            }

            // Setzen des Device (Emulator oder Gerät)
            if (myMainForm.rb_SilverEmulator256.Checked)
            {
                WP7Device = WP7SDK.GetDevices().Single(d => d.Name.StartsWith("Windows Phone Emulator - 256 MB"));
                myMainForm.tb_SilverStatus.Text += "Verbindung zum Emulator mit 256 MB wird hergestellt\r\n";
            }
            else if (myMainForm.rb_SilverEmulator512.Checked)
            {
                WP7Device = WP7SDK.GetDevices().Single(d => d.Name.StartsWith("Windows Phone Emulator - 512 MB"));
                myMainForm.tb_SilverStatus.Text += "Verbindung zum Emulator mit 512 MB wird hergestellt\r\n";
            }
            else
            {
                WP7Device = WP7SDK.GetDevices().Single(d => d.Name == "Windows Phone Device");
                myMainForm.tb_SilverStatus.Text += "Verbindung zum Gerät wird hergestellt\r\n";
            }

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

            // Prüfung, ob Verbindung erfolgreich aufgebaut wurde
            if (WP7Device.IsConnected())
            {
                myMainForm.tb_SilverStatus.Text += "Verbindung wurde erfolgreich hergestellt\r\n";

                // Prüfung, ob Anwendung bereits installiert ist
                if (WP7Device.IsApplicationInstalled(productID))
                {
                    myMainForm.tb_SilverStatus.Text += "Anwendung ist bereits installiert\r\n";

                    // Anwendung deinstallieren
                    var remoteApplication = WP7Device.GetApplication(productID);
                    myMainForm.tb_SilverStatus.Text += "Anwendung wird deinstalliert\r\n";
                    remoteApplication.Uninstall();

                    // Anwendung erfolgreich deinstalliert?
                    if (WP7Device.IsApplicationInstalled(productID))
                    {
                        myMainForm.tb_SilverStatus.Text += "Anwendung wurde nicht korrekt deinstalliert\r\n";
                    }
                    else
                    {
                        myMainForm.tb_SilverStatus.Text += "Anwendung wurde erfolgreich deinstalliert\r\n";
                    }
                }

                myMainForm.tb_SilverStatus.Text += "Anwendung wird installiert\r\n";

                // Anwendung installieren                
                var installApp = WP7Device.InstallApplication(productID, productID, "NormalApp", myMainForm.tb_SilverIcon.Text, myMainForm.tb_SilverApp.Text);

                // Anwendung erfolgreich installiert?
                if (WP7Device.IsApplicationInstalled(productID))
                {
                    myMainForm.tb_SilverStatus.Text += "Anwendung wurde erfolgreich installiert\r\n";

                    if (myMainForm.cb_SilverLaunch.Checked)
                    {
                        // starten der installierten Anwendung
                        installApp.Launch();

                        myMainForm.tb_SilverStatus.Text += "Anwendung wurde gestartet\r\n";
                    }
                }
                else
                {
                    myMainForm.tb_SilverStatus.Text += "Anwendung wurde korrekt deinstalliert\r\n";
                }
            }
            else
            {
                myMainForm.tb_SilverStatus.Text += "Verbindung zum Geräte konnte nicht hergestellt werden\r\n";
            }            
        }

        /// <summary>
        /// Methode zum Bereitstellen einer XNA Anwendung mit Hilfe der Connectivity DLL
        /// </summary>
        public void DeployXNAApp()
        {
            myMainForm.tb_XNAStatus.Text += "Bereitstellung wurde gestartet\r\n";

            try
            {
                // bilden der ProductID als GUID
                productID = new Guid(myMainForm.tb_XNAPID.Text);
            }
            catch (Exception)
            {
                myMainForm.tb_XNAStatus.Text += "ProductID konnte nicht erstellt werden\r\n";
                return;
            }

            // Setzen des Device (Emulator oder Gerät)
            if (myMainForm.rb_SilverEmulator256.Checked)
            {
                WP7Device = WP7SDK.GetDevices().Single(d => d.Name.StartsWith("Windows Phone Emulator - 256 MB"));
                myMainForm.tb_SilverStatus.Text += "Verbindung zum Emulator mit 256 MB wird hergestellt\r\n";
            }
            else if (myMainForm.rb_SilverEmulator512.Checked)
            {
                WP7Device = WP7SDK.GetDevices().Single(d => d.Name.StartsWith("Windows Phone Emulator - 512 MB"));
                myMainForm.tb_SilverStatus.Text += "Verbindung zum Emulator mit 512 MB wird hergestellt\r\n";
            }
            else
            {
                WP7Device = WP7SDK.GetDevices().Single(d => d.Name == "Windows Phone Device");
                myMainForm.tb_SilverStatus.Text += "Verbindung zum Gerät wird hergestellt\r\n";
            }

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

            // Prüfung, ob Verbindung erfolgreich aufgebaut wurde
            if (WP7Device.IsConnected())
            {
                myMainForm.tb_XNAStatus.Text += "Verbindung wurde erfolgreich hergestellt\r\n";

                // Prüfung, ob Anwendung bereits installiert ist
                if (WP7Device.IsApplicationInstalled(productID))
                {
                    myMainForm.tb_XNAStatus.Text += "Anwendung ist bereits installiert\r\n";

                    // Anwendung deinstallieren
                    var remoteApplication = WP7Device.GetApplication(productID);
                    myMainForm.tb_XNAStatus.Text += "Anwendung wird deinstalliert\r\n";
                    remoteApplication.Uninstall();

                    // Anwendung erfolgreich deinstalliert?
                    if (WP7Device.IsApplicationInstalled(productID))
                    {
                        myMainForm.tb_XNAStatus.Text += "Anwendung wurde nicht korrekt deinstalliert\r\n";
                    }
                    else
                    {
                        myMainForm.tb_XNAStatus.Text += "Anwendung wurde erfolgreich deinstalliert\r\n";
                    }
                }

                myMainForm.tb_XNAStatus.Text += "Anwendung wird installiert\r\n";

                // 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));
                }

                // Anwendung installieren                
                var installApp = WP7Device.InstallApplication(productID, productID, "NormalApp", myMainForm.tb_XNAIcon.Text, myMainForm.tb_XNAApp.Text);

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

                // Anwendung erfolgreich installiert?
                if (WP7Device.IsApplicationInstalled(productID))
                {
                    myMainForm.tb_XNAStatus.Text += "Anwendung wurde erfolgreich installiert\r\n";

                    if (myMainForm.cb_XNALaunch.Checked)
                    {
                        // starten der installierten Anwendung
                        installApp.Launch();

                        myMainForm.tb_XNAStatus.Text += "Anwendung wurde gestartet\r\n";
                    }
                }
                else
                {
                    myMainForm.tb_XNAStatus.Text += "Anwendung wurde korrekt deinstalliert\r\n";
                }
            }
            else
            {
                myMainForm.tb_XNAStatus.Text += "Verbindung zum Geräte konnte nicht hergestellt werden\r\n";
            }            
        }

    }
}
