using data.Domain.UseCase;
using data.RemoteData.RemoteDataBase;
using data.Repository;
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(); // Добавляем логирование в консоль
    logging.AddDebug(); // Логирование для отладки
});

var app = builder.Build();

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

// Добавляем middleware для логирования запросов
app.UseMiddleware<RequestLoggingMiddleware>();

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

app.Run();

// Middleware для логирования запросов
public class RequestLoggingMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILogger<RequestLoggingMiddleware> _logger;

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

    public async Task InvokeAsync(HttpContext context)
    {
        // Логируем входящий запрос
        _logger.LogInformation("Входящий запрос: {Method} {Path} в {Time}",
            context.Request.Method, context.Request.Path, DateTime.UtcNow);

        // Передаём запрос дальше по конвейеру
        await _next(context);

        // Логируем исходящий ответ
        _logger.LogInformation("Исходящий ответ: {StatusCode} для {Method} {Path} в {Time}",
            context.Response.StatusCode, context.Request.Method, context.Request.Path, DateTime.UtcNow);
    }
}
