using MktXService.Domain.SeedWork;

namespace MktXService.Domain.AggregatesModel.ContactAggregate;

/// <summary>
/// EN: Repository interface for Contact aggregate.
/// VI: Interface repository cho Contact aggregate.
/// </summary>
public interface IContactRepository : IRepository<Contact>
{
    /// <summary>
    /// EN: Add a new contact.
    /// VI: Thêm một liên hệ mới.
    /// </summary>
    Contact Add(Contact contact);

    /// <summary>
    /// EN: Update an existing contact.
    /// VI: Cập nhật một liên hệ hiện có.
    /// </summary>
    void Update(Contact contact);

    /// <summary>
    /// EN: Delete a contact.
    /// VI: Xóa một liên hệ.
    /// </summary>
    void Delete(Contact contact);

    /// <summary>
    /// EN: Get contact by ID.
    /// VI: Lấy liên hệ theo ID.
    /// </summary>
    Task<Contact?> GetByIdAsync(Guid id);

    /// <summary>
    /// EN: Get contact by Twitter user ID and account ID.
    /// VI: Lấy liên hệ theo Twitter user ID và account ID.
    /// </summary>
    Task<Contact?> GetByTwitterUserIdAsync(Guid accountId, string twitterUserId);

    /// <summary>
    /// EN: Get all contacts for an account with pagination.
    /// VI: Lấy tất cả liên hệ của một account với phân trang.
    /// </summary>
    Task<IEnumerable<Contact>> GetByAccountIdAsync(Guid accountId, int skip = 0, int take = 20);

    /// <summary>
    /// EN: Get contacts by tags.
    /// VI: Lấy liên hệ theo tags.
    /// </summary>
    Task<IEnumerable<Contact>> GetByTagsAsync(Guid accountId, IEnumerable<string> tags, int skip = 0, int take = 20);

    /// <summary>
    /// EN: Search contacts by username or display name.
    /// VI: Tìm kiếm liên hệ theo username hoặc tên hiển thị.
    /// </summary>
    Task<IEnumerable<Contact>> SearchAsync(Guid accountId, string searchTerm, int skip = 0, int take = 20);

    /// <summary>
    /// EN: Count total contacts for an account.
    /// VI: Đếm tổng số liên hệ của một account.
    /// </summary>
    Task<int> CountByAccountIdAsync(Guid accountId);
}
