using System.Diagnostics;
using System.Net.Http.Headers;
using Nexus.Api.Data;

namespace Nexus.Api.Integrations;

public sealed class OpenClawRuntime(HttpClient client, IConfiguration configuration) : IAgentRuntime
{
    public string Name => "OpenClaw";

    public async Task<AgentRuntimeStatus> GetStatusAsync(CancellationToken cancellationToken)
    {
        var stopwatch = Stopwatch.StartNew();
        try
        {
            using var request = new HttpRequestMessage(HttpMethod.Get, "/");
            ApplyAuthorization(request);

            using var response = await client.SendAsync(request, cancellationToken);
            stopwatch.Stop();
            var status = response.IsSuccessStatusCode
                ? OperationalStatus.Online
                : OperationalStatus.Degraded;
            return new(Name, status, stopwatch.Elapsed, $"HTTP {(int)response.StatusCode}");
        }
        catch (Exception exception)
        {
            stopwatch.Stop();
            return new(Name, OperationalStatus.Offline, stopwatch.Elapsed, exception.Message);
        }
    }

    private void ApplyAuthorization(HttpRequestMessage request)
    {
        var credential = configuration["Integrations:OpenClaw:Password"];
        if (string.IsNullOrWhiteSpace(credential))
            credential = configuration["Integrations:OpenClaw:Token"];
        if (!string.IsNullOrWhiteSpace(credential))
            request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", credential);
    }
}
