using Services;
using Services;
using Models;
using ShoopNCook.Views;

namespace ShoopNCook.Pages;

public partial class MyRecipesPage : ContentPage
{

    private IRecipesService service;
    private Account account;

	public MyRecipesPage(
            Account account,
            IRecipesService service)
    {
        InitializeComponent();

        this.service = service;
        this.account = account;

        service
            .GetRecipesOf(account)
            .GetAccountRecipes()
            .ForEach(AddRecipeView);
    }

    private void AddRecipeView(RecipeInfo info)
    {
        RecipesLayout.Children.Add(new OwnedRecipeView(info, () =>
        {
            Recipe recipe = service.GetRecipe(info);
            IAccountRecipesPreferencesService preferences = service.GetPreferencesOf(account);
            Shell.Current.Navigation.PushAsync(new RecipePage(recipe, preferences, 1));
        },
            () => RemoveRecipe(info)
        ));
    }

    private void RemoveRecipe(RecipeInfo info)
    {
        IAccountOwnedRecipesService recipes = service.GetRecipesOf(account);

        if (!recipes.RemoveRecipe(info))
        {
            UserNotifier.Error("Could not remove recipe");
            return;
        }
        foreach (OwnedRecipeView view in RecipesLayout.Children)
        {
            if (view.IsViewing(info))
            {
                RecipesLayout.Remove(view);
                break;
            }
        }
        UserNotifier.Success("Recipe successfully removed");
    }

    private async void OnBackButtonClicked(object sender, EventArgs e)
    {
        await Navigation.PopAsync();
    }
    private async void OnAddRecipeButtonClicked(object sender, EventArgs e)
    {
        IAccountOwnedRecipesService recipes = service.GetRecipesOf(account);

        var page = new CreateRecipePage(account.User, recipe =>
        {
            if (!recipes.UploadRecipe(recipe))
            {
                UserNotifier.Error("Could not upload recipe.");
                return;
            }
            UserNotifier.Success("Recipe Successfuly uploaded !");
            AddRecipeView(recipe.Info);
            Shell.Current.Navigation.PopAsync(); //go back to current recipe page.
        });
        Shell.Current.Navigation.PushAsync(page); //display RecipePage editor
    }
}