using skydiveLogs_api.Domain;
using skydiveLogs_api.DomainBusiness.Interfaces;
using System;
using System.Runtime.Caching;

namespace skydiveLogs_api.DomainBusiness
{
    public class CacheService : ICacheService
    {
        #region Public Constructors

        public CacheService()
        {
            _memoryCache = MemoryCache.Default;
        }

        #endregion Public Constructors

        #region Private Fields

        private readonly MemoryCache _memoryCache;

        #endregion Private Fields

        #region Public Methods

        public bool Contains(CacheType type, int userId = 0)
        {
            var key = GetKey(userId, type);
            return _memoryCache.Contains(key.ToString());
        }

        public void Delete(CacheType type, int userId = 0)
        {
            var key = GetKey(userId, type);
            _memoryCache.Remove(key.ToString());
        }

        public T Get<T>(CacheType type, int userId = 0)
        {
            var key = GetKey(userId, type);
            return (T)_memoryCache.Get(key.ToString());
        }

        public void Put(CacheType type, object value, int duration, int userId = 0)
        {
            var key = GetKey(userId, type);
            if (duration <= 0)
                throw new ArgumentException("Duration cannot be less or equal to zero", "duration");

            var policy = new CacheItemPolicy
            {
                AbsoluteExpiration = DateTime.Now.AddMilliseconds(duration)
            };

            _memoryCache.Set(key.ToString(), value, policy);
        }

        private string GetKey(int userId, CacheType type)
        {
            return $"{userId}-{type}";
        }

        #endregion Public Methods
    }
}