using System;
using System.Collections.Generic;
using Kreta.Framework.Collections;
using Kreta.Framework.Collections.Generic;

namespace Kreta.Framework.Entities.Generic
{
    /// <summary>
    /// Entitások adatbázisműveleteit végző objektumának őse
    /// </summary>
    public abstract class EntityDataAccessor<EntityType> : IEntityDataAccessor<EntityType>, IEntityDataAccessor
        where EntityType : Kreta.Framework.Entities.Entity
    {

        protected abstract IEntityDBHelper<EntityType> dbhelper
        {
            get;
        }

        /// <summary>
        /// Beállítja a létrehozóját egy entitásnak
        /// </summary>
        /// <param name="entity">A beállítandó entitás</param>
        protected void SetEntityCreator(EntityType entity, DateTime timestamp, int uniqueidentifier)
        {
            entity.EntityCreated = timestamp;
            entity.EntityCreator = uniqueidentifier;
            //entity.EntitySubsCreator = UserContext.Instance.SubstituteEmployeePrintName;
        }

        /// <summary>
        /// Beállítja a módosítóját egy entitásnak
        /// </summary>
        /// <param name="entity">A beállítandó entitás</param>
        protected void SetEntityModifier(EntityType entity, DateTime timestamp, int uniqueidentifier)
        {
            entity.EntityLastChanged = timestamp;
            entity.EntityModifier = uniqueidentifier;
            //entity.EntitySubsLastModifier = UserContext.Instance.SubstituteEmployeePrintName;
        }

        #region ISDAEntityDataAccessor<EntityType> Members

        public abstract bool LoadEntity(EntityType entity, int entityId);

        public virtual bool FilteredLoadEntity(EntityType entity, int entityId, ColumnFilterMode columnFilterMode, IEnumerable<string> columns)
        {
            return LoadEntity(entity, entityId);
        }

        public abstract void LoadWithFilter(IEntityCollection<EntityType> collection, string filter, Dictionary<string, object> commandParameters);

        public virtual void LoadWithFilter(IEntityCollection<EntityType> collection, string filter, ColumnFilterMode columnFilterMode, IEnumerable<string> columns, Dictionary<string, object> commandParameters)
        {
            LoadWithFilter(collection, filter, commandParameters);
        }

        public abstract void InsertEntity(EntityType entity);

        public abstract bool UpdateEntity(EntityType entity);

        public abstract bool UpdateAssociations(EntityType entity);

        public abstract void DeleteEntity(EntityType entity, bool logikai = true);

        #endregion

        #region IEntityDataAccessor Members

        bool IEntityDataAccessor.LoadEntity(Entity entity, int entityId)
        {
            return LoadEntity((EntityType)entity, entityId);
        }

        bool IEntityDataAccessor.FilteredLoadEntity(Entity entity, int entityId, ColumnFilterMode columnFilterMode, IEnumerable<string> columns)
        {
            return FilteredLoadEntity((EntityType)entity, entityId, columnFilterMode, columns);
        }

        void IEntityDataAccessor.LoadWithFilter(IEntityCollection collection, string filter, Dictionary<string, object> commandParameters)
        {
            LoadWithFilter((IEntityCollection<EntityType>)collection, filter, commandParameters);
        }

        void IEntityDataAccessor.InsertEntity(Entity entity)
        {
            InsertEntity((EntityType)entity);
        }

        bool IEntityDataAccessor.UpdateEntity(Entity entity)
        {
            return UpdateEntity((EntityType)entity);
        }

        bool IEntityDataAccessor.UpdateAssociations(Entity entity)
        {
            return UpdateAssociations((EntityType)entity);
        }

        void IEntityDataAccessor.DeleteEntity(Entity entity, bool logikai)
        {
            DeleteEntity((EntityType)entity, logikai);
        }

        #endregion
    }
}