using WhatsAppService.Domain.SeedWork;

namespace WhatsAppService.Domain.AggregatesModel.AutomationFlowAggregate;

/// <summary>
/// EN: Trigger type enumeration for automation flows.
/// VI: Enumeration loại trigger cho automation flows.
/// </summary>
public class TriggerType : Enumeration
{
    /// <summary>
    /// EN: Keyword trigger - activates on specific keywords in message.
    /// VI: Trigger từ khóa - kích hoạt khi có từ khóa cụ thể trong tin nhắn.
    /// </summary>
    public static TriggerType Keyword = new(1, nameof(Keyword));

    /// <summary>
    /// EN: Event trigger - activates on system events (opt-in, order created, etc.).
    /// VI: Trigger sự kiện - kích hoạt khi có sự kiện hệ thống (opt-in, đơn hàng tạo, v.v.).
    /// </summary>
    public static TriggerType Event = new(2, nameof(Event));

    /// <summary>
    /// EN: Schedule trigger - activates on time-based schedule.
    /// VI: Trigger lịch trình - kích hoạt theo lịch trình thời gian.
    /// </summary>
    public static TriggerType Schedule = new(3, nameof(Schedule));

    public TriggerType(int id, string name) : base(id, name)
    {
    }

    public static IEnumerable<TriggerType> List() => GetAll<TriggerType>();

    public static TriggerType FromName(string name)
    {
        var type = List().SingleOrDefault(s => 
            string.Equals(s.Name, name, StringComparison.CurrentCultureIgnoreCase));

        if (type is null)
        {
            throw new ArgumentException($"Possible values for TriggerType: {string.Join(",", List().Select(s => s.Name))}");
        }

        return type;
    }

    public static TriggerType From(int id)
    {
        var type = List().SingleOrDefault(s => s.Id == id);

        if (type is null)
        {
            throw new ArgumentException($"Possible values for TriggerType: {string.Join(",", List().Select(s => s.Name))}");
        }

        return type;
    }
}
