using Bit.Core.Models.Commands;
using Bit.Test.Common.AutoFixture.Attributes;
using Xunit;

namespace Bit.Core.Test.Models.Commands;

public class CommandResultTests
{
    public class TestItem
    {
        public Guid Id { get; set; }
        public string Value { get; set; }
    }

    public CommandResult<TestItem> BulkAction(IEnumerable<TestItem> items)
    {
        var itemList = items.ToList();
        var successfulItems = items.Where(x => x.Value == "SuccessfulRequest").ToArray();

        var failedItems = itemList.Except(successfulItems).ToArray();

        var notFound = failedItems.First(x => x.Value == "Failed due to not found");
        var invalidPermissions = failedItems.First(x => x.Value == "Failed due to invalid permissions");

        var notFoundError = new RecordNotFoundError<TestItem>(notFound);
        var insufficientPermissionsError = new InsufficientPermissionsError<TestItem>(invalidPermissions);

        return new Partial<TestItem>(successfulItems.ToArray(), [notFoundError, insufficientPermissionsError]);
    }

    [Theory]
    [BitAutoData]
    public void Partial_CommandResult_BulkRequestWithSuccessAndFailures(Guid successId1, Guid failureId1, Guid failureId2)
    {
        var listOfRecords = new List<TestItem>
        {
            new TestItem() { Id = successId1, Value = "SuccessfulRequest" },
            new TestItem() { Id = failureId1, Value = "Failed due to not found" },
            new TestItem() { Id = failureId2, Value = "Failed due to invalid permissions" }
        };

        var result = BulkAction(listOfRecords);

        Assert.IsType<Partial<TestItem>>(result);

        var failures = (result as Partial<TestItem>).Failures.ToArray();
        var success = (result as Partial<TestItem>).Successes.First();

        Assert.Equal(listOfRecords.First(), success);
        Assert.Equal(2, failures.Length);
    }
}