using AsbCloudApp.Data;
using AsbCloudApp.Services;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Routing;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;

namespace AsbCloudWebApi.Controllers;

/// <summary>
/// Редактор разрешений пользователей для админки
/// </summary>
[Route("api/admin/permission")]
[ApiController]
[Authorize]
public class AdminPermissionController : CrudController<PermissionDto, ICrudRepository<PermissionDto>>
{
    public AdminPermissionController(ICrudRepository<PermissionDto> service)
        : base(service)
    { }

    [HttpGet("Autogenerated")]
    [Permission]
    public IActionResult GetAutogenerated()
    {
        var controllers = Assembly.GetExecutingAssembly().GetTypes().
            Where(type => typeof(ControllerBase).IsAssignableFrom(type) && !type.IsAbstract)
            .ToList();

        var permissions = new SortedSet<string>();
        foreach (var controller in controllers)
        {
            var methods = controller.GetMethods().Where(m => m.IsPublic);
            var controllerName = controller.Name.Replace("Controller", "");
            foreach (var method in methods)
            {
                var httpMethod = method.GetCustomAttribute<HttpMethodAttribute>()?.HttpMethods?.First().ToLower();
                switch (httpMethod)
                {
                    case "get":
                    case "delete":
                        permissions.Add($"{controllerName}.{httpMethod.ToLower()}");
                        continue;
                    case "post":
                    case "put":
                    case "patch":
                        permissions.Add($"{controllerName}.edit");
                        continue;
                    default:
                        continue;
                }

            }
        }

        return Ok(permissions);

    }
}