/// <summary>
 /// Convert MeasurementUnit Entity  into MeasurementUnit Object
 /// </summary>
 ///<param name="model">MeasurementUnitViewModel</param>
 ///<param name="MeasurementUnitEntity">DataAccess.MeasurementUnit</param>
 ///<returns>MeasurementUnitViewModel</returns>
 public static MeasurementUnitViewModel ToViewModel(
     this DataAccess.MeasurementUnit entity,
     MeasurementUnitViewModel model)
 {
     model.Id       = entity.Id;
     model.Name     = entity.Name;
     model.IsActive = entity.IsActive;
     return(model);
 }
        /// <summary>
        /// Delete an entity.
        /// </summary>
        /// <param name="model"></param>
        public void Delete(MeasurementUnitViewModel model)
        {
            var entity = model.ToEntity();

            this._MeasurementUnitsRepository.Delete(entity);

            #region Commit Changes
            this._unitOfWork.Commit();
            #endregion
        }
        /// <summary>
        /// Throw an exception if name is exist.
        /// </summary>
        /// <param name="model">MeasurementUnit view model</param>
        public void ThrowExceptionIfExist(MeasurementUnitViewModel model)
        {
            ConditionFilter <MeasurementUnit, long> condition = new ConditionFilter <MeasurementUnit, long>
            {
                Query = (entity =>
                         entity.Code == model.Code &&
                         entity.Id != model.Id)
            };
            var existEntity = this._MeasurementUnitsRepository.Get(condition).FirstOrDefault();

            if (existEntity != null)
            {
                throw new ItemAlreadyExistException((int)ErrorCodeEnum.CodeAlreadyExist);
            }
        }
        /// <summary>
        /// Convert MeasurementUnit Object into MeasurementUnit Entity
        /// </summary>
        ///<param name="model">MeasurementUnit</param>
        ///<param name="MeasurementUnitEntity">DataAccess.MeasurementUnit</param>
        ///<returns>DataAccess.MeasurementUnit</returns>
        public static DataAccess.MeasurementUnit ToEntity(this MeasurementUnitViewModel model,
                                                          DataAccess.MeasurementUnit entity)
        {
            if (entity.Id == 0)
            {
                entity.CreatedUserId = model.SessionUserId;
                entity.IsActive      = model.IsActive;
            }
            else
            {
                entity.UpdatedUserId    = model.SessionUserId;
                entity.UpdatedTimestamp = DateTime.Now;
            }
            entity.Name = model.Name;

            return(entity);
        }
        /// <summary>
        /// Update an entity.
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public MeasurementUnitViewModel Update(MeasurementUnitViewModel model)
        {
            this.ThrowExceptionIfExist(model);

            //var entity = model.ToEntity();
            var entity = this._MeasurementUnitsRepository.Get(model.Id);

            entity.Code = model.Code;
            entity.Date = model.Date;

            entity = this._MeasurementUnitsRepository.Update(entity);

            ConditionFilter <MeasurementUnit, long> conditionFilter = new ConditionFilter <MeasurementUnit, long>()
            {
                Query = (x =>
                         x.ParentKeyMeasurementUnitId == entity.Id)
            };
            var childs = this._MeasurementUnitsRepository.Get(conditionFilter);

            if (childs.Count() > 0)
            {
                var ar = childs.FirstOrDefault(x => x.Language == Language.Arabic);
                ar.Name        = model.NameAr;
                ar.Description = model.DescriptionAr;
                this._MeasurementUnitsRepository.Update(ar);

                var en = childs.FirstOrDefault(x => x.Language == Language.English);
                en.Name        = model.NameEn;
                en.Description = model.DescriptionEn;
                this._MeasurementUnitsRepository.Update(en);
            }

            #region Commit Changes
            this._unitOfWork.Commit();
            #endregion

            model = entity.ToModel();
            return(model);
        }
        /// <summary>
        /// Add an entity.
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public MeasurementUnitViewModel Add(MeasurementUnitViewModel model)
        {
            this.ThrowExceptionIfExist(model);

            var entity = model.ToEntity();

            entity = this._MeasurementUnitsRepository.Add(entity);

            var entityAr = new MeasurementUnit
            {
                Id          = entity.Id,
                Description = model.DescriptionAr,
                Name        = model.NameAr,
                Language    = Language.Arabic
            };

            entity.ChildTranslatedMeasurementUnits.Add(entityAr);
            this._MeasurementUnitsRepository.Add(entityAr);

            var entityEn = new MeasurementUnit
            {
                Id          = entity.Id,
                Description = model.DescriptionEn,
                Name        = model.NameEn,
                Language    = Language.English
            };

            entity.ChildTranslatedMeasurementUnits.Add(entityEn);
            this._MeasurementUnitsRepository.Add(entityEn);

            #region Commit Changes
            this._unitOfWork.Commit();
            #endregion

            model = entity.ToModel();
            return(model);
        }