using Microsoft.Phone.Controls;
using Microsoft.Phone.Scheduler;
using System;
using System.Windows;
using System.Windows.Threading;
using System.Collections.Generic;

namespace ScheduledTaskAgentSample
{
    public partial class MainPage : PhoneApplicationPage
    {
        // Definition des PeriodicTask und ResourceIntensiveTask
        private PeriodicTask myPeriodicTask;
        private ResourceIntensiveTask myResourceIntensiveTask;

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

        // Ereignismethode, die beim Anzeigen der Anwendung aufgerufen wird
        protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            // PeriodicTask anhand des Namens im ScheduledActionService
            myPeriodicTask = ScheduledActionService.Find("Mein PeriodicTask") as PeriodicTask;

            if (myPeriodicTask != null)
            {
                // wenn PeriodicTask vorhanden, dann Schaltflaeche bennen und entsprechende GUI aktualisieren
                btn_PeriodicTask.Content = "Entfernen";
                RefreshGUIForPeriodicTask();
            }

            // ResourceIntensiveTask anhand des Namens im ScheduledActionService
            myResourceIntensiveTask = ScheduledActionService.Find("Mein ResourceIntensiveTask") as ResourceIntensiveTask;

            if (myResourceIntensiveTask != null)
            {
                // wenn ResourceIntensiveTask vorhanden, dann Schaltflaeche bennen und entsprechende GUI aktualisieren
                btn_ResourceIntensiveTask.Content = "Entfernen";
                RefreshGUIForResourceIntensiveTask();
            }           
        }

        // Methode, um ein PeriodicTask dem ScheduledActionService hinzuzufuegen
        private void AddPeriodicTask()
        {
            // PeriodicTask mit Name initialisieren
            myPeriodicTask = new PeriodicTask("Mein PeriodicTask");


            // Auslaufzeitpunkt setzen
            myPeriodicTask.ExpirationTime = DateTime.Now.AddMinutes(60);
  
            // Beschreibungstext setzen
            myPeriodicTask.Description = "Dieser Task ist ein Beispiel für einen PeriodicTask.";          
            
            try
            {
                // PeriodicTask dem ScheduledActionService hinzufuegen
                ScheduledActionService.Add(myPeriodicTask);

                // Schaltflaeche bennen und entsprechende GUI aktualisieren
                btn_PeriodicTask.Content = "Entfernen";
                RefreshGUIForPeriodicTask();

#if(DEBUG)
                ScheduledActionService.LaunchForTest("Mein PeriodicTask", TimeSpan.FromSeconds(10));
#endif
            }
            catch (InvalidOperationException ex)
            {
                if (ex.Message.Contains("BNS Error: The action is disabled"))
                {
                    MessageBox.Show("Beim Hinzufügen des PeriodicTask ist ein Fehler aufgetreten. Der Background Agents für diese Anwendung wurde vom Benutzer deaktiviert!" + ex.Message,"Fehler", MessageBoxButton.OK);
                }
                else
                {
                    MessageBox.Show("Beim Hinzufügen des PeriodicTask ist ein Fehler aufgetreten: " + ex.Message,"Fehler", MessageBoxButton.OK);
                }
            }
        }

        // Methode, um einen PeriodicTask aus dem ScheduledActionService zu entfernen
        private void RemovePeriodicTask()
        {
            try
            {
                // PeriodicTask anhand des Namens aus dem ScheduledActionService entfernen
                ScheduledActionService.Remove("Mein PeriodicTask");

                // Referenz des Task wieder freigeben
                myPeriodicTask = null;
                // entsprechende GUI aktualisieren
                RefreshGUIForPeriodicTask();
                // Schaltflaeche benennen
                btn_PeriodicTask.Content = "Hinzufügen";
            }
            catch (Exception ex)
            {
                MessageBox.Show("Beim Entfernen des PeriodicTask ist ein Fehler aufgetreten: " + ex.Message, "Fehler", MessageBoxButton.OK);
            }
        }

        // Ereignisbehandlung der Schaltflaeche des PeriodicTask
        private void btn_PeriodicTask_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            if (myPeriodicTask != null)
            {
                // wenn ein PeriodicTask vorhanden ist, diesen entfernen
                RemovePeriodicTask();
            }
            else
            {
                // wenn kein PeriodicTask vorhanden ist, eine hinzufügen
                AddPeriodicTask();
            }
        }

        // Methode, um die GUI-Elemente des PeriodicTask zu aktualisieren
        private void RefreshGUIForPeriodicTask()
        {
            if (myPeriodicTask != null)
            {
                // wenn ein PeriodicTask vorhanden ist, Werte auslesen und anzeigen
                tbk_PTIsScheduled.Text = myPeriodicTask.IsScheduled.ToString();
                tbk_PTExpirationTime.Text = myPeriodicTask.ExpirationTime.ToString("MM.dd.yyyy HH:mm:ss");
                tbk_PTLastExitReason.Text = myPeriodicTask.LastExitReason.ToString();
                tbk_PTLastScheduledTime.Text = myPeriodicTask.LastScheduledTime.ToString("MM.dd.yyyy HH:mm:ss");
            }
            else 
            {
                // wenn kein PeriodicTask vorhanden ist, Leerwerte anzeigen
                tbk_PTIsScheduled.Text = string.Empty;
                tbk_PTExpirationTime.Text = string.Empty;
                tbk_PTLastExitReason.Text = string.Empty;
                tbk_PTLastScheduledTime.Text = string.Empty;
            }
        }

        // Methode, um ein ResourceIntensiveTask dem ScheduledActionService hinzuzufuegen
        private void AddResourceIntensiveTask()
        {
            // ResourceIntensiveTask mit Name initialisieren
            myResourceIntensiveTask = new ResourceIntensiveTask("Mein ResourceIntensiveTask");

            // Ablaufzeitpunkt setzen
            myResourceIntensiveTask.ExpirationTime = DateTime.Now.AddDays(7);

            // Beschreibung setzen
            myResourceIntensiveTask.Description = "Dieser Task ist ein Beispiel für einen ResourceIntensiveTask.";

            try
            {
                // ResourceIntensiveTask dem ScheduledActionService hinzufuegen
                ScheduledActionService.Add(myResourceIntensiveTask);

                // Schaltflaeche benennen und entsprechende GUI aktualisieren
                btn_ResourceIntensiveTask.Content = "Entfernen";
                RefreshGUIForResourceIntensiveTask();

#if(DEBUG)
                ScheduledActionService.LaunchForTest("Mein PeriodicTask", TimeSpan.FromSeconds(10));
#endif
            }
            catch (InvalidOperationException ex)
            {
                if (ex.Message.Contains("BNS Error: The action is disabled"))
                {
                    MessageBox.Show("Beim Hinzufügen des ResourceIntensiveTask ist ein Fehler aufgetreten. Der Background Agents für diese Anwendung wurde vom Benutzer deaktiviert!" + ex.Message, "Fehler", MessageBoxButton.OK);
                }
                else
                {
                    MessageBox.Show("Beim Hinzufügen des ResourceIntensiveTask ist ein Fehler aufgetreten: " + ex.Message, "Fehler", MessageBoxButton.OK);
                }
            }        
        }

        // Methode, um einen ResourceIntensiveTask aus dem ScheduledActionService zu entfernen
        private void RemoveResourceIntensiveTask()
        {
            try
            {
                // ResourceIntensiveTask anhand des Namens aus dem ScheduledActionService entfernen
                ScheduledActionService.Remove("Mein ResourceIntensiveTask");

                // Referenz des Task wieder freigeben
                myResourceIntensiveTask = null;
                // entsprechende GUI aktualisieren
                RefreshGUIForResourceIntensiveTask();
                // Schaltflaeche benennen
                btn_ResourceIntensiveTask.Content = "Hinzufügen";
            }
            catch (Exception ex)
            {
                MessageBox.Show("Beim Entfernen des PeriodicTask ist ein Fehler aufgetreten: " + ex.Message, "Fehler", MessageBoxButton.OK);
            }
        }

        // Ereignisbehandlung der Schaltflaeche des ResourceIntensiveTask
        private void btn_ResourceIntensiveTask_Click(object sender, RoutedEventArgs e)
        {
            if (myResourceIntensiveTask != null)
            {
                // wenn ein ResourceIntensiveTask vorhanden ist, diesen entfernen
                RemoveResourceIntensiveTask();
            }
            else
            {
                // wenn kein ResourceIntensiveTask vorhanden ist, eine hinzufügen
                AddResourceIntensiveTask();
            }
        }

        // Methode, um die GUI-Elemente des ResourceIntensiveTask zu aktualisieren
        private void RefreshGUIForResourceIntensiveTask()
        {
            if (myResourceIntensiveTask != null)
            {
                // wenn ein ResourceIntensiveTask vorhanden ist, Werte auslesen und anzeigen
                tbk_RITIsScheduled.Text = myResourceIntensiveTask.IsScheduled.ToString();
                tbk_RITExpirationTime.Text = myResourceIntensiveTask.ExpirationTime.ToString("MM.dd.yyyy HH:mm:ss");
                tbk_RITLastExitReason.Text = myResourceIntensiveTask.LastExitReason.ToString();
                tbk_RITLastScheduledTime.Text = myResourceIntensiveTask.LastScheduledTime.ToString("MM.dd.yyyy HH:mm:ss");
            }
            else
            {
                // wenn kein ResourceIntensiveTask vorhanden ist, Leerwerte anzeigen
                tbk_RITIsScheduled.Text = string.Empty;
                tbk_RITExpirationTime.Text = string.Empty;
                tbk_RITLastExitReason.Text = string.Empty;
                tbk_RITLastScheduledTime.Text = string.Empty;
            }
        }
    }
}