namespace PARR.DAL.Cache.Services.Base
{
    public interface IRedisCacheService
    {
        /// <summary>
        /// Получить кэшированные данные
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key"></param>
        /// <returns></returns>
        T? GetCachedData<T>(string key);

        /// <summary>
        /// Получить кэшированные данные асинхронно
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key"></param>
        /// <returns></returns>
        Task<T?> GetCachedDataAsync<T>(string key);

        /// <summary>
        /// Добавить в кэш данные
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key"></param>
        /// <param name="data"></param>
        /// <param name="cacheDuration"></param>
        void SetCachedData<T>(string key, T data, TimeSpan cacheDuration);

        /// <summary>
        /// Добавить в кэш данные асинхронно
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key"></param>
        /// <param name="data"></param>
        /// <param name="cacheDuration"></param>
        /// <returns></returns>
        Task SetCachedDataAsync<T>(string key, T data, TimeSpan cacheDuration);

        /// <summary>
        /// Удалить кэшированные данные 
        /// </summary>
        /// <param name="key"></param>
        void DeleteCachedData(string key);

        /// <summary>
        /// Удалить кэшированные данные асинхронно
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        Task DeleteCachedDataAsync(string key);

        /// <summary>
        /// Сгенерировать уникальный ключ
        /// </summary>
        /// <param name="keyParts"></param>
        /// <param name="isUseHash"></param>
        /// <returns></returns>
        string GetKey(string[] keyParts, bool isUseHash = false);
    }
}
