using Microsoft.AspNetCore.Authorization;
using DomainObjects.Documents;
using Core.Enumerations;
using DataProviders.Collections;
using WeatherForecast.Policies.Abstractions;
using WeatherForecast.Services;
using DomainObjects.Enumerations;
namespace WeatherForecast.Policies;
/// 
/// 
/// 
public class BlogAuthorizationHandler : AuthorizationHandlerBase> {
  /// 
  /// 
  /// 
  /// 
  /// 
  /// 
  public BlogAuthorizationHandler(
    IHttpContextAccessor contextAccessor,
    IUserDataProvider userDataProvider,
    IAccountPolicyService accountService
  ) : base(contextAccessor, userDataProvider, accountService) { }
  /// 
  /// 
  /// 
  /// 
  /// 
  /// 
  /// 
  protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, BlogAuthorizationRequirement requirement, List resource) {
    var user = GetUser(context);
    if (user == null)
      return Task.CompletedTask;
    // Can only Admin, Editor, Author, Contributor (cannot set publish date)
    if (requirement.Action == CrudActions.Create
      && (user.Role != Roles.Admin
      && user.Role != Roles.Editor
      && user.Role != Roles.Author
      && user.Role != Roles.Contributor
      && (user.Role == Roles.Contributor && resource.Any(x => x.Published != null))))
      return Task.CompletedTask;
    // Can only Admin, Editor, Author, Contributor
    if (requirement.Action == CrudActions.Read
      && (user.Role != Roles.Admin
      && user.Role != Roles.Editor
      && user.Role != Roles.Author
      && user.Role != Roles.Contributor))
      return Task.CompletedTask;
    // Can only Admin, Editor, Author (own), Contributor (own, not yet pubblished)
    if ((requirement.Action == CrudActions.Update || requirement.Action == CrudActions.Delete)
      && (user.Role != Roles.Admin
      && user.Role != Roles.Editor
      && user.Role != Roles.Author
      && user.Role != Roles.Contributor
      && ((user.Role == Roles.Author || user.Role == Roles.Contributor) && resource.Any(x => x.Author != user.Id))
      && (user.Role == Roles.Contributor && resource.Any(x => x.Published != null))))
      return Task.CompletedTask;
    context.Succeed(requirement);
    return Task.CompletedTask;
  }
}
/// 
/// 
/// 
public class BlogAuthorizationRequirement : AuthorizationRequirementBase { }