using Microsoft.Extensions.Options;

public sealed class CentralReachabilityService : BackgroundService
{
    private readonly IHttpClientFactory _http;
    private readonly CentralApiOptions _central;
    private readonly GatewayOptions _gateway;
    private volatile bool _isReachable;

    public bool IsCentralReachable => _isReachable;

    public CentralReachabilityService(
        IHttpClientFactory http,
        IOptions<CentralApiOptions> central,
        IOptions<GatewayOptions> gateway)
    {
        _http = http;
        _central = central.Value;
        _gateway = gateway.Value;
    }

    protected override async Task ExecuteAsync(CancellationToken ct)
    {
        using var timer = new PeriodicTimer(
            TimeSpan.FromSeconds(_gateway.CentralReachabilityIntervalSeconds));
        while (await timer.WaitForNextTickAsync(ct))
            await ProbeAsync(ct);
    }

    private async Task ProbeAsync(CancellationToken ct)
    {
        try
        {
            var client = _http.CreateClient("central");
            client.BaseAddress = new Uri(_central.BaseUrl);
            var resp = await client.GetAsync("/health/ready", ct);
            _isReachable = resp.IsSuccessStatusCode;
        }
        catch
        {
            _isReachable = false;
        }
    }
}