using KlaviyoSharp.Models;
using KlaviyoSharp.Models.Filters;

namespace KlaviyoSharp.Tests;

[Trait("Category", "ImagesServices")]
public class ImagesServices_Tests : IClassFixture<ImagesServices_Tests_Fixture>
{
    private ImagesServices_Tests_Fixture Fixture { get; }
    public ImagesServices_Tests(ImagesServices_Tests_Fixture fixture)
    {
        Fixture = fixture;
    }

    [Fact]
    public async Task GetImages()
    {
        var result = await Fixture.AdminApi.ImagesServices.GetImages();
        Assert.NotEmpty(result.Data);
        var res = await Fixture.AdminApi.ImagesServices.GetImage(result.Data[0].Id);
        Assert.Equal(result.Data[0].Id, res.Data.Id);
    }
    [Fact]
    public async Task CreateAndUpdateImages()
    {
        var result = await Fixture.AdminApi.ImagesServices.UploadImageFromUrl(Fixture.NewImageFromUrl);
        Assert.NotNull(result);
        string NewName = $"test{Config.Random}";
        var update = PatchImage.Create();
        update.Attributes = new() { Name = NewName, Hidden = true };
        update.Id = result.Data.Id;
        var updated = await Fixture.AdminApi.ImagesServices.UpdateImage(result.Data.Id, update);
        Assert.Equal(NewName, updated.Data.Attributes.Name);
        Assert.True(updated.Data.Attributes.Hidden);
    }
    [Fact]
    public async Task CreateImageFromBase64()
    {
        var result = await Fixture.AdminApi.ImagesServices.UploadImageFromUrl(Fixture.NewImageFromBase64);
        Assert.NotNull(result);
        string NewName = $"test{Config.Random}";
        var update = PatchImage.Create();
        update.Attributes = new() { Name = NewName, Hidden = true };
        update.Id = result.Data.Id;
        var updated = await Fixture.AdminApi.ImagesServices.UpdateImage(result.Data.Id, update);
        Assert.Equal(NewName, updated.Data.Attributes.Name);
        Assert.True(updated.Data.Attributes.Hidden);
    }
}

public class ImagesServices_Tests_Fixture : IAsyncLifetime
{
    public KlaviyoAdminApi AdminApi { get; } = new(Config.ApiKey);
    public readonly int SleepTime = 10 * 1000; //10 Seconds
    public readonly int Retries = 3;
    public ImageFromUrl NewImageFromUrl
    {
        get
        {
            var output = Image.CreateFromUrl();
            output.Attributes = new()
            {
                Name = $"test{Config.Random}",
                ImportFromUrl = "https://fastly.picsum.photos/id/313/2000/2000.jpg?hmac=DiIgMezieiHoREs8U2YomJBoWw53Don5fbyYje4bJoI",
                Hidden = false
            };
            return output;
        }
    }
    public ImageFromUrl NewImageFromBase64
    {
        get
        {
            var output = Image.CreateFromUrl();
            output.Attributes = new()
            {
                Name = $"Emoji{Config.Random}",
                ImportFromUrl = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAApgAAAKYB3X3/OAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANCSURBVEiJtZZPbBtFFMZ/M7ubXdtdb1xSFyeilBapySVU8h8OoFaooFSqiihIVIpQBKci6KEg9Q6H9kovIHoCIVQJJCKE1ENFjnAgcaSGC6rEnxBwA04Tx43t2FnvDAfjkNibxgHxnWb2e/u992bee7tCa00YFsffekFY+nUzFtjW0LrvjRXrCDIAaPLlW0nHL0SsZtVoaF98mLrx3pdhOqLtYPHChahZcYYO7KvPFxvRl5XPp1sN3adWiD1ZAqD6XYK1b/dvE5IWryTt2udLFedwc1+9kLp+vbbpoDh+6TklxBeAi9TL0taeWpdmZzQDry0AcO+jQ12RyohqqoYoo8RDwJrU+qXkjWtfi8Xxt58BdQuwQs9qC/afLwCw8tnQbqYAPsgxE1S6F3EAIXux2oQFKm0ihMsOF71dHYx+f3NND68ghCu1YIoePPQN1pGRABkJ6Bus96CutRZMydTl+TvuiRW1m3n0eDl0vRPcEysqdXn+jsQPsrHMquGeXEaY4Yk4wxWcY5V/9scqOMOVUFthatyTy8QyqwZ+kDURKoMWxNKr2EeqVKcTNOajqKoBgOE28U4tdQl5p5bwCw7BWquaZSzAPlwjlithJtp3pTImSqQRrb2Z8PHGigD4RZuNX6JYj6wj7O4TFLbCO/Mn/m8R+h6rYSUb3ekokRY6f/YukArN979jcW+V/S8g0eT/N3VN3kTqWbQ428m9/8k0P/1aIhF36PccEl6EhOcAUCrXKZXXWS3XKd2vc/TRBG9O5ELC17MmWubD2nKhUKZa26Ba2+D3P+4/MNCFwg59oWVeYhkzgN/JDR8deKBoD7Y+ljEjGZ0sosXVTvbc6RHirr2reNy1OXd6pJsQ+gqjk8VWFYmHrwBzW/n+uMPFiRwHB2I7ih8ciHFxIkd/3Omk5tCDV1t+2nNu5sxxpDFNx+huNhVT3/zMDz8usXC3ddaHBj1GHj/As08fwTS7Kt1HBTmyN29vdwAw+/wbwLVOJ3uAD1wi/dUH7Qei66PfyuRj4Ik9is+hglfbkbfR3cnZm7chlUWLdwmprtCohX4HUtlOcQjLYCu+fzGJH2QRKvP3UNz8bWk1qMxjGTOMThZ3kvgLI5AzFfo379UAAAAASUVORK5CYII=",
                Hidden = false
            };
            return output;
        }
    }

    public Task DisposeAsync()
    {
        return Task.CompletedTask;
    }
    public Task InitializeAsync()
    {
        return Task.CompletedTask;
    }
}