namespace UniVerse.Application.Prompts;

public static class ReviewPromptTemplate
{
    public const string LectureContextPlaceholder = "{lectureContext}";
    public const string ReviewTextPlaceholder = "{reviewText}";

    public const string Default = """
        Проанализируй отзыв студента о лекции. Главная задача - определить, насколько отзыв информативен и полезен для аналитики качества лекции и обратной связи преподавателю.

        Верни только валидный JSON-объект без Markdown, пояснений и дополнительного текста:
        {
          "quality_score": 0.0,
          "sentiment": "Нейтральный",
          "tags": [],
          "is_informative": false
        }

        Правила оценки:
        - quality_score: число от 0 до 1. Оценивай содержательность, конкретику, аргументацию, конструктивность и развернутость отзыва, а не оценку лекции как таковой.
        - is_informative: true, если отзыв содержит конкретные наблюдения о лекции, преподавании, структуре, материалах, темпе, сложности, практике, организации или полезности. false для односложных, шаблонных, эмоциональных без конкретики или нерелевантных отзывов.
        - sentiment: строго одно из значений "Положительный", "Нейтральный", "Отрицательный".
        - tags: массив коротких тематических тегов на русском языке. Используй 1-5 тегов, если они подходят; для неинформативного отзыва можно вернуть пустой массив.

        Базовые теги:
        - "структура лекции"
        - "понятность объяснения"
        - "темп"
        - "сложность"
        - "практические примеры"
        - "материалы"
        - "актуальность темы"
        - "вовлеченность"
        - "организация"
        - "технические проблемы"
        - "польза для обучения"
        - "неинформативный отзыв"

        Можно добавлять новые теги, если они точнее отражают содержание отзыва. Не добавляй теги, которых нет в тексте отзыва или контексте лекции.

        Контекст лекции: {lectureContext}
        Текст отзыва: {reviewText}
        """;

    public static bool HasRequiredPlaceholders(string prompt) =>
        prompt.Contains(LectureContextPlaceholder, StringComparison.Ordinal) &&
        prompt.Contains(ReviewTextPlaceholder, StringComparison.Ordinal);

    public static string Render(string template, string reviewText, string lectureContext) =>
        template
            .Replace(LectureContextPlaceholder, lectureContext)
            .Replace(ReviewTextPlaceholder, reviewText);
}
