using System.Linq;
using iiie.CacheControl.DataAccess;
using iiie.CacheControl.DBO;

namespace iiie.CacheControl.Business.OutputCache
{
    public class DbOutputCache : IOutputCache
    {
        public string ConnectionString { get; set; }

        private CacheControlEntities GetDb()
        {
            if (ConnectionString == null)
                return new CacheControlEntities();
            return new CacheControlEntities(ConnectionString);
        }

        public override CacheDbo Get(string key)
        {
            using (var db = GetDb())
            {
                var item = db.T_Cache.FirstOrDefault(x => x.cachekey == key);
                if (item == null)
                    return null;
                return new CacheDbo
                {
                    Date = item.date,
                    ETag = item.etag,
                    Content = item.content,
                    ContentType = item.content_type
                };
            }
        }

        public override void Remove(string key)
        {
            using (var db = GetDb())
            {
                var item = db.T_Cache.FirstOrDefault(x => x.cachekey == key);
                if (item != null)
                {
                    db.T_Cache.Remove(item);
                    db.SaveChanges();
                }
            }
        }

        public override bool Contains(string key)
        {
            using (var db = GetDb())
            {
                return db.T_Cache.Any(x => x.cachekey == key);
            }
        }

        public override void Add(string key, CacheDbo o)
        {
            using (var db = GetDb())
            {
                db.T_Cache.Add(new T_Cache
                {
                    cachekey = key,
                    etag = o.ETag,
                    content = o.Content,
                    date = o.Date,
                    content_type = o.ContentType
                });
                db.SaveChanges();
            }
        }
    }
}