using FluentValidation;
using PARR.API.Contracts.V1.Requests;
using PARR.Core.Repositories.Interfaces;

namespace PARR.API.Validators
{
    public class TnkRequestValidator : AbstractValidator<TnkRequest>
    {
        private readonly ISubprocessRepository subprocessService;
        private bool? isValid = null;

        public TnkRequestValidator(
            ISubprocessRepository subprocessService
            )
        {
            this.subprocessService = subprocessService;

            RuleFor(t => t.Name).NotEmpty().NotNull();

            //RuleFor(t => t.EsppId).NotEmpty().NotNull().WithMessage("EsppId не может быть пустым");

            RuleFor(t => t.SubprocessId).NotEmpty().NotNull();

            RuleFor(t => t.SubprocessId)
                .MustAsync(async (entity, value, c) => await IsSubprocessExist(entity))
                .WithMessage("Указан несуществующий Id подпроцесса");
        }

        private async Task<bool> IsSubprocessExist(TnkRequest request)
        {
            //чтобы не делать 2 раза валидацию
            if (isValid.HasValue)
                return isValid.Value;

            isValid = await subprocessService.GetAsync(request.SubprocessId) != null;

            return isValid.Value;
        }
    }
}
