using LiteDB;

using skydiveLogs_api.Domain;
using skydiveLogs_api.Infrastructure.Interfaces;

namespace skydiveLogs_api.Infrastructure
{
    public class LiteDbProvider : IDataProvider
    {
        #region Public Constructors

        public LiteDbProvider(string connectionString)
        {
            _db = new LiteDatabase(connectionString);

            BsonMapper.Global.Entity<Jump>().DbRef(x => x.JumpType, "JumpType");
            BsonMapper.Global.Entity<Jump>().DbRef(x => x.Aircraft, "Aircraft");
            BsonMapper.Global.Entity<Jump>().DbRef(x => x.DropZone, "DropZone");
            BsonMapper.Global.Entity<Jump>().DbRef(x => x.Gear, "Gear");
            BsonMapper.Global.Entity<Jump>().DbRef(x => x.User, "User");

            BsonMapper.Global.Entity<UserImage>().DbRef(x => x.User, "User");

            BsonMapper.Global.Entity<Gear>().DbRef(x => x.User, "User");

            BsonMapper.Global.Entity<FavoriteDropZone>().DbRef(x => x.User, "User");
            BsonMapper.Global.Entity<FavoriteDropZone>().DbRef(x => x.DropZone, "DropZone");
        }

        #endregion Public Constructors

        #region Public Methods

        public void Close()
        {
            _db.Dispose();
        }

        public ILiteCollection<T> GetCollection<T>()
        {
            return _db.GetCollection<T>();
        }

        #endregion Public Methods

        #region Public Properties

        public ILiteCollection<Aircraft> CollOfAircraft => _db.GetCollection<Aircraft>();
        public ILiteCollection<DropZone> CollOfDropZone => _db.GetCollection<DropZone>();
        public ILiteCollection<FavoriteDropZone> CollOfFavoriteDropZone => _db.GetCollection<FavoriteDropZone>();
        public ILiteCollection<Gear> CollOfGear => _db.GetCollection<Gear>();
        public ILiteCollection<UserImage> CollOfImage => _db.GetCollection<UserImage>();
        public ILiteCollection<Jump> CollOfJump => _db.GetCollection<Jump>();
        public ILiteCollection<JumpType> CollOfJumpType => _db.GetCollection<JumpType>();
        public ILiteCollection<User> CollOfUser => _db.GetCollection<User>();

        #endregion Public Properties

        #region Private Fields

        private readonly LiteDatabase _db;

        #endregion Private Fields
    }
}