using Microsoft.AspNetCore.SignalR.Client;
using OpenIddict.Client;
using RobotNet.MapShares.Dtos;
using RobotNet.Shares;

namespace RobotNet.RobotManager.HubClients;

public class MapHubClient(IHttpClientFactory HttpFactory, OpenIddictClientService openIddictClient) 
    : OpenIddictHubClient(new Uri($"{HttpFactory.CreateClient("MapManagerAPI").BaseAddress}hubs/map/data").ToString(), openIddictClient, ["robotnet-map-api"])
{
    public event Action<Guid>? MapUpdated;
    private IDisposable? disMapUpdated;


    new public async Task StartAsync()
    {
        disMapUpdated = Connection.On<Guid>("MapUpdated", mapId => MapUpdated?.Invoke(mapId));

        await base.StartAsync();
    }

    new public async Task StopAsync()
    {
        if (disMapUpdated != null)
        {
            disMapUpdated.Dispose();
            disMapUpdated = null;
        }
        await base.StopAsync();
    }

    public async Task<MessageResult<MapDataDto>> GetMapData(Guid mapId)
        => IsConnected ? await Connection.InvokeAsync<MessageResult<MapDataDto>>(nameof(GetMapData), mapId) : new(false, "Kết nối thất bại");

    public async Task<MessageResult<ElementDto[]>> GetElementsState(Guid mapId)
        => IsConnected ? await Connection.InvokeAsync<MessageResult<ElementDto[]>>(nameof(GetElementsState), mapId) : new(false, "Kết nối thất bại");
    public async Task<MessageResult<MapInfoDto>> GetMapInfoByName(string name)
        => IsConnected ? await Connection.InvokeAsync<MessageResult<MapInfoDto>>(nameof(GetMapInfoByName), name) : new(false, "Kết nối thất bại");
    public async Task<MessageResult<MapInfoDto>> GetMapInfoById(Guid mapId)
        => IsConnected ? await Connection.InvokeAsync<MessageResult<MapInfoDto>>(nameof(GetMapInfoById), mapId) : new(false, "Kết nối thất bại");
}
