using AsbCloudApp.Services;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace AsbCloudWebApi.Middlewares
{
    public class PermissionsMiddlware
    {
        private readonly RequestDelegate next;

        public PermissionsMiddlware(RequestDelegate next)
        {
            this.next = next;
        }

        public async Task InvokeAsync(HttpContext context)
        {
            var endpoint = context.GetEndpoint();
            var permission = endpoint?.Metadata.GetMetadata<PermissionAttribute>();
            if (permission is null)
            {
                await next(context);
                return;
            }

            var idUser = context.User.GetUserId();
            if (idUser is null)
            {
                await context.ForbidAsync();
                return;
            }

            var permissionName = permission.Name;
            if (string.IsNullOrEmpty(permissionName))
                permissionName = endpoint.Metadata
                    .GetMetadata<Microsoft.AspNetCore.Mvc.Controllers.ControllerActionDescriptor>()
                    ?.ControllerName
                    .ToLower();
            
            var userService = context.RequestServices.GetRequiredService<IUserService>();
            var isAuthorized = userService.HasPermission((int)idUser, permissionName);

            if(isAuthorized)
                await next?.Invoke(context);
            else
                await context.ForbidAsync();
        }
    }
}