using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Notification;
using System.ServiceModel;
using System.Diagnostics;
using System.IO;

namespace WP7PushClient
{
    public partial class MainPage : PhoneApplicationPage
    {
        string channelName = "WP7NotifyTest";
        HttpNotificationChannel channel;
        GetNotificationURLService.ReceiveNotificationURLServiceClient client;

        // Constructor
        public MainPage()
        {
            InitializeComponent();

            client = new GetNotificationURLService.ReceiveNotificationURLServiceClient();
            //Endpunktadresse, über welche der WCF Dienst erreicht werden kann
            client.Endpoint.Address = new EndpointAddress("http://192.168.179.20:8080/ReceiveNotificationURLService");
        }
        private void btnBind_Click(object sender, RoutedEventArgs e)
        {
            channel = HttpNotificationChannel.Find(channelName);

            if (channel == null)
            {
                //Der Kanal für die Push Benachrichtigungen wird erstellt
                channel = new HttpNotificationChannel(channelName);
                //Wird die URL für den Kanal erstellt, so wird dieses Ereignis ausgeführt
                channel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(channel_ChannelUriUpdated);
                //Dieses Ereignis empfängt die RAW Notification Nachrichten
                channel.HttpNotificationReceived += new EventHandler<HttpNotificationEventArgs>(channel_HttpNotificationReceived);
                channel.ShellToastNotificationReceived += new EventHandler<NotificationEventArgs>(channel_ShellToastNotificationReceived);
                channel.Open();
                //Aktiviert die Toast - Benachrichtigungen
                channel.BindToShellToast();
                //Aktiviert die Tile - Benachrichtigungen
                channel.BindToShellTile();
                btnBind.IsEnabled = false;
                btnUnbind.IsEnabled = true;
            }
            else
            {
                //Der Kanal für die Push Benachrichtigungen ist bereits geöffnet
                channel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(channel_ChannelUriUpdated);
                //Dieses Ereignis empfängt die RAW Notification Nachrichten
                channel.HttpNotificationReceived += new EventHandler<HttpNotificationEventArgs>(channel_HttpNotificationReceived);
                btnBind.IsEnabled = false;
                btnUnbind.IsEnabled = true;
            }
        }

        void channel_ShellToastNotificationReceived(object sender, NotificationEventArgs e)
        {
            Dispatcher.BeginInvoke(
                () =>
                    MessageBox.Show(String.Format(
                        "Toast empfangen!\r\nÜberschrift: {0}\r\nNachricht: {1}",
                            e.Collection["wp:Text1"], e.Collection["wp:Text2"]))
            );
        }

        //Ereignisbehandlung für RAW Notifications
        void channel_HttpNotificationReceived(object sender, HttpNotificationEventArgs e)
        {
            //Da asynchron aufgerufen, muss über den Dispatcher die Eigenschaft auf dem Mainthread geändert werden
            //Ansonsten gibt es hier eine Exception
            Dispatcher.BeginInvoke(() =>
            {
                StreamReader sr = new StreamReader(e.Notification.Body);
                txtRAWData.Text = sr.ReadToEnd();
                sr.Close();
            });
        }

        void channel_ChannelUriUpdated(object sender, NotificationChannelUriEventArgs e)
        {
            //Senden der URL für diesen Kanal an den Desktop WCF Dienst
            client.GetNotificationURLAsync(e.ChannelUri.ToString());
            Debug.WriteLine(e.ChannelUri.ToString());
        }

        private void btnUnbind_Click(object sender, RoutedEventArgs e)
        {
            //Beenden der Überwachung der Push Benachrichtigungen
            channel.UnbindToShellTile();
            channel.UnbindToShellToast();
            channel.Close();
            btnBind.IsEnabled = true;
            btnUnbind.IsEnabled = false;

        }

    }
}