namespace TakeoutSaaS.TenantApi.Contracts.Member;

/// <summary>
/// 消息触达统计请求。
/// </summary>
public sealed class MemberMessageReachStatsRequest
{
    /// <summary>
    /// 门店 ID（可选）。
    /// </summary>
    public string? StoreId { get; set; }
}

/// <summary>
/// 消息列表请求。
/// </summary>
public sealed class MemberMessageReachListRequest
{
    /// <summary>
    /// 状态过滤（draft/pending/sending/sent/failed）。
    /// </summary>
    public string? Status { get; set; }

    /// <summary>
    /// 渠道过滤（inapp/sms/wechat-mini）。
    /// </summary>
    public string? Channel { get; set; }

    /// <summary>
    /// 关键词（标题）。
    /// </summary>
    public string? Keyword { get; set; }

    /// <summary>
    /// 页码。
    /// </summary>
    public int Page { get; set; } = 1;

    /// <summary>
    /// 每页条数。
    /// </summary>
    public int PageSize { get; set; } = 10;
}

/// <summary>
/// 消息详情请求。
/// </summary>
public sealed class MemberMessageReachDetailRequest
{
    /// <summary>
    /// 消息 ID。
    /// </summary>
    public string MessageId { get; set; } = string.Empty;
}

/// <summary>
/// 保存消息请求。
/// </summary>
public sealed class SaveMemberMessageReachRequest
{
    /// <summary>
    /// 消息 ID（编辑时传）。
    /// </summary>
    public string? MessageId { get; set; }

    /// <summary>
    /// 门店 ID（可选）。
    /// </summary>
    public string? StoreId { get; set; }

    /// <summary>
    /// 模板 ID（可选）。
    /// </summary>
    public string? TemplateId { get; set; }

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

    /// <summary>
    /// 内容。
    /// </summary>
    public string Content { get; set; } = string.Empty;

    /// <summary>
    /// 发送渠道。
    /// </summary>
    public List<string> Channels { get; set; } = [];

    /// <summary>
    /// 目标类型（all/tag）。
    /// </summary>
    public string AudienceType { get; set; } = "all";

    /// <summary>
    /// 目标标签。
    /// </summary>
    public List<string> AudienceTags { get; set; } = [];

    /// <summary>
    /// 发送时间类型（immediate/scheduled）。
    /// </summary>
    public string ScheduleType { get; set; } = "immediate";

    /// <summary>
    /// 定时发送时间（UTC 或本地时间，后端统一转 UTC）。
    /// </summary>
    public DateTime? ScheduledAt { get; set; }

    /// <summary>
    /// 提交动作（draft/send）。
    /// </summary>
    public string SubmitAction { get; set; } = "draft";
}

/// <summary>
/// 删除消息请求。
/// </summary>
public sealed class DeleteMemberMessageReachRequest
{
    /// <summary>
    /// 消息 ID。
    /// </summary>
    public string MessageId { get; set; } = string.Empty;
}

/// <summary>
/// 估算人群请求。
/// </summary>
public sealed class MemberMessageAudienceEstimateRequest
{
    /// <summary>
    /// 目标类型（all/tag）。
    /// </summary>
    public string AudienceType { get; set; } = "all";

    /// <summary>
    /// 标签。
    /// </summary>
    public List<string> Tags { get; set; } = [];
}

/// <summary>
/// 模板列表请求。
/// </summary>
public sealed class MemberMessageTemplateListRequest
{
    /// <summary>
    /// 模板分类（marketing/notice/recall）。
    /// </summary>
    public string? Category { get; set; }

    /// <summary>
    /// 关键词（模板名称）。
    /// </summary>
    public string? Keyword { get; set; }

    /// <summary>
    /// 页码。
    /// </summary>
    public int Page { get; set; } = 1;

    /// <summary>
    /// 每页条数。
    /// </summary>
    public int PageSize { get; set; } = 10;
}

/// <summary>
/// 模板详情请求。
/// </summary>
public sealed class MemberMessageTemplateDetailRequest
{
    /// <summary>
    /// 模板 ID。
    /// </summary>
    public string TemplateId { get; set; } = string.Empty;
}

/// <summary>
/// 保存模板请求。
/// </summary>
public sealed class SaveMemberMessageTemplateRequest
{
    /// <summary>
    /// 模板 ID（编辑时传）。
    /// </summary>
    public string? TemplateId { get; set; }

    /// <summary>
    /// 模板名称。
    /// </summary>
    public string Name { get; set; } = string.Empty;

    /// <summary>
    /// 模板分类（marketing/notice/recall）。
    /// </summary>
    public string Category { get; set; } = "notice";

    /// <summary>
    /// 模板内容。
    /// </summary>
    public string Content { get; set; } = string.Empty;
}

/// <summary>
/// 删除模板请求。
/// </summary>
public sealed class DeleteMemberMessageTemplateRequest
{
    /// <summary>
    /// 模板 ID。
    /// </summary>
    public string TemplateId { get; set; } = string.Empty;
}

/// <summary>
/// 消息触达统计响应。
/// </summary>
public sealed class MemberMessageReachStatsResponse
{
    /// <summary>
    /// 本月发送条数。
    /// </summary>
    public int MonthlySentCount { get; set; }

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

    /// <summary>
    /// 打开率（百分比）。
    /// </summary>
    public decimal OpenRate { get; set; }

    /// <summary>
    /// 转化率（百分比）。
    /// </summary>
    public decimal ConversionRate { get; set; }
}

/// <summary>
/// 消息列表项响应。
/// </summary>
public sealed class MemberMessageReachListItemResponse
{
    /// <summary>
    /// 消息 ID。
    /// </summary>
    public string MessageId { get; set; } = string.Empty;

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

    /// <summary>
    /// 渠道。
    /// </summary>
    public List<string> Channels { get; set; } = [];

    /// <summary>
    /// 目标文案。
    /// </summary>
    public string AudienceText { get; set; } = string.Empty;

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

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

    /// <summary>
    /// 发送时间（yyyy-MM-dd HH:mm:ss）。
    /// </summary>
    public string? SentAt { get; set; }

    /// <summary>
    /// 定时发送时间（yyyy-MM-dd HH:mm:ss）。
    /// </summary>
    public string? ScheduledAt { get; set; }

    /// <summary>
    /// 打开率（百分比）。
    /// </summary>
    public decimal OpenRate { get; set; }

    /// <summary>
    /// 转化率（百分比）。
    /// </summary>
    public decimal ConversionRate { get; set; }
}

/// <summary>
/// 消息列表响应。
/// </summary>
public sealed class MemberMessageReachListResultResponse
{
    /// <summary>
    /// 列表。
    /// </summary>
    public List<MemberMessageReachListItemResponse> Items { get; set; } = [];

    /// <summary>
    /// 页码。
    /// </summary>
    public int Page { get; set; }

    /// <summary>
    /// 每页条数。
    /// </summary>
    public int PageSize { get; set; }

    /// <summary>
    /// 总数。
    /// </summary>
    public int TotalCount { get; set; }
}

/// <summary>
/// 收件明细响应。
/// </summary>
public sealed class MemberMessageReachRecipientResponse
{
    /// <summary>
    /// 会员 ID。
    /// </summary>
    public string MemberId { get; set; } = string.Empty;

    /// <summary>
    /// 渠道。
    /// </summary>
    public string Channel { get; set; } = string.Empty;

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

    /// <summary>
    /// 手机号。
    /// </summary>
    public string? Mobile { get; set; }

    /// <summary>
    /// OpenId。
    /// </summary>
    public string? OpenId { get; set; }

    /// <summary>
    /// 发送时间（yyyy-MM-dd HH:mm:ss）。
    /// </summary>
    public string? SentAt { get; set; }

    /// <summary>
    /// 已读时间（yyyy-MM-dd HH:mm:ss）。
    /// </summary>
    public string? ReadAt { get; set; }

    /// <summary>
    /// 转化时间（yyyy-MM-dd HH:mm:ss）。
    /// </summary>
    public string? ConvertedAt { get; set; }

    /// <summary>
    /// 错误信息。
    /// </summary>
    public string? ErrorMessage { get; set; }
}

/// <summary>
/// 消息详情响应。
/// </summary>
public sealed class MemberMessageReachDetailResponse
{
    /// <summary>
    /// 消息 ID。
    /// </summary>
    public string MessageId { get; set; } = string.Empty;

    /// <summary>
    /// 模板 ID。
    /// </summary>
    public string? TemplateId { get; set; }

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

    /// <summary>
    /// 内容。
    /// </summary>
    public string Content { get; set; } = string.Empty;

    /// <summary>
    /// 渠道。
    /// </summary>
    public List<string> Channels { get; set; } = [];

    /// <summary>
    /// 目标类型。
    /// </summary>
    public string AudienceType { get; set; } = string.Empty;

    /// <summary>
    /// 目标标签。
    /// </summary>
    public List<string> AudienceTags { get; set; } = [];

    /// <summary>
    /// 目标文案。
    /// </summary>
    public string AudienceText { get; set; } = string.Empty;

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

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

    /// <summary>
    /// 定时发送时间（yyyy-MM-dd HH:mm:ss）。
    /// </summary>
    public string? ScheduledAt { get; set; }

    /// <summary>
    /// 发送状态。
    /// </summary>
    public string Status { get; set; } = string.Empty;

    /// <summary>
    /// 实际发送时间（yyyy-MM-dd HH:mm:ss）。
    /// </summary>
    public string? 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>
    /// 打开率（百分比）。
    /// </summary>
    public decimal OpenRate { get; set; }

    /// <summary>
    /// 转化率（百分比）。
    /// </summary>
    public decimal ConversionRate { get; set; }

    /// <summary>
    /// 错误信息。
    /// </summary>
    public string? LastError { get; set; }

    /// <summary>
    /// 收件明细。
    /// </summary>
    public List<MemberMessageReachRecipientResponse> Recipients { get; set; } = [];
}

/// <summary>
/// 消息调度元信息响应。
/// </summary>
public sealed class MemberMessageDispatchMetaResponse
{
    /// <summary>
    /// 消息 ID。
    /// </summary>
    public string MessageId { get; set; } = string.Empty;

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

    /// <summary>
    /// 时间类型。
    /// </summary>
    public string ScheduleType { get; set; } = string.Empty;

    /// <summary>
    /// 定时发送时间（yyyy-MM-dd HH:mm:ss）。
    /// </summary>
    public string? ScheduledAt { get; set; }

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

/// <summary>
/// 模板响应。
/// </summary>
public sealed class MemberMessageTemplateResponse
{
    /// <summary>
    /// 模板 ID。
    /// </summary>
    public string TemplateId { get; set; } = string.Empty;

    /// <summary>
    /// 名称。
    /// </summary>
    public string Name { get; set; } = string.Empty;

    /// <summary>
    /// 分类。
    /// </summary>
    public string Category { get; set; } = string.Empty;

    /// <summary>
    /// 内容。
    /// </summary>
    public string Content { get; set; } = string.Empty;

    /// <summary>
    /// 使用次数。
    /// </summary>
    public int UsageCount { get; set; }

    /// <summary>
    /// 最近使用时间（yyyy-MM-dd HH:mm:ss）。
    /// </summary>
    public string? LastUsedAt { get; set; }
}

/// <summary>
/// 模板列表响应。
/// </summary>
public sealed class MemberMessageTemplateListResultResponse
{
    /// <summary>
    /// 列表。
    /// </summary>
    public List<MemberMessageTemplateResponse> Items { get; set; } = [];

    /// <summary>
    /// 页码。
    /// </summary>
    public int Page { get; set; }

    /// <summary>
    /// 每页条数。
    /// </summary>
    public int PageSize { get; set; }

    /// <summary>
    /// 总数。
    /// </summary>
    public int TotalCount { get; set; }
}

/// <summary>
/// 目标人群估算响应。
/// </summary>
public sealed class MemberMessageAudienceEstimateResponse
{
    /// <summary>
    /// 预计触达人数。
    /// </summary>
    public int ReachCount { get; set; }
}
