using System.Globalization;
using FluentAssertions;
using Nop.Web.Framework.Validators;
using NUnit.Framework;

namespace Nop.Tests.Nop.Web.Tests.Public.Validators;

[TestFixture]
public class CreditCardValidatorTests
{
    private TestValidator _validator;

    [OneTimeSetUp]
    public void Setup()
    {
        Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");

        _validator = new TestValidator { v => v.RuleFor(x => x.CreditCard).IsCreditCard() };
    }

    [Test]
    public async Task IsValidTests()
    {
        // Optional value is not valid
        var result = await _validator.ValidateAsync(new Person { CreditCard = null });
        result.IsValid.Should().BeFalse();

        // Simplest valid value
        result = await _validator.ValidateAsync(new Person { CreditCard = "0000000000000000" });
        result.IsValid.Should().BeTrue();

        // Good checksum
        result = await _validator.ValidateAsync(new Person { CreditCard = "1234567890123452" });
        result.IsValid.Should().BeTrue();

        // Good checksum, with dashes
        result = await _validator.ValidateAsync(new Person { CreditCard = "1234-5678-9012-3452" });
        result.IsValid.Should().BeTrue();

        // Good checksum, with spaces
        result = await _validator.ValidateAsync(new Person { CreditCard = "1234 5678 9012 3452" });
        result.IsValid.Should().BeTrue();

        // Bad checksum
        result = await _validator.ValidateAsync(new Person { CreditCard = "0000000000000001" });
        result.IsValid.Should().BeFalse();

        result = await _validator.ValidateAsync(new Person { CreditCard = "0000000000000000" });
        result.IsValid.Should().BeTrue();
    }
}