using Microsoft.Extensions.Logging;
using MktZaloService.Domain.AggregatesModel.ConversationAggregate;
using MktZaloService.Infrastructure.Caching;

namespace MktZaloService.API.Application.Services;

/// <summary>
/// EN: Interface for chatbot engines.
/// VI: Interface cho các engine chatbot.
/// </summary>
public interface IChatbotEngine
{
    /// <summary>
    /// EN: Get the name of the engine.
    /// VI: Lấy tên của engine.
    /// </summary>
    string Name { get; }

    /// <summary>
    /// EN: Check if this engine can handle the message.
    /// VI: Kiểm tra xem engine này có thể xử lý tin nhắn không.
    /// </summary>
    Task<bool> CanHandleAsync(string userMessage, CancellationToken ct = default);

    /// <summary>
    /// EN: Generate a response for the user message.
    /// VI: Tạo phản hồi cho tin nhắn người dùng.
    /// </summary>
    Task<ChatbotResponse> GenerateResponseAsync(
        Guid conversationId,
        string userMessage,
        CancellationToken ct = default);
}

/// <summary>
/// EN: Response from a chatbot engine.
/// VI: Phản hồi từ engine chatbot.
/// </summary>
public record ChatbotResponse(
    bool Success,
    string? ResponseText = null,
    bool RequiresHumanHandoff = false,
    string? Error = null
);

/// <summary>
/// EN: AI chatbot engine using Azure OpenAI.
/// VI: Engine chatbot AI sử dụng Azure OpenAI.
/// </summary>
public class AiChatbotEngine : IChatbotEngine
{
    public string Name => "AI";

    private readonly IConversationCacheService _cacheService;
    private readonly IConversationRepository _conversationRepository;
    private readonly ILogger<AiChatbotEngine> _logger;

    // EN: System prompt for the AI / VI: Prompt hệ thống cho AI
    private const string SystemPrompt = """
        Bạn là trợ lý ảo thân thiện của cửa hàng. Hãy trả lời ngắn gọn, lịch sự bằng tiếng Việt.
        Nếu không biết câu trả lời, hãy đề nghị chuyển đến nhân viên hỗ trợ.
        Không bao giờ tiết lộ rằng bạn là AI.
        """;

    public AiChatbotEngine(
        IConversationCacheService cacheService,
        IConversationRepository conversationRepository,
        ILogger<AiChatbotEngine> logger)
    {
        _cacheService = cacheService;
        _conversationRepository = conversationRepository;
        _logger = logger;
    }

    public Task<bool> CanHandleAsync(string userMessage, CancellationToken ct = default)
    {
        // EN: AI engine is the fallback, so it can handle anything
        // VI: AI engine là fallback, nên có thể xử lý mọi thứ
        return Task.FromResult(true);
    }

    public async Task<ChatbotResponse> GenerateResponseAsync(
        Guid conversationId,
        string userMessage,
        CancellationToken ct = default)
    {
        try
        {
            // EN: Get conversation context from cache / VI: Lấy context cuộc hội thoại từ cache
            var context = await _cacheService.GetContextAsync(conversationId, ct);

            // EN: Build conversation history for context
            // VI: Xây dựng lịch sử hội thoại cho context
            var chatHistory = new List<(string Role, string Content)>
            {
                ("system", SystemPrompt)
            };

            // EN: Add recent messages from context if available
            // VI: Thêm các tin nhắn gần đây từ context nếu có
            if (context?.RecentMessages != null)
            {
                foreach (var msg in context.RecentMessages.TakeLast(10))
                {
                    chatHistory.Add((msg.IsFromBot ? "assistant" : "user", msg.Content));
                }
            }

            chatHistory.Add(("user", userMessage));

            // EN: NOTE: This is a placeholder. In production, integrate with Azure OpenAI:
            // VI: LƯU Ý: Đây là placeholder. Trong production, tích hợp với Azure OpenAI:
            // 
            // var client = new OpenAIClient(endpoint, credential);
            // var response = await client.GetChatCompletionsAsync(deploymentId, chatOptions, ct);
            // var responseText = response.Value.Choices[0].Message.Content;

            // EN: For now, return a placeholder response / VI: Tạm thời trả về phản hồi placeholder
            var responseText = GeneratePlaceholderResponse(userMessage);

            _logger.LogInformation(
                "EN: AI generated response for conversation {ConversationId}. VI: AI đã tạo phản hồi cho cuộc hội thoại {ConversationId}",
                conversationId);

            // EN: Update context cache / VI: Cập nhật cache context
            if (context != null)
            {
                context.RecentMessages.Add(new CachedMessage
                {
                    Content = userMessage,
                    IsFromBot = false,
                    SentAt = DateTime.UtcNow
                });
                context.RecentMessages.Add(new CachedMessage
                {
                    Content = responseText,
                    IsFromBot = true,
                    SentAt = DateTime.UtcNow
                });
                await _cacheService.SetContextAsync(conversationId, context, ct);
            }

            return new ChatbotResponse(true, ResponseText: responseText);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex,
                "EN: AI engine error. VI: Lỗi engine AI");
            return new ChatbotResponse(false, Error: ex.Message, RequiresHumanHandoff: true);
        }
    }

    /// <summary>
    /// EN: Generate a placeholder response (to be replaced with real AI).
    /// VI: Tạo phản hồi placeholder (sẽ thay bằng AI thật).
    /// </summary>
    private static string GeneratePlaceholderResponse(string userMessage)
    {
        var lowerMsg = userMessage.ToLowerInvariant();

        if (lowerMsg.Contains("cảm ơn") || lowerMsg.Contains("thank"))
        {
            return "Rất vui được hỗ trợ bạn! Nếu cần thêm thông tin, hãy liên hệ lại nhé.";
        }

        if (lowerMsg.Contains("?") || lowerMsg.Contains("gì") || lowerMsg.Contains("nào"))
        {
            return "Cảm ơn câu hỏi của bạn. Để được hỗ trợ chi tiết hơn, vui lòng liên hệ số hotline hoặc nhắn 'gặp nhân viên'.";
        }

        return "Cảm ơn bạn đã liên hệ. Chúng tôi sẽ phản hồi sớm nhất có thể!";
    }
}
