namespace MembershipService.Domain.SeedWork;

/// <summary>
/// EN: Unit of Work pattern interface.
/// VI: Interface cho Unit of Work pattern.
/// </summary>
/// <remarks>
/// EN: Maintains a list of objects affected by a business transaction
/// and coordinates the writing out of changes.
/// VI: Duy trì danh sách các đối tượng bị ảnh hưởng bởi một transaction nghiệp vụ
/// và điều phối việc ghi các thay đổi.
/// </remarks>
public interface IUnitOfWork : IDisposable
{
    /// <summary>
    /// EN: Save all changes made in this unit of work.
    /// VI: Lưu tất cả các thay đổi được thực hiện trong unit of work này.
    /// </summary>
    /// <param name="cancellationToken">EN: Cancellation token / VI: Token hủy</param>
    /// <returns>EN: Number of entities written / VI: Số entity đã ghi</returns>
    Task<int> SaveChangesAsync(CancellationToken cancellationToken = default);

    /// <summary>
    /// EN: Save all changes and dispatch domain events.
    /// VI: Lưu tất cả thay đổi và dispatch domain events.
    /// </summary>
    /// <param name="cancellationToken">EN: Cancellation token / VI: Token hủy</param>
    /// <returns>EN: True if successful / VI: True nếu thành công</returns>
    Task<bool> SaveEntitiesAsync(CancellationToken cancellationToken = default);
}
