using MediatR;
using StorageService.API.Application.Queries;
using StorageService.Domain.AggregatesModel.FileAggregate;

namespace StorageService.API.Application.Commands;

/// <summary>
/// EN: Command to confirm a direct upload after client uploads to MinIO.
/// VI: Command để xác nhận upload trực tiếp sau khi client upload lên MinIO.
/// </summary>
/// <remarks>
/// EN: Called after client successfully uploads file using pre-signed URL.
///     This saves metadata and updates quota.
/// VI: Được gọi sau khi client upload file thành công bằng pre-signed URL.
///     Lưu metadata và cập nhật quota.
/// </remarks>
/// <param name="UserId">EN: User ID who uploaded / VI: ID người dùng đã upload</param>
/// <param name="ObjectKey">EN: Object key returned from sign-upload / VI: Object key được trả về từ sign-upload</param>
/// <param name="FileName">EN: Original file name / VI: Tên file gốc</param>
/// <param name="ContentType">EN: MIME content type / VI: Content type MIME</param>
/// <param name="FileSizeBytes">EN: File size in bytes / VI: Kích thước file (bytes)</param>
/// <param name="AccessLevel">EN: Access level / VI: Mức truy cập</param>
/// <param name="TenantId">EN: Optional tenant ID / VI: Tenant ID (tùy chọn)</param>
public record ConfirmUploadCommand(
    string UserId,
    string ObjectKey,
    string FileName,
    string ContentType,
    long FileSizeBytes,
    FileAccessLevel AccessLevel = FileAccessLevel.Private,
    string? TenantId = null
) : IRequest<ConfirmUploadResult>;

/// <summary>
/// EN: Result of confirm upload containing file metadata.
/// VI: Kết quả xác nhận upload chứa metadata file.
/// </summary>
/// <param name="Success">EN: Whether confirmation was successful / VI: Xác nhận có thành công không</param>
/// <param name="FileId">EN: File ID in database / VI: ID file trong database</param>
/// <param name="Metadata">EN: File metadata / VI: Metadata file</param>
/// <param name="Error">EN: Error message if failed / VI: Thông báo lỗi nếu thất bại</param>
public record ConfirmUploadResult(
    bool Success,
    Guid? FileId,
    FileDto? Metadata,
    string? Error
)
{
    /// <summary>
    /// EN: Create a successful result.
    /// VI: Tạo kết quả thành công.
    /// </summary>
    public static ConfirmUploadResult Ok(Guid fileId, FileDto metadata) =>
        new(true, fileId, metadata, null);

    /// <summary>
    /// EN: Create a failed result.
    /// VI: Tạo kết quả thất bại.
    /// </summary>
    public static ConfirmUploadResult Fail(string error) =>
        new(false, null, null, error);
}
