using StorageService.Domain.SeedWork;

namespace StorageService.Domain.AggregatesModel.FileVersionAggregate;

/// <summary>
/// EN: File version entity - represents a historical version of a file.
/// VI: Entity phiên bản file - đại diện cho một phiên bản lịch sử của file.
/// </summary>
public class FileVersion : Entity
{
    /// <summary>EN: File this version belongs to / VI: File mà version này thuộc về</summary>
    public Guid FileId { get; private set; }

    /// <summary>EN: Version number (1, 2, 3...) / VI: Số phiên bản (1, 2, 3...)</summary>
    public int VersionNumber { get; private set; }

    /// <summary>EN: Object key in storage / VI: Object key trong storage</summary>
    public string ObjectKey { get; private set; } = default!;

    /// <summary>EN: File size in bytes / VI: Kích thước file tính bằng bytes</summary>
    public long SizeBytes { get; private set; }

    /// <summary>EN: Content type / VI: Loại nội dung</summary>
    public string ContentType { get; private set; } = default!;

    /// <summary>EN: Checksum/Hash of the file / VI: Checksum/Hash của file</summary>
    public string? Checksum { get; private set; }

    /// <summary>EN: Version creation timestamp / VI: Thời gian tạo phiên bản</summary>
    public DateTime CreatedAt { get; private set; }

    /// <summary>EN: User who created this version / VI: User tạo phiên bản này</summary>
    public string CreatedBy { get; private set; } = default!;

    /// <summary>EN: Optional comment for version / VI: Ghi chú tùy chọn cho phiên bản</summary>
    public string? Comment { get; private set; }

    /// <summary>EN: Whether this is the current version / VI: Có phải phiên bản hiện tại không</summary>
    public bool IsCurrent { get; private set; }

    // EN: For EF Core / VI: Cho EF Core
    protected FileVersion() { }

    /// <summary>
    /// EN: Create a new file version.
    /// VI: Tạo phiên bản file mới.
    /// </summary>
    public FileVersion(
        Guid fileId,
        int versionNumber,
        string objectKey,
        long sizeBytes,
        string contentType,
        string createdBy,
        string? checksum = null,
        string? comment = null,
        bool isCurrent = true)
    {
        FileId = fileId;
        VersionNumber = versionNumber;
        ObjectKey = objectKey;
        SizeBytes = sizeBytes;
        ContentType = contentType;
        CreatedBy = createdBy;
        Checksum = checksum;
        Comment = comment;
        IsCurrent = isCurrent;
        CreatedAt = DateTime.UtcNow;
    }

    /// <summary>
    /// EN: Mark this version as current.
    /// VI: Đánh dấu phiên bản này là hiện tại.
    /// </summary>
    public void MarkAsCurrent()
    {
        IsCurrent = true;
    }

    /// <summary>
    /// EN: Unmark this version as current.
    /// VI: Bỏ đánh dấu phiên bản này là hiện tại.
    /// </summary>
    public void UnmarkAsCurrent()
    {
        IsCurrent = false;
    }
}
