using LearningMaterialSystem.Models;
using LearningMaterialSystem.Data;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using OpenAI;
using OpenAI.Chat;

[ApiController]
[Route("api/chat")]
public class ChatController : Controller
{
    private readonly IConfiguration _config;
    private readonly ApplicationDbContext _context;

    public ChatController(IConfiguration config, ApplicationDbContext context)
    {
        _config = config;
        _context = context;
    }

    [HttpPost]
    public async Task<IActionResult> Ask([FromBody] ChatRequest request)
    {
        if (string.IsNullOrWhiteSpace(request.Question))
            return Ok("Vui lòng nhập câu hỏi.");

        string query = request.Question.ToLower();

        //  LẤY THÔNG TIN THỐNG KÊ CƠ BẢN (Để trả lời được các câu hỏi về 'bao nhiêu', 'số lượng')
        var totalMaterials = await _context.HocLieus.CountAsync(m => m.TrangThai == "DaDuyet");
        var materialsBySubject = await _context.HocLieus
            .Where(m => m.TrangThai == "DaDuyet")
            .GroupBy(m => m.MonHoc.TenMon) // Đảm bảo đúng tên thuộc tính TenMon/Name
            .Select(g => new { Subject = g.Key, Count = g.Count() })
            .ToListAsync();

        // TÌM KIẾM TÀI LIỆU CỤ THỂ (Dựa trên từ khóa)
        var relatedMaterials = await _context.HocLieus
            .Include(m => m.MonHoc)
            .Where(m => m.TrangThai == "DaDuyet" && (
                EF.Functions.Like(m.TieuDe, $"%{query}%") ||
                EF.Functions.Like(m.MonHoc.TenMon, $"%{query}%")
            ))
            .Take(3)
            .ToListAsync();

        //  TỔNG HỢP NGỮ CẢNH (Context) SIÊU THÔNG MINH
        string systemPrompt = "Bạn là trợ lý AI của hệ thống học liệu. Dưới đây là báo cáo hiện tại của hệ thống:\n";
        systemPrompt += $"- Tổng số học liệu đã duyệt: {totalMaterials}\n";
        systemPrompt += "- Số lượng theo môn học:\n";
        foreach (var item in materialsBySubject)
        {
            systemPrompt += $"  + Môn {item.Subject}: {item.Count} tài liệu\n";
        }

        if (relatedMaterials.Any())
        {
            systemPrompt += "\nCác tài liệu cụ thể liên quan đến câu hỏi vừa rồi:\n";
            foreach (var m in relatedMaterials)
            {
                systemPrompt += $"- {m.TieuDe} (Môn: {m.MonHoc?.TenMon})\n";
            }
        }

        systemPrompt += "\nNhiệm vụ: Nếu người dùng hỏi về 'số lượng', 'bao nhiêu', hãy dùng dữ liệu thống kê ở trên để trả lời chính xác.";

        //  GỌI OPENAI
        try
        {
            var apiKey = _config["OpenAI:ApiKey"];
            var client = new OpenAIClient(apiKey);
            var chatClient = client.GetChatClient("gpt-4o-mini");

            var messages = new List<ChatMessage>()
            {
                new SystemChatMessage(systemPrompt),
                new UserChatMessage(request.Question)
            };

            var result = await chatClient.CompleteChatAsync(messages);
            return Ok(result.Value.Content[0].Text);
        }
        catch (Exception ex)
        {
            return Ok("Hệ thống AI đang bận, bạn vui lòng thử lại sau!");
        }
    }
}