using CatalogService.Domain.SeedWork;

namespace CatalogService.Domain.AggregatesModel.SampleAggregate;

/// <summary>
/// EN: Repository interface for Sample aggregate.
/// VI: Interface repository cho Sample aggregate.
/// </summary>
/// <remarks>
/// EN: Following repository pattern, this interface defines the contract
/// for data access operations on Sample aggregate.
/// VI: Theo pattern repository, interface này định nghĩa contract
/// cho các thao tác truy cập dữ liệu trên Sample aggregate.
/// </remarks>
public interface ISampleRepository : IRepository<Sample>
{
    /// <summary>
    /// EN: Get a sample by its ID.
    /// VI: Lấy một sample theo ID.
    /// </summary>
    /// <param name="sampleId">EN: The sample ID / VI: ID của sample</param>
    /// <returns>EN: The sample or null if not found / VI: Sample hoặc null nếu không tìm thấy</returns>
    Task<Sample?> GetAsync(Guid sampleId);

    /// <summary>
    /// EN: Get all samples.
    /// VI: Lấy tất cả samples.
    /// </summary>
    /// <returns>EN: List of samples / VI: Danh sách samples</returns>
    Task<IEnumerable<Sample>> GetAllAsync();

    /// <summary>
    /// EN: Add a new sample.
    /// VI: Thêm một sample mới.
    /// </summary>
    /// <param name="sample">EN: The sample to add / VI: Sample cần thêm</param>
    /// <returns>EN: The added sample / VI: Sample đã thêm</returns>
    Sample Add(Sample sample);

    /// <summary>
    /// EN: Update an existing sample.
    /// VI: Cập nhật một sample đã tồn tại.
    /// </summary>
    /// <param name="sample">EN: The sample to update / VI: Sample cần cập nhật</param>
    void Update(Sample sample);

    /// <summary>
    /// EN: Delete a sample.
    /// VI: Xóa một sample.
    /// </summary>
    /// <param name="sample">EN: The sample to delete / VI: Sample cần xóa</param>
    void Delete(Sample sample);

    /// <summary>
    /// EN: Get samples by status.
    /// VI: Lấy samples theo trạng thái.
    /// </summary>
    /// <param name="statusId">EN: The status ID / VI: ID trạng thái</param>
    /// <returns>EN: List of samples with given status / VI: Danh sách samples với trạng thái cho trước</returns>
    Task<IEnumerable<Sample>> GetByStatusAsync(int statusId);
}
