public ActionResult DeleteLoFromCourse(string courseId, string loId)
        {
            if (courseId == null || loId == null)
            {
                _logger.Trace("Deleting LO from course. Course or LO Id == null");
                return RedirectToAction("MessagePage", "Home", "ID is null");
            }

            var course = _dbContext.Courses.Find(x => x.Id == ObjectId.Parse(courseId)).SingleAsync().Result;
            if (course != null)
            {
                course.ListOfLosId.Remove(ObjectId.Parse(loId));

                var lo = _dbContext.LOs.Find(x => x.Id == ObjectId.Parse(loId)).SingleAsync().Result;
                course.Duration -= lo.Duration;

                _dbContext.Courses.ReplaceOneAsync(x => x.Id == ObjectId.Parse(courseId), course);
                _logger.Trace("Deleting LO from course.");
                return RedirectToAction("DetailsOfCourse", "Home", courseId);
            }
            else
            {
                _logger.Trace("Deleting LO from course. Error");
                MessageOnPage errorMessage = new MessageOnPage("Error", "No course in base with id: " + courseId);
                return RedirectToAction("MessagePage", "Home", errorMessage);
            }
        }
        public ActionResult DeleteTask(string id)
        {
            if (id == null)
            {
                _logger.Trace("Task deleting by ID: id == null" );
                MessageOnPage msg = new MessageOnPage("Task ID is null");
                return RedirectToAction("MessagePage", "Home", msg);
            }

            TaskManagerClient client = new TaskManagerClient();
            client.CancelTask(ObjectId.Parse(id)); //If task is run we have to cancel it first

            var filter = Builders<GaTask>.Filter.Eq(s => s.Id, ObjectId.Parse(id));
            _dbContext.CoursesCreatingTasks.DeleteOneAsync(filter);
            _logger.Trace("Task deleting by ID: ");
            return RedirectToAction("UserTasks", "Home");
        }
        public ActionResult CreateLo(LearningObject incomingLo)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    incomingLo.CreationTime = DateTime.Now;
                    incomingLo.LastModifiedTime = DateTime.Now;

                    var obj = ViewData["CustomUser"];
                    if (obj != null)
                    {
                        User currentUser = obj as User;
                        if (currentUser == null)
                        {
                            _logger.Trace("Error during LO saving: currentUser == null");
                            MessageOnPage errormsg = new MessageOnPage(" Error with current user identification");
                            return RedirectToAction("MessagePage", "Home", errormsg);
                        }

                        incomingLo.AuthorEmail = currentUser.Email;

                        _dbContext.LOs.InsertOneAsync(incomingLo);
                        _logger.Trace("User: "******" succesfully created LO");
                        return RedirectToAction("LOList", "Home");
                    }
                    else
                    {
                        _logger.Trace("Error during new LO saving: user cookies are corrupted or user are not log in");
                        throw new Exception("User cookies are corrupted or user are not log in");
                    }
                }
                catch (Exception ex)
                {
                    _logger.Trace("Error during new LO saving: " + ex.Message);
                    string exceptionMessage = ex.Message;
                    string wholeMessage = @"<script language=""javascript"">alert('\n" + "Error during saving to database\n" + exceptionMessage + @"\n')</script>";
                    Response.Write(wholeMessage);
                }
            }
            return View(incomingLo);
        }
        public ActionResult DeleteKnowledge(string id)
        {
            if (id == null)
            {
                _logger.Trace("Delete knowledge from ontology by ID: ");
                MessageOnPage msg = new MessageOnPage("Knowledge ID is null");
                return RedirectToAction("MessagePage", "Home", msg);
            }

            var knowledge = _dbContext.KnowledgesCollection.Find(x => x.Id == ObjectId.Parse(id)).SingleAsync().Result;
            List<Relation> relations = new List<Relation>();

            relations.AddRange(knowledge.Inputs);
            relations.AddRange(knowledge.Outputs);

            foreach (var relation in relations) //Delete all input and putput relations
            {
                var relation1 = relation;
                _dbContext.OntologyRelationsCollection.DeleteOneAsync(x => x.Id == relation1.Id);
            }

            var filter = Builders<Knowledge>.Filter.Eq(s => s.Id, ObjectId.Parse(id));
            _dbContext.KnowledgesCollection.DeleteOneAsync(filter);
            _logger.Trace("Delete knowledge by ID: ");
            return RedirectToAction("Ontology", "Home");
        }
        public ActionResult NewTask()
        {
            User currentUser = null;
            var obj = ViewData["CustomUser"];
            if (obj != null)
            {
                currentUser = obj as User;
            }

            if (currentUser == null)
            {
                _logger.Trace("New task page request by unregistered user.");
                MessageOnPage msg = new MessageOnPage("Error with user identification");
                return RedirectToAction("MessagePage", "Home", msg);
            }

            GaTask task = new GaTask()
            {
                Title = "Default task",
                Description = "Default task description",
                AuthorEmail = currentUser.Email,
                BestFfValues = new Dictionary<int, double>(),
                AverageFFvalues = new Dictionary<int, double>(),
                WorstFfValues = new Dictionary<int, double>(),
                DesiredDuration = 0,
                GaConfigs = new GAConfigs()
                {
                    GAIterationsNumber = 100,
                    CrossoverProbability = 60,
                    MutationProbability = 5,
                    ElitismPercentage = 30,
                    PopulationSize = 50,
                    MutationPeriod = 0
                }
            };
            _logger.Trace("New task page request by: " + currentUser.Email);
            return View(task);
        }
        public ActionResult NewTask(GaTask task)
        {
            if (ModelState.IsValid)
            {
                User currentUser = null;
                var obj = ViewData["CustomUser"];
                if (obj != null)
                {
                    currentUser = obj as User;
                }

                if (currentUser == null)
                {
                    MessageOnPage msg = new MessageOnPage("Error with user identification");
                    return RedirectToAction("MessagePage", "Home", msg);
                }

                var loList = _dbContext.LOs.Find(x => true).ToListAsync().Result;

                task.SourceLearningObjects = new LearningObject[loList.Count];
                for (int i = 0; i < loList.Count; i++)
                {
                    task.SourceLearningObjects[i] = loList[i];
                }

                task.CreatigTime = DateTime.Now;
                task.AuthorEmail = currentUser.Email;
                TaskManagerClient client = new TaskManagerClient();
                client.TaskRunAsync(task);
                _logger.Trace("Course creating task launching.");
                return RedirectToAction("UserTasks", "Home");
            }
            else
            {
                _logger.Trace("Course creating task launching. Attempt to launch. User is unregistered");
                return View(task);
            }
        }
        public ActionResult ManualCourseCreating()
        {
            User currentUser = null;
            var obj = ViewData["CustomUser"];
            if (obj != null)
            {
                currentUser = obj as User;
            }

            if (currentUser == null)
            {
                _logger.Trace("unregistered user started to create course manually.");
                MessageOnPage msg = new MessageOnPage("Error with user identification");
                return RedirectToAction("MessagePage", "Home", msg);
            }

            _logger.Trace("User " + currentUser.Email + " started to create course manually.");
            Course course = new Course(authorEmail: currentUser.Email);
            return View(course);
        }
        public ActionResult DeleteLoFromCourse(string courseId, string loId)
        {
            if (courseId == null || loId == null)
            {
                return RedirectToAction("MessagePage", "Home", "ID is null");
            }

            //var course = db.GetCourseByID(courseId);
            var coursesList = _dbContext.Courses.Find(x => x.Id == ObjectId.Parse(courseId)).ToListAsync().Result;
            if (coursesList != null)
            {
                var course = coursesList.First();
                course.ListOfLosId.Remove(ObjectId.Parse(loId));
                //course.ListOfLo.RemoveAll(x => x.Id == ObjectId.Parse(loId));
                _dbContext.Courses.ReplaceOneAsync(x => x.Id == ObjectId.Parse(courseId), course);
                //db.EditCourse(course);
                return RedirectToAction("DetailsOfCourse", "Home", courseId);
            }
            else
            {
                MessageOnPage errorMessage = new MessageOnPage("Error", "No course in base with id: " + courseId);
                return RedirectToAction("MessagePage", "Home", errorMessage);
            }
        }
        public ActionResult ManualCourseCreating()
        {
            User currentUser = null;
            var obj = ViewData["CustomUser"];
            if (obj != null)
            {
                currentUser = obj as User;
            }

            if (currentUser == null)
            {
                MessageOnPage msg = new MessageOnPage("Error with user identification");
                return RedirectToAction("MessagePage", "Home", msg);
            }

            Course course = new Course(authorEmail: currentUser.Email);
            return View(course);
        }
 public ActionResult MessagePage(MessageOnPage msg)
 {
     return View(msg);
 }
 public ActionResult LoList()
 {
     var list =  _dbContext.LOs.Find(x => true).ToListAsync().Result;
     //var list = db.LearningObjects;
     if (list.Count == 0)
     {
         MessageOnPage emptyListMessage = new MessageOnPage("List of learning objects", "Learning objects list is empty");
         return RedirectToAction("MessagePage", "Home", emptyListMessage);
     }
     else
     {
         return View(list);
     }
 }
        public ActionResult EditLo(string id)
        {
            if (id == null)
            {
                return RedirectToAction("MessagePage", "Home", "LO ID is null");
            }

            var lolist = _dbContext.LOs.Find(x => x.Id == ObjectId.Parse(id)).ToListAsync().Result;
            var lo = lolist.First();
            //var lo = db.GetLOByID(id);
            if (lo != null)
            {
                return View(lo);
            }
            else
            {
                MessageOnPage errorMessage = new MessageOnPage("Error", "No LO in base with id: " + id);
                return RedirectToAction("MessagePage", "Home", errorMessage);
            }
        }
 public ActionResult EditCourse(string id)
 {
     if (id == null)
     {
         return RedirectToAction("MessagePage", "Home", "Course ID is null");
     }
     //var course = db.GetCourseByID(id);
     var course = _dbContext.Courses.Find(x => x.Id == ObjectId.Parse(id)).ToListAsync().Result;
     if (course != null)
     {
         return View(course.First());
     }
     else
     {
         MessageOnPage errorMessage = new MessageOnPage("Error", "No course in base with id: " + id);
         return RedirectToAction("MessagePage", "Home", errorMessage);
     }
 }
        public ActionResult EditCourse(string id)
        {
            if (id == null)
            {
                _logger.Trace("Course edit page. Error: id == null");
                return RedirectToAction("MessagePage", "Home", "Course ID is null");
            }

            var course = _dbContext.Courses.Find(x => x.Id == ObjectId.Parse(id)).SingleAsync().Result;
            if (course != null)
            {
                _logger.Trace("Course edit page.");
                return View(course);
            }
            else
            {
                _logger.Trace("Course edit page. Error: course == null");
                var errorMessage = new MessageOnPage("Error", "No course in base with id: " + id);
                return RedirectToAction("MessagePage", "Home", errorMessage);
            }
        }
 public ActionResult MessagePage(MessageOnPage msg)
 {
     _logger.Trace("Message page. Message:" + msg.MessageString);
     return View(msg);
 }
        public ActionResult EditLo(string id)
        {
            if (id == null)
            {
                _logger.Trace("LO editing page query. Error: id == null");
                return RedirectToAction("MessagePage", "Home", "LO ID is null");
            }

            var lo = _dbContext.LOs.Find(x => x.Id == ObjectId.Parse(id)).SingleAsync().Result;
            if (lo != null)
            {
                _logger.Trace("LO editing page query.");
                return View(lo);
            }
            else
            {
                _logger.Trace("LO editing page query. Error: Cant find LO with such ID");
                MessageOnPage errorMessage = new MessageOnPage("Error", "No LO in base with id: " + id);
                return RedirectToAction("MessagePage", "Home", errorMessage);
            }
        }
        public ActionResult DeleteKnowledge(string id)
        {
            if (id == null)
            {
                MessageOnPage msg = new MessageOnPage("Knowledge ID is null");
                return RedirectToAction("MessagePage", "Home", msg);
            }

            var filter = Builders<Knowledge>.Filter.Eq(s => s.Id, ObjectId.Parse(id));
            _dbContext.Ontology.DeleteOneAsync(filter);
            return RedirectToAction("Ontology", "Home");
        }