using ErsatzTV.Core.Domain; using ErsatzTV.Core.Domain.Filler; using ErsatzTV.ViewModels; using FluentValidation; using FluentValidation.Results; namespace ErsatzTV.Validators; public class FillerPresetEditViewModelValidator : AbstractValidator { public FillerPresetEditViewModelValidator() { RuleFor(fp => fp.Name).NotEmpty(); RuleFor(fp => fp.FillerKind).NotEqual(FillerKind.None); When( fp => fp.FillerKind != FillerKind.Fallback && fp.FillerKind != FillerKind.Tail, () => RuleFor(fp => fp.FillerMode).NotEqual(FillerMode.None)); When( fp => fp.FillerMode == FillerMode.Count, () => RuleFor(fp => fp.Count).NotNull().GreaterThanOrEqualTo(0)); When( fp => fp.FillerMode == FillerMode.Duration, () => RuleFor(fp => fp.Duration).NotNull()); When( fp => fp.FillerMode == FillerMode.Pad, () => RuleFor(fp => fp.PadToNearestMinute).NotNull()); When( fp => fp.FillerKind is FillerKind.Fallback, () => RuleFor(fp => fp.UseChaptersAsMediaItems).NotEqual(true)); When( fp => fp.CollectionType == CollectionType.Collection, () => RuleFor(fp => fp.Collection).NotNull()); When( fp => fp.CollectionType == CollectionType.MultiCollection, () => RuleFor(fp => fp.MultiCollection).NotNull()); When( fp => fp.CollectionType == CollectionType.SmartCollection, () => RuleFor(fp => fp.SmartCollection).NotNull()); When( fp => fp.CollectionType is CollectionType.Artist or CollectionType .TelevisionShow or CollectionType.TelevisionSeason, () => RuleFor(fp => fp.MediaItem).NotNull()); } public Func>> ValidateValue => async (model, propertyName) => { ValidationResult result = await ValidateAsync( ValidationContext.CreateWithOptions( (FillerPresetEditViewModel)model, x => x.IncludeProperties(propertyName))); if (result.IsValid) { return []; } return result.Errors.Select(e => e.ErrorMessage); }; }