private ResponseModel<string> AllocateMultipleTasksMultipleAssignTypeThreadToUserByRefKey(CreateTemplateQuestionInfo clientJobInfo, string refKey, string username)
        {
            var response = new ResponseModel<string>();
            var ifAlreadyAllocated = _db.UserMultipleJobMappings.SingleOrDefault(x => x.refKey == refKey && x.username == username);
            if (ifAlreadyAllocated != null)
            {
                response.Status = 403;
                response.Message = "You have already applied for this job";
                return response;
            }
            else if (_db.UserMultipleJobMappings.Where(x => x.refKey == refKey && x.isFirst == Constants.status_true).Count() >= Convert.ToInt32((clientJobInfo.totalThreads)))
            {
                response.Status = 405;
                response.Message = "all threads are already allocated !!!";
                return response;
            }
            const int expectedDeliveryTimeInMinutes = 15;

            

            var availableJobLists = _db.CreateTemplateImgurImagesLists.Where(x => x.referenceKey == refKey && x.status == Constants.status_open).ToList();
            if (availableJobLists != null)
            {
                if (availableJobLists.Count == 0)
                {
                    response.Status = 406;
                    response.Message = "All Threads of this job is already assigned.";
                    return response;
                }

                lock (this)
                {
                    int endCount = Constants.picPerUserImageModeration;
                    if (availableJobLists.Count <= endCount)
                    {
                        endCount = availableJobLists.Count;
                    }

                    for (int i = 0; i < endCount; i++)
                    {
                        var transcriptionTask = availableJobLists[i];
                        var UserMultipleJobMapping = new UserMultipleJobMapping();
                        UserMultipleJobMapping.endTime = Constants.NA;
                        UserMultipleJobMapping.expectedDelivery = DateTime.Now.AddMinutes(expectedDeliveryTimeInMinutes).ToString();
                        UserMultipleJobMapping.refKey = refKey;
                        UserMultipleJobMapping.startTime = DateTime.Now.ToString();
                        UserMultipleJobMapping.status = Constants.status_assigned;

                        if (clientJobInfo.type == Constants.type_moderation && clientJobInfo.subType == Constants.subType_moderatingPhotos)
                        {
                            UserMultipleJobMapping.subType = Constants.subType_moderatingPhotos;
                            UserMultipleJobMapping.type = Constants.type_moderation;
                        }
                        else if (clientJobInfo.type == Constants.type_dataEntry && clientJobInfo.subType == Constants.subType_Transcription)
                        {
                            UserMultipleJobMapping.subType = Constants.subType_Transcription;
                            UserMultipleJobMapping.type = Constants.type_dataEntry;
                        }
                        UserMultipleJobMapping.surveyResult = Constants.NA;
                        UserMultipleJobMapping.username = username;

                        UserMultipleJobMapping.imageKey = transcriptionTask.imgurLink;                        

                        var updateImgurImageMapAfterAssigning = _db.CreateTemplateImgurImagesLists.SingleOrDefault(x => x.Id == transcriptionTask.Id);
                        if (i == 0)
                            UserMultipleJobMapping.isFirst = Constants.status_true;

                        if (updateImgurImageMapAfterAssigning.alocatedCount == null)
                        {
                            updateImgurImageMapAfterAssigning.alocatedCount = 1;                            
                        }
                        else
                            updateImgurImageMapAfterAssigning.alocatedCount += 1;
                        if (updateImgurImageMapAfterAssigning.alocatedCount > (Constants.picPerUserImageModeration-1))
                        {                           
                            updateImgurImageMapAfterAssigning.status = Constants.status_assigned;
                        }
                        _db.UserMultipleJobMappings.Add(UserMultipleJobMapping);
                    }

                    try
                    {

                        _db.SaveChanges();
                        long JobId = clientJobInfo.Id;
                        long JobCompleted = _db.UserMultipleJobMappings.Where(x => x.refKey == refKey && x.status == Constants.status_done).Count();
                        long JobAssigned = _db.UserMultipleJobMappings.Where(x => x.refKey == refKey && x.status == Constants.status_assigned).Count();
                        long JobReviewed = (JobCompleted > 1) ? (JobCompleted) / 2 : 0;  // currently hard coded.

                        bool status = new UserUpdatesClientRealTimeData().UpdateClientRealTimeData(JobId, JobCompleted, JobAssigned, JobReviewed, clientJobInfo.totalThreads, clientJobInfo.username);
                        response.Status = 200;
                        response.Message = "success-";
                        response.Payload = refKey;
                    }
                    catch (DbEntityValidationException e)
                    {

                        DbContextException.LogDbContextException(e);
                        response.Status = 500;
                        response.Message = "Failed";
                        response.Payload = "Exception Occured";
                    }
                }

            }

            return response;
        }
        private ResponseModel<string> AllocateMultipleAssignTypeThreadToUserByRefKey(CreateTemplateQuestionInfo clientJobInfo, string refKey, string username)
        {
            var response = new ResponseModel<string>();
            var ifAlreadyAllocated = _db.UserMultipleJobMappings.SingleOrDefault(x => x.refKey == refKey && x.username == username);
            if (ifAlreadyAllocated != null)
            {
                response.Status = 403;
                response.Message = "You have already applied for this job";
                return response;
            }
            else if (_db.UserMultipleJobMappings.Where(x => x.refKey == refKey && x.isFirst == Constants.status_true).Count() >= Convert.ToInt32((clientJobInfo.totalThreads)))
            {
                response.Status = 405;
                response.Message = "all threads are already allocated !!!";
                return response;
            }

            const int expectedDeliveryTimeInMinutes = 15;

            var UserMultipleJobMapping = new UserMultipleJobMapping();
            UserMultipleJobMapping.endTime = Constants.NA;
            UserMultipleJobMapping.expectedDelivery = DateTime.Now.AddMinutes(expectedDeliveryTimeInMinutes).ToString();
            UserMultipleJobMapping.refKey = refKey;
            UserMultipleJobMapping.startTime = DateTime.Now.ToString();
            UserMultipleJobMapping.status = Constants.status_assigned;

            if (clientJobInfo.type == Constants.type_moderation && clientJobInfo.subType == Constants.subType_moderatingPhotos)
            {
                UserMultipleJobMapping.subType = Constants.subType_moderatingPhotos;
                UserMultipleJobMapping.type = Constants.type_moderation;
            }
            else if (clientJobInfo.type == Constants.type_dataEntry && clientJobInfo.subType == Constants.subType_Transcription)
            {
                UserMultipleJobMapping.subType = Constants.subType_Transcription;
                UserMultipleJobMapping.type = Constants.type_dataEntry;
            }
            UserMultipleJobMapping.surveyResult = Constants.NA;
            UserMultipleJobMapping.username = username;

            var availableJobLists = _db.CreateTemplateImgurImagesLists.Where(x => x.referenceKey == refKey && x.status == Constants.status_open).ToList();
            if (availableJobLists != null)
            {
                if (availableJobLists.Count == 0)
                {
                    response.Status = 406;
                    response.Message = "All Threads of this job is already assigned.";
                    return response;
                }
                var transcriptionTask = availableJobLists.First();
                try
                {
                    //to be inclucded in lock
                    lock (this)
                    {
                        UserMultipleJobMapping.imageKey = transcriptionTask.imgurLink;
                        var updateImgurImageMapAfterAssigning = _db.CreateTemplateImgurImagesLists.SingleOrDefault(x => x.Id == transcriptionTask.Id);
                        updateImgurImageMapAfterAssigning.status = Constants.status_assigned;
                        _db.UserMultipleJobMappings.Add(UserMultipleJobMapping);
                        _db.SaveChanges();
                    }
                    //to be inclucded in lock


                    long JobId = clientJobInfo.Id;
                    long JobCompleted = _db.UserMultipleJobMappings.Where(x => x.refKey == refKey && x.status == Constants.status_done).Count();
                    long JobAssigned = _db.UserMultipleJobMappings.Where(x => x.refKey == refKey && x.status == Constants.status_assigned).Count();
                    long JobReviewed = (JobCompleted > 1) ? (JobCompleted) / 2 : 0;  // currently hard coded.

                    //var SignalRClientHub = new SignalRClientHub();
                    //var hubContext = GlobalHost.ConnectionManager.GetHubContext<SignalRClientHub>();
                    //dynamic client = SignalRManager.getSignalRDetail(clientJobInfo.username);
                    //if (client != null)
                    //{
                    //    client.updateClientProgressChart(Convert.ToString(JobId), clientJobInfo.totalThreads, Convert.ToString(JobCompleted), Convert.ToString(JobAssigned), Convert.ToString(JobReviewed));
                    //    //client.updateClientProgressChart("8", "20", "10", "8", "5");
                    //    //client.addMessage("add message signalR");
                    //}
                    bool status = new UserUpdatesClientRealTimeData().UpdateClientRealTimeData(JobId, JobCompleted, JobAssigned, JobReviewed, clientJobInfo.totalThreads, clientJobInfo.username);
                    response.Status = 200;
                    response.Message = "success-";
                    response.Payload = refKey;
                }
                catch (DbEntityValidationException e)
                {
                    DbContextException.LogDbContextException(e);
                    response.Status = 500;
                    response.Message = "Failed";
                    response.Payload = "Exception Occured";
                }
            }
            //UserMultipleJobMapping.imageKey = 


            return response;
        }