using MktZaloService.Domain.Enums;
using MktZaloService.Domain.SeedWork;

namespace MktZaloService.Domain.AggregatesModel.ChatbotRuleAggregate;

/// <summary>
/// EN: Value object representing a rule condition.
/// VI: Value object đại diện cho điều kiện quy tắc.
/// </summary>
public class RuleCondition : ValueObject
{
    /// <summary>
    /// EN: Field to evaluate (e.g., "message_text", "customer_segment").
    /// VI: Trường để đánh giá (ví dụ: "message_text", "customer_segment").
    /// </summary>
    public string Field { get; private set; } = string.Empty;

    /// <summary>
    /// EN: Comparison operator (e.g., "contains", "equals", "regex").
    /// VI: Toán tử so sánh (ví dụ: "contains", "equals", "regex").
    /// </summary>
    public string Operator { get; private set; } = string.Empty;

    /// <summary>
    /// EN: Value to compare against.
    /// VI: Giá trị để so sánh.
    /// </summary>
    public string Value { get; private set; } = string.Empty;

    /// <summary>
    /// EN: Required by EF Core.
    /// VI: Yêu cầu bởi EF Core.
    /// </summary>
    protected RuleCondition() { }

    /// <summary>
    /// EN: Create a new rule condition.
    /// VI: Tạo điều kiện quy tắc mới.
    /// </summary>
    public RuleCondition(string field, string @operator, string value)
    {
        Field = field ?? throw new ArgumentNullException(nameof(field));
        Operator = @operator ?? throw new ArgumentNullException(nameof(@operator));
        Value = value ?? throw new ArgumentNullException(nameof(value));
    }

    protected override IEnumerable<object?> GetEqualityComponents()
    {
        yield return Field;
        yield return Operator;
        yield return Value;
    }
}

/// <summary>
/// EN: Value object representing the action to take when rule matches.
/// VI: Value object đại diện cho hành động khi quy tắc khớp.
/// </summary>
public class RuleAction : ValueObject
{
    /// <summary>
    /// EN: Type of action to take.
    /// VI: Loại hành động cần thực hiện.
    /// </summary>
    public ActionType ActionType { get; private set; }

    /// <summary>
    /// EN: Response text for SendText action.
    /// VI: Văn bản phản hồi cho hành động SendText.
    /// </summary>
    public string? ResponseText { get; private set; }

    /// <summary>
    /// EN: Template ID for SendTemplate action.
    /// VI: ID mẫu cho hành động SendTemplate.
    /// </summary>
    public Guid? TemplateId { get; private set; }

    /// <summary>
    /// EN: Required by EF Core.
    /// VI: Yêu cầu bởi EF Core.
    /// </summary>
    protected RuleAction() { }

    /// <summary>
    /// EN: Create a text response action.
    /// VI: Tạo hành động phản hồi văn bản.
    /// </summary>
    public static RuleAction SendText(string responseText)
    {
        return new RuleAction
        {
            ActionType = ActionType.SendText,
            ResponseText = responseText ?? throw new ArgumentNullException(nameof(responseText))
        };
    }

    /// <summary>
    /// EN: Create a template response action.
    /// VI: Tạo hành động phản hồi mẫu.
    /// </summary>
    public static RuleAction SendTemplate(Guid templateId)
    {
        return new RuleAction
        {
            ActionType = ActionType.SendTemplate,
            TemplateId = templateId
        };
    }

    /// <summary>
    /// EN: Create a forward to human action.
    /// VI: Tạo hành động chuyển tiếp đến nhân viên.
    /// </summary>
    public static RuleAction ForwardToHuman()
    {
        return new RuleAction
        {
            ActionType = ActionType.ForwardToHuman
        };
    }

    protected override IEnumerable<object?> GetEqualityComponents()
    {
        yield return ActionType;
        yield return ResponseText;
        yield return TemplateId;
    }
}
