using System;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Wino.Calendar.Views;
using Wino.Calendar.Views.Account;
using Wino.Calendar.Views.Settings;
using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Interfaces;
using Wino.Core.Domain.Models.Navigation;
using Wino.Core.UWP.Services;
using Wino.Views;

namespace Wino.Calendar.Services;

public class NavigationService : NavigationServiceBase, INavigationService
{
    public Type GetPageType(WinoPage winoPage)
    {
        return winoPage switch
        {
            WinoPage.CalendarPage => typeof(CalendarPage),
            WinoPage.SettingsPage => typeof(SettingsPage),
            WinoPage.CalendarSettingsPage => typeof(CalendarSettingsPage),
            WinoPage.AccountManagementPage => typeof(AccountManagementPage),
            WinoPage.ManageAccountsPage => typeof(ManageAccountsPage),
            WinoPage.PersonalizationPage => typeof(PersonalizationPage),
            WinoPage.AccountDetailsPage => typeof(AccountDetailsPage),
            WinoPage.EventDetailsPage => typeof(EventDetailsPage),
            _ => throw new Exception("Page is not implemented yet."),
        };
    }

    public void GoBack()
    {
        if (Window.Current.Content is Frame appFrame && appFrame.Content is AppShell shellPage)
        {
            var shellFrame = shellPage.GetShellFrame();

            if (shellFrame.CanGoBack)
            {
                shellFrame.GoBack();
            }
        }
    }

    public bool Navigate(WinoPage page, object parameter = null, NavigationReferenceFrame frame = NavigationReferenceFrame.ShellFrame, NavigationTransitionType transition = NavigationTransitionType.None)
    {
        // All navigations are performed on shell frame for calendar.

        if (Window.Current.Content is Frame appFrame && appFrame.Content is AppShell shellPage)
        {
            var shellFrame = shellPage.GetShellFrame();

            var pageType = GetPageType(page);

            shellFrame.Navigate(pageType, parameter);
            return true;
        }

        return false;
    }
}
