using TakeoutSaaS.Domain.Membership.Enums;
using TakeoutSaaS.Shared.Abstractions.Entities;

namespace TakeoutSaaS.Domain.Membership.Entities;

/// <summary>
/// 会员消息触达主记录。
/// </summary>
public sealed class MemberReachMessage : MultiTenantEntityBase
{
    /// <summary>
    /// 门店标识（可空，空表示当前商户全部可见门店）。
    /// </summary>
    public long? StoreId { get; set; }

    /// <summary>
    /// 模板标识（可空）。
    /// </summary>
    public long? TemplateId { get; set; }

    /// <summary>
    /// 消息标题。
    /// </summary>
    public string Title { get; set; } = string.Empty;

    /// <summary>
    /// 消息正文。
    /// </summary>
    public string Content { get; set; } = string.Empty;

    /// <summary>
    /// 渠道数组 JSON（字符串枚举）。
    /// </summary>
    public string ChannelsJson { get; set; } = "[]";

    /// <summary>
    /// 目标人群类型。
    /// </summary>
    public MemberMessageAudienceType AudienceType { get; set; } = MemberMessageAudienceType.All;

    /// <summary>
    /// 目标标签 JSON（字符串数组）。
    /// </summary>
    public string AudienceTagsJson { get; set; } = "[]";

    /// <summary>
    /// 预计触达人数。
    /// </summary>
    public int EstimatedReachCount { get; set; }

    /// <summary>
    /// 发送时间类型。
    /// </summary>
    public MemberMessageScheduleType ScheduleType { get; set; } = MemberMessageScheduleType.Immediate;

    /// <summary>
    /// 定时发送时间（UTC）。
    /// </summary>
    public DateTime? ScheduledAt { get; set; }

    /// <summary>
    /// 状态。
    /// </summary>
    public MemberMessageStatus Status { get; set; } = MemberMessageStatus.Draft;

    /// <summary>
    /// 实际发送时间（UTC）。
    /// </summary>
    public DateTime? SentAt { get; set; }

    /// <summary>
    /// 实际发送成功数量。
    /// </summary>
    public int SentCount { get; set; }

    /// <summary>
    /// 已读数量。
    /// </summary>
    public int ReadCount { get; set; }

    /// <summary>
    /// 转化数量。
    /// </summary>
    public int ConvertedCount { get; set; }

    /// <summary>
    /// Hangfire 任务 ID。
    /// </summary>
    public string? HangfireJobId { get; set; }

    /// <summary>
    /// 最近失败摘要。
    /// </summary>
    public string? LastError { get; set; }
}

