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<FlashcardService> _logger;

        private const LlmProvider DefaultProvider = LlmProvider.Gemini;
        private string DefaultModel = "gemini-3.1-flash-image-preview";

        public FlashcardService(IAgentService agentService, ILogger<FlashcardService> logger)
        {
            _agentService = agentService;
            _logger = logger;
        }

        public async Task<string> 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;
        }
    }
}
