using System.Threading.Tasks; using Mindforge.API.Models.Enums; using Mindforge.API.Models.Requests; using Mindforge.API.Services.Interfaces; namespace Mindforge.API.Services { public class FlashcardService : IFlashcardService { private readonly IAgentService _agentService; private readonly ILogger _logger; private const LlmProvider DefaultProvider = LlmProvider.Gemini; private string DefaultModel = "gemini-3.1-flash-image-preview"; public FlashcardService(IAgentService agentService, ILogger logger) { _agentService = agentService; _logger = logger; } public async Task GenerateFlashcardsAsync(FlashcardGenerateRequest request) { var extraPrompt = ""; switch (request.Mode) { case FlashcardMode.Basic: DefaultModel = "gemini-3.1-flash-lite-preview"; break; case FlashcardMode.Simple: DefaultModel = "gemini-3.1-flash-image-preview"; break; case FlashcardMode.Detailed: DefaultModel = "gemini-3.1-flash-image-preview"; extraPrompt = "Crie flashcards mais detalhados."; break; case FlashcardMode.Hyper: DefaultModel = "gemini-3.1-pro-preview"; extraPrompt = "Adicione também pequenas questões para fixação, para que o usuário possa testar seus conhecimentos. As questões devem ser curtas e objetivas, como se fosse cobradas em prova mesmo."; break; } string systemPrompt = $@"Você é um assistente educacional especializado em criar flashcards para o Anki. Baseado no texto fornecido, crie exatamente {request.Amount} flashcards que focam nos conceitos mais importantes e difíceis. A resposta FINAL deve ser APENAS no formato CSV, pronto para importação no Anki, sem nenhum texto adicional antes ou depois. O formato CSV deve ter duas colunas: a frente da carta (pergunta/conceito) e o verso (resposta/explicação). Use ponto e vírgula (;) como separador. Não adicione o cabeçalho. As perguntas e respostas devem estar estritamente em Português do Brasil. Exemplo de saída: ""Qual é a capital do Brasil?"";""Brasília"" ""Qual é a maior cidade do Brasil?"";""São Paulo"" Com base no arquivo fornecido, crie exatamente {request.Amount} flashcards que focam nos conceitos mais importantes e difíceis. {extraPrompt} "; string userPrompt = $"Arquivo: {request.FileName}\nConteúdo:\n{request.FileContent}"; //var result = await _agentService.ProcessRequestAsync(DefaultProvider, systemPrompt, userPrompt, DefaultModel); var result = await _agentService.ProcessRequestBatchAsync(DefaultProvider, systemPrompt, userPrompt, DefaultModel); var lines = result.Split('\n'); if (lines.Length == 0) { throw new Exception("Nenhum flashcard gerado."); } if (lines.Length > request.Amount) { _logger.LogWarning("Quantidade de flashcards excede o limite."); } if (lines.Length < request.Amount) { _logger.LogWarning("Quantidade de flashcards abaixo do limite."); } return result; } } }