using FluentValidation;
using Microsoft.AspNetCore.Mvc;
using PARR.API.Contracts.V1.Responses.Base;
using PARR.API.Infrastructure.Filters;
using PARR.API.Infrastructure.Middleware;

namespace PARR.API.Infrastructure
{
    /// <summary>
    /// Настройка валидаторов
    /// </summary>
    public static class ConfigureValidator
    {
        /// <summary>
        /// Подключить конфигурацию валидаторов
        /// </summary>
        /// <param name="services"></param>
        /// <returns></returns>
        public static IServiceCollection AddValidatorServices(this IServiceCollection services)
        {
            services.AddExceptionHandler<GlobalExceptionHandler>(); // регим GlobalExceptionHandler
            services.AddProblemDetails(); // Генерирует стандартный формат ошибки RFC 7807

            // Настройка контроллеров и кастомного формата ошибок валидации
            services.AddControllers(options =>
            {
                // Автоматически применяем асинхронную валидацию ко всем контроллерам
                options.Filters.Add<AsyncValidationFilter>();
            })
                .ConfigureApiBehaviorOptions(options =>
                {
                    options.InvalidModelStateResponseFactory = context =>
                    {
                        // наша стандартная модель ошибок
                        var errors = context.ModelState.Values
                                        .SelectMany(t => t.Errors)
                                        .Select(t => new ErrorModel { Message= t.ErrorMessage })
                                        .ToList();

                        return new BadRequestObjectResult( new Response( false, errors));
                    };
                });

            // Регистрируем валидаторы API. 
            // Просканирует всю сборку API (где лежит Program.cs) и найдет там валидаторы
            services.AddValidatorsFromAssembly(typeof(Program).Assembly);
            //services.AddValidatorsFromAssemblies(Assembly.GetExecutingAssembly());

            // Включаем авто-валидацию FluentValidation для контроллеров
            //services.AddFluentValidationAutoValidation();

            return services;
        }
    }
}
