using foodmarket.Infrastructure.Persistence;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Diagnostics.HealthChecks;

namespace foodmarket.Api.Infrastructure.Health;

/// <summary>Readiness-проба: приложение готово принимать трафик только когда
/// БД отвечает И все миграции применены. Если есть неприменённые миграции —
/// схема не соответствует коду (например, контейнер поднялся раньше, чем
/// отработал <c>Migrate()</c>, или откатили не ту версию) — отдаём Unhealthy,
/// чтобы оркестратор/прокси не слал на этот инстанс запросы.</summary>
public sealed class DatabaseReadyHealthCheck : IHealthCheck
{
    private readonly AppDbContext _db;

    public DatabaseReadyHealthCheck(AppDbContext db) => _db = db;

    public async Task<HealthCheckResult> CheckHealthAsync(
        HealthCheckContext context, CancellationToken cancellationToken = default)
    {
        try
        {
            if (!await _db.Database.CanConnectAsync(cancellationToken))
            {
                return HealthCheckResult.Unhealthy("Нет соединения с БД.");
            }

            var pending = (await _db.Database.GetPendingMigrationsAsync(cancellationToken)).ToList();
            if (pending.Count > 0)
            {
                return HealthCheckResult.Unhealthy(
                    $"Неприменённые миграции: {pending.Count} (первая: {pending[0]}).",
                    data: new Dictionary<string, object> { ["pendingMigrations"] = pending });
            }

            return HealthCheckResult.Healthy("БД доступна, миграции применены.");
        }
        catch (Exception ex)
        {
            return HealthCheckResult.Unhealthy("Ошибка проверки готовности БД.", ex);
        }
    }
}
