namespace FrontOffice.Main.Utilities;

/// <summary>
/// هر action ای که نیاز به لاگین دارد را از طریق این سرویس اجرا کنید.
/// اگر کاربر لاگین نباشد، مودال ورود نشان داده می‌شود.
/// پس از ورود موفق، action به صورت خودکار اجرا می‌شود.
/// </summary>
public class GuestActionGate
{
    private readonly AuthService _authService;
    private readonly AuthDialogService _authDialogService;

    public GuestActionGate(AuthService authService, AuthDialogService authDialogService)
    {
        _authService = authService;
        _authDialogService = authDialogService;
    }

    /// <summary>
    /// اگر کاربر لاگین باشد action را اجرا می‌کند.
    /// در غیر این صورت مودال لاگین را باز کرده و پس از ورود موفق، action را اجرا می‌کند.
    /// </summary>
    /// <returns>true اگر action اجرا شد، false اگر کاربر لاگین نکرد.</returns>
    public async Task<bool> RunAsync(Func<Task> action)
    {
        if (await _authService.IsAuthenticatedAsync())
        {
            await action();
            return true;
        }

        await _authDialogService.ShowAuthDialogAsync();

        if (await _authService.IsAuthenticatedAsync())
        {
            await action();
            return true;
        }

        return false;
    }
}
