using System;
using System.Threading.Tasks;
using TINK.ViewModel;
using TINK.ViewModel.WhatsNew.Agb;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;

namespace TINK.View.WhatsNew.Agb
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
	public partial class AgbPage : ContentPage, IViewService
	{
		public AgbPage ()
		{
			InitializeComponent ();

            agbViewModel = new AgbViewModel(
                App.ModelRoot.NextActiveUri.Host,
                App.ModelRoot.IsSiteCachingOn,
                (resourceName) => ViewModelResourceHelper.GetSource(resourceName),
                this);

            BindingContext = agbViewModel;
        }

        /// <summary> Displays alert message.</summary>
        /// <param name="title">Title of message.</param>
        /// <param name="message">Message to display.</param>
        /// <param name="details">Detailed error description.</param>
        /// <param name="cancel">Type of buttons.</param>
        public async Task DisplayAdvancedAlert(
            string title,
            string message,
            string details,
            string cancel)
            => await App.Current.MainPage.DisplayAlert(title, $"{message}\r\nDetails:\r\n{details}", cancel);

        /// <summary> Displays detailed alert message.</summary>
        /// <param name="title">Title of message.</param>
        /// <param name="message">Message to display.</param>
        /// <param name="details">Detailed error description.</param>
        /// <param name="accept">Text of accept button.</param>
        /// <param name="cancel">Text of cancel button.</param>
        /// <returns>True if user pressed accept.</returns>
        public async Task<bool> DisplayAdvancedAlert(string title, string message, string details, string accept, string cancel)
            => await App.Current.MainPage.DisplayAlert(title, $"{message}\r\nDetails:\r\n{details}", accept, cancel);

        /// <summary> Invoked when page is shown. </summary>
        protected async override void OnAppearing()
            => await agbViewModel.OnAppearing();           

        /// <summary> Reference to view model.</summary>
        AgbViewModel agbViewModel;

        public async Task PopModalAsync()
            => await Navigation.PopModalAsync();

        /// <summary> Pushes a page onto the stack. </summary>
        /// <param name="p_oTypeOfPage">Page to display.</param>
        public Task PushAsync(ViewTypes p_oTypeOfPage)
            => throw new NotImplementedException();

        public Task PushModalAsync(ViewTypes p_oTypeOfPage)
            => throw new NotImplementedException();

#if USEFLYOUT
        public void ShowPage(ViewTypes p_oType, string p_strTitle = null)
            => throw new NotImplementedException();
#else
        /// <summary> Shows a page.</summary>
        /// <param name="route">Route of the page to show.</param>
        public async Task ShowPage(string route) => await Shell.Current.GoToAsync(route);
#endif

#if USCSHARP9
        public Task<IViewService.IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#else
        public Task<IUserFeedback> DisplayUserFeedbackPopup() => throw new NotSupportedException();
#endif
    }
}