using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc.Testing;
using Microsoft.AspNetCore.TestHost;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using NSubstitute;

namespace DocumentGeneration.API.Tests;

public sealed class SelfHostedApi : WebApplicationFactory<Startup>
{
    public DocumentApi DocumentApi { get; }
    public HttpClient DocumentClient { get; }

    public SelfHostedApi()
    {
        DocumentApi = new DocumentApi();
        DocumentClient = DocumentApi.CreateClient();
    }

    protected override IHostBuilder CreateHostBuilder()
    {
        return Host
            .CreateDefaultBuilder()
            .ConfigureWebHostDefaults(builder => builder.UseStartup<Startup>());
    }

    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {
        builder.ConfigureServices(services =>
        {
            var httpClientFactory = Substitute.For<IHttpClientFactory>();
            httpClientFactory.CreateClient("").ReturnsForAnyArgs(DocumentClient);
            services.AddTransient<IHttpClientFactory>(s => httpClientFactory);
        });
    }

    protected override void Dispose(bool disposing)
    {
        DocumentApi.Dispose();

        base.Dispose(disposing);
    }
}