using data.Domain.UseCase;
using data.RemoteData.RemoteDataBase;
using data.Repository;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;

var builder = WebApplication.CreateBuilder(args);

// Добавление контекста базы данных и репозиториев
builder.Services.AddDbContext<RemoteDatabaseContext>();

// Регистрируем репозитории и UseCase
builder.Services.AddScoped<IUserRepository, SQLUserRepositoryImpl>()
                .AddScoped<IPresenceRepository, SQLPresenceRepositoryImpl>()
                .AddScoped<IGroupRepository, SQLGroupRepositoryImpl>()
                .AddScoped<UseCaseGeneratePresence>()
                .AddScoped<GroupUseCase>();

// Добавление контроллеров
builder.Services.AddControllers();

// Добавление Swagger для API документации
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

// Добавляем логирование
builder.Services.AddLogging(logging =>
{
    logging.ClearProviders();
    logging.AddConsole(options =>
    {
        options.LogToStandardErrorThreshold = LogLevel.Error;
    });
    logging.AddDebug();
    logging.SetMinimumLevel(LogLevel.Error);
});

var app = builder.Build();

// Конфигурация Swagger UI для разработки
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

// Добавляем middleware для логирования любых ошибок
app.UseMiddleware<ErrorLoggingMiddleware>();

// Основные Middleware
app.UseHttpsRedirection();
app.MapControllers();

app.Run();

public class ErrorLoggingMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILogger<ErrorLoggingMiddleware> _logger;

    public ErrorLoggingMiddleware(RequestDelegate next, ILogger<ErrorLoggingMiddleware> logger)
    {
        _next = next;
        _logger = logger;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        try
        {
            // Передача запроса дальше по конвейеру
            await _next(context);

            // Проверяем коды состояния и логируем ошибки 4xx и 5xx
            if (context.Response.StatusCode >= 400)
            {
                var logLevel = context.Response.StatusCode >= 500 ? LogLevel.Error : LogLevel.Warning;

                _logger.Log(logLevel, "Ответ с ошибкой: {StatusCode} для {Method} {Path}",
                    context.Response.StatusCode, context.Request.Method, context.Request.Path);
            }
        }
        catch (Exception ex)
        {
            // Логируем необработанное исключение
            _logger.LogError(ex, "Необработанное исключение в запросе {Method} {Path}: {Message}",
                context.Request.Method, context.Request.Path, ex.Message);

            // Устанавливаем статус ответа
            context.Response.StatusCode = 500;
            await context.Response.WriteAsync("Произошла внутренняя ошибка сервера.");
        }
    }
}

// Пример контроллера для проверки всех ошибок
[ApiController]
[Route("api/[controller]")]
public class TestController : ControllerBase
{
    [HttpGet("bad-request")]
    public IActionResult BadRequestExample()
    {
        return BadRequest("Это пример ошибки 400.");
    }

    [HttpGet("internal-error")]
    public IActionResult InternalServerErrorExample()
    {
        throw new InvalidOperationException("Это пример необработанной ошибки.");
    }
}
