using ApplicationLayer.Services.Applicants.Models.Validation;
using ApplicationLayer.Services.AuthServices.Requests;
using ApplicationLayer.Services.AuthServices.Requests.Validation;
using Domains.ApplicantDomain;
using FluentValidation.TestHelper;
using Infrastructure.Database.Users.Repositories;
using VisaApi.Fakers.Auth;
using VisaApi.Services;
using VisaApi.Tests.Infrastructure.Database;
using Xunit;
namespace VisaApi.Tests.Application.Validation.Auth
{
    public class RegisterApplicantRequestValidatorTests
    {
        private readonly RegisterApplicantRequestValidator validator;
        private RegisterApplicantRequestFaker requestFaker;
        public RegisterApplicantRequestValidatorTests()
        {
            var context = InMemoryContextProvider.GetDbContext();
            var dateTimeProvider = new TestDateTimeProvider();
            requestFaker = new(dateTimeProvider);
            validator = new(
                dateTimeProvider,
                new NameModelValidator(),
                new RegisterRequestValidator(new UsersRepository(context, context), new AuthDataValidator()),
                new PassportModelValidator(dateTimeProvider),
                new PlaceOfWorkModelValidator()
            );
        }
        /// 
        /// Validation should return no errors
        /// 
        [Fact]
        public async Task ValidateShouldWork()
        {
            var request = requestFaker.Generate();
            var result = await validator.TestValidateAsync(request);
            result.ShouldNotHaveAnyValidationErrors();
        }
        /// 
        /// Validation should return errors
        /// 
        [Fact]
        public async Task ValidateShouldFail()
        {
            var request = new RegisterApplicantRequest
            {
                BirthDate = DateTime.Now,
                Citizenship = string.Empty,
                CitizenshipByBirth = string.Empty,
                CityOfBirth = string.Empty,
                CountryOfBirth = string.Empty,
                Gender = (Gender)123123,
                JobTitle = string.Empty,
                MaritalStatus = (MaritalStatus)123123,
            };
            var result = await validator.TestValidateAsync(request);
            var properties = request.GetType().GetProperties().Select(x => x.Name).Except([nameof(RegisterApplicantRequest.IsNonResident)]);
            foreach (var property in properties)
            {
                result.ShouldHaveValidationErrorFor(property);
            }
        }
    }
}