using StorageService.Domain.AggregatesModel.FileAggregate;

namespace StorageService.Infrastructure.CDN;

/// <summary>
/// EN: CDN service interface for generating CDN URLs.
/// VI: Interface CDN service để tạo CDN URLs.
/// </summary>
public interface ICDNService
{
    /// <summary>
    /// EN: Check if CDN is enabled.
    /// VI: Kiểm tra CDN có được bật hay không.
    /// </summary>
    bool IsEnabled { get; }

    /// <summary>
    /// EN: Generate CDN URL for a file.
    /// VI: Tạo CDN URL cho file.
    /// </summary>
    /// <param name="objectKey">Storage object key / Key của object trong storage</param>
    /// <param name="accessLevel">File access level / Mức truy cập file</param>
    /// <returns>CDN URL or null if CDN not applicable / URL CDN hoặc null nếu không áp dụng CDN</returns>
    string? GetCDNUrl(string objectKey, FileAccessLevel accessLevel);

    /// <summary>
    /// EN: Generate CDN URL with cache headers.
    /// VI: Tạo CDN URL với cache headers.
    /// </summary>
    /// <param name="objectKey">Storage object key / Key của object trong storage</param>
    /// <param name="accessLevel">File access level / Mức truy cập file</param>
    /// <param name="contentType">Content type for cache TTL / Content type để xác định TTL cache</param>
    /// <returns>CDN URL result with cache info / Kết quả URL CDN với thông tin cache</returns>
    CDNUrlResult? GetCDNUrlWithCacheInfo(string objectKey, FileAccessLevel accessLevel, string contentType);
}

/// <summary>
/// EN: CDN URL generation result.
/// VI: Kết quả tạo CDN URL.
/// </summary>
public record CDNUrlResult(
    string Url,
    int CacheTtlSeconds,
    string CacheControl);
