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

namespace PARR.API.Validators
{
    public class WorkRequestValidator : AbstractValidator<WorkRequest>
    {
        private readonly ITnkRepository tnkService;

        private bool? isValid = null;

        public WorkRequestValidator(
            ITnkRepository tnkService
            //ITemplateMaskValidator templateMaskValidator
            )
        {
            this.tnkService = tnkService;

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

            RuleFor(t => t.TemplateNameMask)
                .NotEmpty()
                .NotNull();
            
            //TODO Сделать проверку по шорткодам и возможным полям
            //RuleFor(t => t.TemplateNameMask)
            //    .Must((entity, value, c) => templateMaskValidator
            //    .IsValid(entity.TemplateNameMask))
            //    .WithMessage($"Неверно указана маска имени шаблонов. Обязательными условиями являются" +
            //    $" наличие кодового слова \"ПАРР\" и обязательное использование динамической составляющей" +
            //    $" %ЭК%. Доступные значения динамических составляющих:" +
            //    $" {string.Join(", ", Shortcodes.GetAll().Select(sc => sc.Name + " - " + sc.Description))}"
            //    );

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

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

            RuleFor(t => t.TnkId)
                .MustAsync(async (entity, value, c) => await IsTnkExist(entity))
                .WithMessage("Указан несуществующий Id ТНК");
        }

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

            isValid = await tnkService.GetAsync(request.TnkId) != null;

            return isValid.Value;
        }

    }
}
