using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tango.Core.Commands;
namespace Tango.FSE.Common.Navigation
{
///
/// Represents the PPC views navigation manager.
///
public interface INavigationManager
{
///
/// Occurs when the navigation manager if navigating to another view.
///
event EventHandler Navigating;
///
/// Gets the menu items.
///
ObservableCollection MenuItems { get; }
///
/// Gets the current module.
///
IFSEModule CurrentModule { get; }
///
/// Gets the current view model.
///
FSEViewModel CurrentVM { get; }
///
/// Gets a value indicating whether the navigation system is able to navigate to the previous view.
///
bool CanNavigateBack { get; }
///
/// Gets a value indicating whether the back should be enabled.
///
bool IsBackEnabled { get; set; }
///
/// Navigates to the previous view if is true.
///
Task NavigateBack();
///
/// Navigates to the previous view..
///
RelayCommand NavigateBackCommand { get; }
///
/// Navigates to the specified full path in command parameter.
///
RelayCommand NavigateToCommand { get; }
///
/// Navigates to the specified PPC view.
///
/// The view.
Task NavigateTo(NavigationView view, bool pushToHistory = true);
///
/// Navigates to the specified PPC view with the specified receive object.
///
/// The view.
Task NavigateWithObject(NavigationView view, TPass obj, bool pushToHistory = true);
///
/// Navigates to the specified module.
///
///
Task NavigateTo(bool pushToHistory = true) where T : IFSEModule;
///
/// Navigates to the specified module using the view path (e.g MainView.JobsView).
///
///
/// The view path.
Task NavigateTo(String viewPath, bool pushToHistory = true) where T : IFSEModule;
///
/// Navigates to the specified module using the view path (e.g MainView,JobsView).
/// This method makes it easy to do stuff like NavigateTo(nameof(MainView),nameof(JobsView));
///
///
/// The view path.
Task NavigateTo(bool pushToHistory = true, params String[] viewPath) where T : IFSEModule;
///
/// Navigates to the specified module and view with the specified object and expecting a return parameter.
/// The view must be of type INavigationResultProvider.
///
/// The full path.
Task NavigateForResult(TPass obj, bool pushToHistory = true)
where TModule : IFSEModule;
///
/// Navigates to the specified module and view with the specified object.
///
/// The type of the module.
/// The type of the view.
/// The type of the pass.
/// The object.
/// Push the current view to history ?.
/// Force the navigation even if we are on the same view.
///
Task NavigateWithObject(TPass obj, bool pushToHistory = true, bool force = false)
where TModule : IFSEModule;
///
/// Navigates to the specified module and view with the specified object.
/// Ideally will be used for navigating to a module that is not references by the current module.
///
/// The view full path (Module.ViewName.SubViewName).
/// The object.
/// Push the current view to history.
///
Task NavigateWithObject(String viewPath, Object obj, bool pushToHistory = true);
///
/// Clears the navigation back history.
///
void ClearHistory();
///
/// Clears the navigation back history except the specified view type.
///
void ClearHistoryExcept();
///
/// Deletes the specified history item.
///
/// The type of the module.
/// The type of the view.
void DeleteHistoryItem() where TModule : IFSEModule;
}
}