using StorageService.Domain.SeedWork;

namespace StorageService.Domain.AggregatesModel.MultipartUploadAggregate;

/// <summary>
/// EN: Represents a single part of a multipart upload.
/// VI: Đại diện cho một part của multipart upload.
/// </summary>
public class MultipartUploadPart : Entity
{
    /// <summary>EN: Multipart upload ID / VI: ID của multipart upload</summary>
    public Guid MultipartUploadId { get; private set; }
    
    /// <summary>EN: Part number (1-indexed) / VI: Số thứ tự part (bắt đầu từ 1)</summary>
    public int PartNumber { get; private set; }
    
    /// <summary>EN: ETag returned by storage provider / VI: ETag trả về từ storage provider</summary>
    public string ETag { get; private set; } = string.Empty;
    
    /// <summary>EN: Part size in bytes / VI: Kích thước part (bytes)</summary>
    public long SizeBytes { get; private set; }
    
    /// <summary>EN: Upload timestamp / VI: Thời gian upload</summary>
    public DateTime UploadedAt { get; private set; }

    // EN: EF Core requires parameterless constructor / VI: EF Core cần constructor không tham số
    protected MultipartUploadPart() { }

    /// <summary>
    /// EN: Create a new multipart upload part.
    /// VI: Tạo một part mới cho multipart upload.
    /// </summary>
    public MultipartUploadPart(
        Guid multipartUploadId,
        int partNumber,
        string etag,
        long sizeBytes)
    {
        if (partNumber < 1)
            throw new ArgumentException("Part number must be >= 1", nameof(partNumber));
        if (string.IsNullOrWhiteSpace(etag))
            throw new ArgumentNullException(nameof(etag));
        if (sizeBytes <= 0)
            throw new ArgumentException("Size must be > 0", nameof(sizeBytes));

        Id = Guid.NewGuid();
        MultipartUploadId = multipartUploadId;
        PartNumber = partNumber;
        ETag = etag;
        SizeBytes = sizeBytes;
        UploadedAt = DateTime.UtcNow;
    }
}
