﻿/*  
	Licensed under the Apache License, Version 2.0 (the "License");
	you may not use this file except in compliance with the License.
	You may obtain a copy of the License at
	
	http://www.apache.org/licenses/LICENSE-2.0
	
	Unless required by applicable law or agreed to in writing, software
	distributed under the License is distributed on an "AS IS" BASIS,
	WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
	See the License for the specific language governing permissions and
	limitations under the License.
*/


using System;
using System.IO;
using System.Windows;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Tasks;

namespace WPCordovaClassLib.Cordova.UI
{
    public partial class ImageCapture : PhoneApplicationPage
    {
        public ImageCapture()
        {
            InitializeComponent();
        }
    }

    public class ImageCaptureTask
    {
        /// <summary>
        /// Represents an image returned from a call to the Show method of
        /// a WPCordovaClassLib.Cordova.Controls.ImageCaptureTask object
        /// </summary>
        //public class AudioResult : TaskEventArgs
        //{
        //    /// <summary>
        //    /// Initializes a new instance of the AudioResult class.
        //    /// </summary>
        //    public AudioResult()
        //    { }

        //    /// <summary>
        //    /// Initializes a new instance of the AudioResult class
        //    /// with the specified Microsoft.Phone.Tasks.TaskResult.
        //    /// </summary>
        //    /// <param name="taskResult">Associated Microsoft.Phone.Tasks.TaskResult</param>
        //    public AudioResult(TaskResult taskResult)
        //        : base(taskResult)
        //    { }

        //    /// <summary>
        //    ///  Gets the file name of the recorded audio.
        //    /// </summary>
        //    public Stream AudioFile { get; internal set; }

        //    /// <summary>
        //    /// Gets the stream containing the data for the recorded audio.
        //    /// </summary>
        //    public string AudioFileName { get; internal set; }
        //}

        ///// <summary>
        ///// Occurs when a audio recording task is completed.
        ///// </summary>
        //public event EventHandler<AudioResult> Completed;

        /// <summary>
        /// Shows Audio Recording application
        /// </summary>
        public void Show()
        {
            Deployment.Current.Dispatcher.BeginInvoke(() =>
            {
                var root = Application.Current.RootVisual as PhoneApplicationFrame;

                root.Navigated += new System.Windows.Navigation.NavigatedEventHandler(NavigationService_Navigated);

                string baseUrl = WPCordovaClassLib.Cordova.Commands.BaseCommand.GetBaseURL();

                // dummy parameter is used to always open a fresh version
                root.Navigate(new System.Uri(baseUrl + "Cordova/UI/ImageCapture.xaml?dummy=" + Guid.NewGuid().ToString(), UriKind.Relative));
            });
        }

        /// <summary>
        /// Performs additional configuration of the recording application.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void NavigationService_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e)
        {
            ImageCapture imageCapture = e.Content as ImageCapture;
            if (imageCapture != null)
            {
                (Application.Current.RootVisual as PhoneApplicationFrame).Navigated -= NavigationService_Navigated;

                //imageCapture.Completed += this.Completed;
                //else if (this.Completed != null)
                //{
                //    this.Completed(this, new AudioResult(TaskResult.Cancel));
                //}
            }
        }
    }
}