using Health.Domain.Entities;
using Health.Domain.Enums;

namespace Health.Application.AI;

public sealed record DietCommentaryFood(string Name, string Portion, int Calories);

public static class DietCommentaryPolicy
{
    public const string LegacyPromptPrefix = "饮食记录页需要展示本餐建议。";

    public const string SystemPrompt = """
        你是健康管理 App 中的饮食建议助手。根据用户本餐食物和健康档案，直接输出2到3条简短建议。
        每条建议12到22个汉字，不要问候，不要说“好的”“当然”“建议如下”，不要编号，不要使用 Markdown。
        优先围绕控盐控油、蔬菜和蛋白质搭配、血糖血脂风险及份量控制。
        不作诊断，不提供治疗、处方、停药或调药结论。语言简洁、专业、面向普通用户。
        """;

    public static string BuildFoodDescription(IEnumerable<DietCommentaryFood> foods) =>
        string.Join("、", foods.Select(food =>
            $"{Normalize(food.Name, 40)}（{Normalize(food.Portion, 30)}，{Math.Clamp(food.Calories, 0, 10000)}千卡）"));

    public static bool IsLegacyArtifact(IEnumerable<ConversationMessage> messages)
    {
        var userMessages = messages.Where(message => message.Role == MessageRole.User).ToList();
        return userMessages.Count > 0 &&
               userMessages.All(message => message.Content.TrimStart().StartsWith(LegacyPromptPrefix, StringComparison.Ordinal));
    }

    private static string Normalize(string value, int maxLength)
    {
        var normalized = string.Join(' ', value.Trim().Split((char[]?)null, StringSplitOptions.RemoveEmptyEntries));
        return normalized.Length > maxLength ? normalized[..maxLength] : normalized;
    }
}
