using FluentValidation;
using LiteCqrs;

namespace TeleWave.Application.Media.MovieImport;

/// <summary>
/// Разбор пачки имён: что это за фильмы и что по ним нашлось в источнике. Имена приходят с клиента,
/// а не читаются сервером, потому что источников два — каталог <c>manual/</c> и файлы, выбранные
/// в браузере. Разбирать имя одинаково, а грузить файл только после того, как человек согласился
/// со строкой, — единственный способ не заливать десятки гигабайт впустую.
/// </summary>
public sealed record MatchMoviesQuery(IReadOnlyList<string> Names, string Provider)
    : IQuery<IReadOnlyList<MovieMatchDto>>;

/// <summary>Перезапрос одной строки: админ поправил название (транслит, другое написание).</summary>
public sealed record MatchMovieQuery(string Name, string Title, int? Year, string Provider)
    : IQuery<MovieMatchDto>;

public sealed class MatchMoviesQueryValidator : AbstractValidator<MatchMoviesQuery>
{
    public MatchMoviesQueryValidator()
    {
        RuleFor(x => x.Names).NotEmpty();
        // Потолок на пачку: каждая строка — запрос во внешний источник, и тысяча имён за раз
        // упрётся в его лимиты, а не в наши.
        RuleFor(x => x.Names.Count).LessThanOrEqualTo(200);
        RuleFor(x => x.Provider).NotEmpty();
    }
}

public sealed class MatchMovieQueryValidator : AbstractValidator<MatchMovieQuery>
{
    public MatchMovieQueryValidator()
    {
        RuleFor(x => x.Name).NotEmpty();
        RuleFor(x => x.Title).NotEmpty().MaximumLength(256);
        RuleFor(x => x.Year).InclusiveBetween(1870, 2200).When(x => x.Year is not null);
        RuleFor(x => x.Provider).NotEmpty();
    }
}
