using Microsoft.Extensions.Caching.Memory;
namespace BpsRwApp.Services;
/// 
/// Interface untuk cache service yang mengelola caching operations
/// 
public interface ICacheService
{
    /// 
    /// Gets cached value or sets it using the provider function
    /// 
    /// Type of cached data
    /// Cache key
    /// Function to provide data if not in cache
    /// Cache expiration time
    /// Cache priority
    /// Cached or fresh data
    Task GetOrSetAsync(string key, Func> provider, TimeSpan expiration, CacheItemPriority priority = CacheItemPriority.Normal);
    /// 
    /// Gets cached value or sets it using sliding expiration
    /// 
    /// Type of cached data
    /// Cache key
    /// Function to provide data if not in cache
    /// Sliding expiration time
    /// Absolute expiration time
    /// Cache priority
    /// Cached or fresh data
    Task GetOrSetWithSlidingAsync(string key, Func> provider, TimeSpan slidingExpiration, TimeSpan absoluteExpiration, CacheItemPriority priority = CacheItemPriority.Normal);
    /// 
    /// Gets value from cache
    /// 
    /// Type of cached data
    /// Cache key
    /// Cached value or default
    T? Get(string key);
    /// 
    /// Sets value in cache
    /// 
    /// Type of data to cache
    /// Cache key
    /// Value to cache
    /// Cache expiration time
    /// Cache priority
    void Set(string key, T value, TimeSpan expiration, CacheItemPriority priority = CacheItemPriority.Normal);
    /// 
    /// Removes value from cache
    /// 
    /// Cache key
    void Remove(string key);
    /// 
    /// Removes multiple cache entries by pattern
    /// 
    /// Pattern to match cache keys
    void RemoveByPattern(string pattern);
    /// 
    /// Checks if key exists in cache
    /// 
    /// Cache key
    /// True if key exists
    bool Exists(string key);
}