using FluentValidation;
using LiteCqrs;
using TeleWave.Application.Common.Models;

namespace TeleWave.Application.Programming.Templates.Transfer;

/// <summary>
/// Собирает текст запроса к ИИ: «вот канал, вот что у меня в библиотеке, вот на какие каналы
/// я равняюсь — верни сетку в этом формате». Запрос не отправляется никуда: админ копирует его
/// в ту модель, которой пользуется, и приносит ответ обратно кнопкой импорта. Ключей внешних
/// сервисов проект не хранит, и заводить их ради одной кнопки не нужно.
/// </summary>
/// <param name="References">Каналы-референсы: «как у 2×2», «как у Paramount Comedy».</param>
/// <param name="Notes">Пожелания админа своими словами — попадают в запрос как есть.</param>
public sealed record BuildGridPromptQuery(
    Guid ChannelId,
    IReadOnlyList<string> References,
    string? Notes
) : IQuery<Result<GridPromptDto>>;

/// <summary>
/// Готовый запрос и то, из чего он собран: админ должен видеть, что модель получит библиотеку
/// целиком, а не первые десять шоу.
/// </summary>
public sealed record GridPromptDto(string Prompt, int Groups, int Shows, int Characters);

public sealed class BuildGridPromptQueryValidator : AbstractValidator<BuildGridPromptQuery>
{
    public BuildGridPromptQueryValidator()
    {
        RuleFor(x => x.References.Count).LessThanOrEqualTo(16);
        RuleForEach(x => x.References).NotEmpty().MaximumLength(128);
        RuleFor(x => x.Notes).MaximumLength(4000);
    }
}
