using DigitalData.Core.Client;
using DigitalData.Core.Client.Interface;
using Microsoft.Extensions.DependencyInjection;

namespace DigitalData.Core.Tests.Client
{
    [TestFixture]
    public class BaseHttpClientServiceTests
    {
        private IServiceProvider _serviceProvider;
        private IBaseHttpClientService _service;

        [SetUp]
        public void SetUp()
        {
            //_serviceProvider = new ServiceCollection()
            //    .AddHttpClientService("https://jsonplaceholder.typicode.com", "todos")
            //    .BuildServiceProvider();

            _service = _serviceProvider.GetRequiredService<IBaseHttpClientService>();
        }

        [Test]
        public async Task FetchJsonAsync_ShouldReturnJsonResponse_WithCorrectWithPath()
        {
            // Act
            var expectedUserId = (int) await _service.FetchAsync(path: "/1", sendWithCookie: false, saveCookie: false)
                .ThenAsync(res => res.Json())
                .ThenAsync(todo => todo.userId);

            // Assert
            Assert.That(expectedUserId, Is.EqualTo(1), "The userId of the fetched JSON object should be 1.");
        }

        [Test]
        public async Task FetchJsonAsync_ShouldReturnJsonResponse_WithQueryParams()
        {
            var queryParams = new Dictionary<string, object?>
            {
                { "id", "1" }
            };

            // Act
            var dyn_id = await _service.FetchAsync(queryParams: queryParams, sendWithCookie: false, saveCookie: false)
                .ThenAsync(res => res.JsonList())
                .ThenAsync(todo => todo.FirstOrDefault()?.userId);
                        
            try
            {
                Assert.That((int)dyn_id, Is.EqualTo(1), "The userId of the fetched JSON object should be 1.");
            }
            catch (InvalidCastException)
            {
                // Handle the case where the cast is not possible
                Assert.Fail("The id could not be cast to an integer.");
            }
        }
    }
}