using ApplicationLayer.InfrastructureServicesInterfaces;
using Bogus;
using Domains;
using Domains.ApplicantDomain;
using Domains.VisaApplicationDomain;
namespace VisaApi.Fakers.VisaApplications
{
///
/// Generates visa applications
///
public sealed class VisaApplicationFaker : Faker
{
private static ReentryPermitFaker reentryPermitFaker = null!;
private static PermissionToDestCountryFaker permissionToDestCountryFaker = null!;
public VisaApplicationFaker(IDateTimeProvider dateTimeProvider)
{
reentryPermitFaker = new(dateTimeProvider);
permissionToDestCountryFaker = new(dateTimeProvider);
var pastVisaFaker = new PastVisaFaker(dateTimeProvider);
var pastVisitFaker = new PastVisitFaker(dateTimeProvider);
RuleFor(va => va.Status, f => f.Random.Enum());
RuleFor(va => va.DestinationCountry, f => f.Address.Country());
RuleFor(va => va.PastVisas,
f => f.PickRandom(pastVisaFaker.Generate(3), f.Random.Int(0, 3)).ToList());
RuleFor(va => va.PastVisits,
f => f.PickRandom(pastVisitFaker.Generate(3), f.Random.Int(0, 3)).ToList());
RuleFor(va => va.VisaCategory, f => f.Random.Enum());
RuleFor(va => va.ForGroup, f => f.Random.Bool());
RuleFor(va => va.RequestedNumberOfEntries,
f => f.Random.Enum());
RuleFor(va => va.RequestDate, dateTimeProvider.Now);
RuleFor(va => va.ValidDaysRequested,
f => f.Random.Int(1, ConfigurationConstraints.MaxValidDays));
}
public VisaApplication GenerateValid(Applicant applicant)
{
var result = Generate();
result.ApplicantId = applicant.Id;
if (applicant.IsNonResident)
{
result.ReentryPermit = reentryPermitFaker.Generate();
}
if (result.VisaCategory is VisaCategory.Transit)
{
result.PermissionToDestCountry = permissionToDestCountryFaker.Generate();
}
return result;
}
}
}