using MktZaloService.Domain.AggregatesModel.ChatbotRuleAggregate;
using MktZaloService.Domain.AggregatesModel.TemplateAggregate;
using MktZaloService.Domain.Enums;

namespace MktZaloService.Infrastructure.SeedData;

/// <summary>
/// EN: Static seed data for initial database setup.
/// VI: Dữ liệu seed tĩnh cho thiết lập database ban đầu.
/// </summary>
public static class DbSeeder
{
    /// <summary>
    /// EN: Seed default chatbot rules.
    /// VI: Seed các quy tắc chatbot mặc định.
    /// </summary>
    public static async Task SeedChatbotRulesAsync(
        MktZaloServiceContext context,
        CancellationToken ct = default)
    {
        if (context.ChatbotRules.Any())
        {
            return; // Already seeded
        }

        var rules = new List<ChatbotRule>
        {
            CreateGreetingRule(),
            CreateFaqPriceRule(),
            CreateFaqOpeningHoursRule(),
            CreateFaqLocationRule(),
            CreateHumanHandoffRule()
        };

        context.ChatbotRules.AddRange(rules);
        await context.SaveChangesAsync(ct);
    }

    /// <summary>
    /// EN: Seed default message templates.
    /// VI: Seed các mẫu tin nhắn mặc định.
    /// </summary>
    public static async Task SeedMessageTemplatesAsync(
        MktZaloServiceContext context,
        CancellationToken ct = default)
    {
        if (context.MessageTemplates.Any())
        {
            return; // Already seeded
        }

        var templates = new List<MessageTemplate>
        {
            CreateWelcomeTemplate(),
            CreateOrderConfirmationTemplate()
        };

        context.MessageTemplates.AddRange(templates);
        await context.SaveChangesAsync(ct);
    }

    #region Chatbot Rules

    private static ChatbotRule CreateGreetingRule()
    {
        var rule = new ChatbotRule(
            "Welcome Greeting",
            RuleType.Keyword,
            RuleAction.SendText("Xin chào! Cảm ơn bạn đã liên hệ. Tôi có thể giúp gì cho bạn?\n\nHello! Thank you for contacting us. How can I help you?"),
            priority: 100,
            description: "Auto-respond to greeting messages"
        );
        rule.AddCondition("message_text", "contains", "xin chào");
        rule.AddCondition("message_text", "contains", "hello");
        rule.AddCondition("message_text", "contains", "hi");
        rule.AddCondition("message_text", "contains", "chào");
        return rule;
    }

    private static ChatbotRule CreateFaqPriceRule()
    {
        var rule = new ChatbotRule(
            "FAQ: Price Inquiry",
            RuleType.Keyword,
            RuleAction.SendText("Bạn có thể xem bảng giá của chúng tôi tại: [link]\n\nYou can view our pricing at: [link]"),
            priority: 80,
            description: "Auto-respond to price questions"
        );
        rule.AddCondition("message_text", "contains", "giá");
        rule.AddCondition("message_text", "contains", "bao nhiêu");
        rule.AddCondition("message_text", "contains", "price");
        rule.AddCondition("message_text", "contains", "cost");
        return rule;
    }

    private static ChatbotRule CreateFaqOpeningHoursRule()
    {
        var rule = new ChatbotRule(
            "FAQ: Opening Hours",
            RuleType.Keyword,
            RuleAction.SendText("Giờ làm việc: 8:00 - 22:00 hàng ngày\n\nOpening hours: 8:00 AM - 10:00 PM daily"),
            priority: 80,
            description: "Auto-respond to opening hours questions"
        );
        rule.AddCondition("message_text", "contains", "giờ mở cửa");
        rule.AddCondition("message_text", "contains", "mấy giờ");
        rule.AddCondition("message_text", "contains", "opening");
        rule.AddCondition("message_text", "contains", "hours");
        return rule;
    }

    private static ChatbotRule CreateFaqLocationRule()
    {
        var rule = new ChatbotRule(
            "FAQ: Location",
            RuleType.Keyword,
            RuleAction.SendText("Địa chỉ: [Địa chỉ cửa hàng]\nGoogle Maps: [link]\n\nAddress: [Store Address]\nGoogle Maps: [link]"),
            priority: 80,
            description: "Auto-respond to location questions"
        );
        rule.AddCondition("message_text", "contains", "địa chỉ");
        rule.AddCondition("message_text", "contains", "ở đâu");
        rule.AddCondition("message_text", "contains", "location");
        rule.AddCondition("message_text", "contains", "address");
        return rule;
    }

    private static ChatbotRule CreateHumanHandoffRule()
    {
        var rule = new ChatbotRule(
            "Request Human Support",
            RuleType.Keyword,
            RuleAction.ForwardToHuman(),
            priority: 90,
            description: "Forward to human when customer requests support"
        );
        rule.AddCondition("message_text", "contains", "gặp nhân viên");
        rule.AddCondition("message_text", "contains", "hỗ trợ");
        rule.AddCondition("message_text", "contains", "human");
        rule.AddCondition("message_text", "contains", "support");
        rule.AddCondition("message_text", "contains", "agent");
        return rule;
    }

    #endregion

    #region Message Templates

    private static MessageTemplate CreateWelcomeTemplate()
    {
        var template = new MessageTemplate(
            "welcome_001",
            "Welcome Message",
            "Chào mừng {customer_name}! Cảm ơn bạn đã theo dõi OA của chúng tôi. Bạn sẽ nhận được thông tin ưu đãi và cập nhật mới nhất."
        );
        template.AddParameter("customer_name", isRequired: true);
        template.Approve(); // Pre-approved template
        return template;
    }

    private static MessageTemplate CreateOrderConfirmationTemplate()
    {
        var template = new MessageTemplate(
            "order_confirm_001",
            "Order Confirmation",
            "Đơn hàng #{order_id} của bạn đã được xác nhận.\nTổng tiền: {total_amount}\nDự kiến giao hàng: {delivery_date}"
        );
        template.AddParameter("order_id", isRequired: true);
        template.AddParameter("total_amount", isRequired: true);
        template.AddParameter("delivery_date", isRequired: true);
        template.Approve(); // Pre-approved template
        return template;
    }

    #endregion
}
