using MktZaloService.Domain.SeedWork;

namespace MktZaloService.Domain.AggregatesModel.TemplateAggregate;

/// <summary>
/// EN: Repository interface for MessageTemplate aggregate.
/// VI: Interface repository cho MessageTemplate aggregate.
/// </summary>
public interface IMessageTemplateRepository : IRepository<MessageTemplate>
{
    /// <summary>
    /// EN: Get template by ID.
    /// VI: Lấy mẫu theo ID.
    /// </summary>
    Task<MessageTemplate?> GetByIdAsync(Guid id, CancellationToken ct = default);

    /// <summary>
    /// EN: Find template by Zalo template ID.
    /// VI: Tìm mẫu theo Zalo template ID.
    /// </summary>
    Task<MessageTemplate?> FindByZaloTemplateIdAsync(
        string zaloTemplateId,
        CancellationToken ct = default);

    /// <summary>
    /// EN: Get all approved templates.
    /// VI: Lấy tất cả mẫu đã được phê duyệt.
    /// </summary>
    Task<List<MessageTemplate>> GetApprovedTemplatesAsync(CancellationToken ct = default);

    /// <summary>
    /// EN: Get all templates.
    /// VI: Lấy tất cả mẫu.
    /// </summary>
    Task<List<MessageTemplate>> GetAllAsync(CancellationToken ct = default);

    /// <summary>
    /// EN: Add a new template.
    /// VI: Thêm mẫu mới.
    /// </summary>
    MessageTemplate Add(MessageTemplate template);

    /// <summary>
    /// EN: Update an existing template.
    /// VI: Cập nhật mẫu hiện có.
    /// </summary>
    void Update(MessageTemplate template);
}
