using DomainObjects;
using DataProviders.Collections;
using DomainObjects.Documents;
using ExtensionMethods;
using Extensions;
using Microsoft.AspNetCore.Authorization;
using WeatherForecast.Services;
namespace WeatherForecast.Policies.Abstractions;
/// 
/// 
/// 
/// 
public abstract class AuthorizationHandlerBase : AuthorizationHandler where TRequirement : IAuthorizationRequirement {
  private readonly IHttpContextAccessor _contextAccessor;
  private readonly IUserDataProvider _userDataProvider;
  private readonly IAccountPolicyService _accountService;
  /// 
  /// 
  /// 
  /// 
  /// 
  /// 
  public AuthorizationHandlerBase(
    IHttpContextAccessor contextAccessor,
    IUserDataProvider userDataProvider,
    IAccountPolicyService accountService
  ) {
    _contextAccessor = contextAccessor;
    _userDataProvider = userDataProvider;
    _accountService = accountService;
  }
  /// 
  /// 
  /// 
  /// 
  /// 
  protected UserDocument? GetUser(AuthorizationHandlerContext context) {
    if (context == null)
      return null;
    var userId = context.User?.Identity?.Name?.ToNullableGuid();
    var bearerToken = _contextAccessor.HttpContext?.Request?.GeBearerToken();
    if (userId == null || bearerToken == null)
      return null;
    var (user, getUserResult) = _userDataProvider.Get(userId.Value);
    if (!getUserResult.IsSuccess || user == null)
      return null;
    if (!_accountService.Authenticate(user, bearerToken).IsSuccess)
      return null;
    return user;
  }
}
/// 
/// 
/// 
/// 
/// 
public abstract class AuthorizationHandlerBase : AuthorizationHandler where TRequirement : IAuthorizationRequirement {
  private readonly IHttpContextAccessor _contextAccessor;
  private readonly IUserDataProvider _userDataProvider;
  private readonly IAccountPolicyService _accountService;
  /// 
  /// 
  /// 
  /// 
  /// 
  /// 
  public AuthorizationHandlerBase(
    IHttpContextAccessor contextAccessor,
    IUserDataProvider userDataProvider,
    IAccountPolicyService accountService
  ) {
    _contextAccessor = contextAccessor;
    _userDataProvider = userDataProvider;
    _accountService = accountService;
  }
  /// 
  ///                        
  /// 
  /// 
  /// 
  protected UserDocument? GetUser(AuthorizationHandlerContext context) {
    if (context == null)
      return null;
    var userId = context.User?.Identity?.Name?.ToNullableGuid();
    var bearerToken = _contextAccessor.HttpContext?.Request?.GeBearerToken();
    if (userId == null || bearerToken == null)
      return null;
    var (user, getUserResult) = _userDataProvider.Get(userId.Value);
    if (!getUserResult.IsSuccess || user == null)
      return null;
    if (!_accountService.Authenticate(user, bearerToken).IsSuccess)
      return null;
    return user;
  }
}