using ApplicationLayer.GeneralExceptions;
using ApplicationLayer.Services.AuthServices.LoginService.Exceptions;
using ApplicationLayer.Services.VisaApplications.Exceptions;
using FluentValidation;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
namespace SchengenVisaApi.ExceptionFilters;
/// Handles 
public class GlobalExceptionsFilter : IAsyncExceptionFilter
{
    /// 
    public async Task OnExceptionAsync(ExceptionContext context)
    {
        var exception = context.Exception;
        var problemDetails = new ProblemDetails();
        switch (exception)
        {
            case ValidationException validationException:
                problemDetails.Extensions.Add("errors", validationException.Errors.Select(e => e.ErrorMessage));
                problemDetails.Detail = "Validation errors occured";
                problemDetails.Status = StatusCodes.Status400BadRequest;
                problemDetails.Title = "Bad request";
                problemDetails.Type = "https://datatracker.ietf.org/doc/html/rfc7231#section-6.5.1";
                break;
            case ApiException:
                problemDetails.Detail = exception.Message;
                switch (exception)
                {
                    case EntityNotFoundException:
                        problemDetails.Status = StatusCodes.Status404NotFound;
                        problemDetails.Title = "Requested entity not found";
                        problemDetails.Type = "https://datatracker.ietf.org/doc/html/rfc7231#section-6.5.4";
                        break;
                    case IncorrectLoginDataException:
                        problemDetails.Status = StatusCodes.Status403Forbidden;
                        problemDetails.Title = "Auth failed";
                        problemDetails.Type = "https://datatracker.ietf.org/doc/html/rfc7231#section-6.5.3";
                        break;
                    case AlreadyExistsException:
                        problemDetails.Status = StatusCodes.Status409Conflict;
                        problemDetails.Title = "Already exists";
                        problemDetails.Type = "https://datatracker.ietf.org/doc/html/rfc7231#section-6.5.8";
                        break;
                    case ApplicationAlreadyProcessedException:
                        problemDetails.Status = StatusCodes.Status409Conflict;
                        problemDetails.Title = "Already processed";
                        problemDetails.Type = "https://datatracker.ietf.org/doc/html/rfc7231#section-6.5.8";
                        break;
                    default:
                        problemDetails.Status = StatusCodes.Status400BadRequest;
                        problemDetails.Title = "Bad request";
                        problemDetails.Type = "https://datatracker.ietf.org/doc/html/rfc7231#section-6.5.1";
                        break;
                }
                break;
            default:
                problemDetails.Status = StatusCodes.Status500InternalServerError;
                problemDetails.Title = "An unhandled error occured";
                problemDetails.Type = "https://datatracker.ietf.org/doc/html/rfc7231#section-6.6.1";
                Console.WriteLine($"Error!!!: {exception.Message}");
                break;
        }
        await Results.Problem(problemDetails).ExecuteAsync(context.HttpContext);
        context.ExceptionHandled = true;
    }
}