using Core.Enumerations;
using ExtensionMethods;
using Extensions;
using Microsoft.AspNetCore.Authorization;
using WeatherForecast.Services;
namespace WeatherForecast.Policies {
  /// 
  /// 
  /// 
  public class CrudAuthorizationHandler : AuthorizationHandler {
    private readonly IHttpContextAccessor _contextAccessor;
    private readonly IUserService _authenticationService;
    /// 
    /// 
    /// 
    /// 
    /// 
    public CrudAuthorizationHandler(
      IHttpContextAccessor contextAccessor,
      IUserService authenticationService
    ) {
      _contextAccessor = contextAccessor;
      _authenticationService = authenticationService;
    }
    /// 
    /// 
    /// 
    /// 
    /// 
    /// 
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CrudActionRequirement requirement) {
      var user = context.User;
      var identity = user.Identity;
      var name = identity?.Name;
      var userId = name?.ToNullableGuid();
      var request = _contextAccessor?.HttpContext?.Request;
      var bearerToken = request?.GeBearerToken();  
      if (_authenticationService.VerifyToken(userId, bearerToken, requirement.Controller, requirement.Action).IsSuccess)
          context.Succeed(requirement);
      return Task.CompletedTask;
    }
  }
  /// 
  /// 
  /// 
  public class CrudActionRequirement : IAuthorizationRequirement {
    /// 
    /// 
    /// 
    public WebapiControllers Controller { get; }
    /// 
    /// 
    /// 
    public CrudActions Action { get; }
    /// 
    /// 
    /// 
    public bool SameAuthor { get;  }
    /// 
    /// 
    /// 
    /// 
    public CrudActionRequirement(WebapiControllers controller, CrudActions crudAction, bool sameAuthor = false) {
      Controller = controller;
      Action = crudAction;
      SameAuthor = sameAuthor;
    }
  }
}