public async Task <IHttpActionResult> StopTrial(int id)
        {
            var entity = await db.Courses
                         .Include(x => x.CourseApprovalLog)
                         .FirstOrDefaultAsync(x => x.Id == id);

            if (entity == null)
            {
                return(BadRequest());
            }

            if (entity.Status != CourseStatus.Trial)
            {
                return(BadRequest("Cannot stop. Course is not in Trial mode."));
            }

            entity.Status = CourseStatus.Draft;

            // insert into course event
            var courseEvent = await db.CourseEvents.Where(x => x.CourseId == entity.Id &&
                                                          x.Status == CourseEventStatus.Trial).OrderByDescending(x => x.CreatedDate).FirstOrDefaultAsync();

            if (courseEvent != null)
            {
                courseEvent.End         = DateTime.Now;
                courseEvent.TrialRemark = "Trial ended";
                courseEvent.Status      = CourseEventStatus.TrialEnded;

                db.SetModified(entity);
                db.SetModified(courseEvent);

                await db.SaveChangesAsync();

                entity.CourseApprovalLog.Add(new CourseApprovalLog
                {
                    CreatedByName = entity.CreatedByName,
                    ActionDate    = DateTime.Now,
                    Remark        = "Course " + entity.Title + " stop Trial.",
                });

                await db.SaveChangesAsync();

                ChangeCourseStatusModel data = new ChangeCourseStatusModel
                {
                    CourseId   = entity.Id,
                    CourseName = entity.Title,
                    Message    = "Trial stop for course " + entity.Title,
                };

                return(Ok(data));
            }
            else
            {
                return(BadRequest("No event to stop."));
            }
        }
        public async Task <IHttpActionResult> StartTrial(int id, int createdBy)
        {
            var entity = await db.Courses
                         .Include(x => x.CourseApprovalLog)
                         .FirstOrDefaultAsync(x => x.Id == id);

            if (entity == null)
            {
                return(BadRequest());
            }

            if (entity.Status == CourseStatus.Trial)
            {
                return(BadRequest("The course is already in trial mode."));
            }

            try
            {
                if (entity.Status == CourseStatus.Draft)
                {
                    entity.Status = CourseStatus.Trial;
                    db.SetModified(entity);

                    var newEvent = new CourseEvent
                    {
                        Name           = "Trial Event",
                        CourseId       = entity.Id,
                        Status         = CourseEventStatus.Trial,
                        Start          = DateTime.Now,
                        EnrollmentCode = $"TRIAL({entity.Code}-{DateTime.Now.Ticks})",
                        ViewCategory   = ViewCategory.Private,
                        CreatedBy      = createdBy,
                        IsTrial        = true
                    };

                    db.CourseEvents.Add(newEvent);

                    await db.SaveChangesAsync();

                    if (entity.CourseApprovalLog == null)
                    {
                        entity.CourseApprovalLog = new List <CourseApprovalLog>();
                    }

                    entity.CourseApprovalLog.Add(new CourseApprovalLog
                    {
                        CreatedByName  = entity.CreatedByName,
                        ActionDate     = DateTime.Now,
                        Remark         = "Course " + entity.Title + " goes for Trial.",
                        ApprovalStatus = ApprovalStatus.None
                    });

                    await db.SaveChangesAsync();

                    ChangeCourseStatusModel data = new ChangeCourseStatusModel
                    {
                        CourseId      = entity.Id,
                        CourseName    = entity.Title,
                        CourseEventId = newEvent.Id,
                        Message       = "New course event created"
                    };

                    return(Ok(data));
                }
                else
                {
                    return(BadRequest("Cannot go to Trial if status is not in Draft"));
                }
            }
            catch (Exception e)
            {
                return(BadRequest(e.Message + " " + e.InnerException.Message));
            }
        }
        public async Task <IHttpActionResult> Publish(int id, int createdBy)
        {
            var entity = await db.Courses.FindAsync(id);

            if (entity == null)
            {
                return(BadRequest());
            }

            CourseEvent courseEvent = new CourseEvent();

            // check whether a public event has been created
            var publicEvent = await db.CourseEvents.FirstOrDefaultAsync(x => x.CourseId == id && x.ViewCategory == ViewCategory.Public);

            if (publicEvent == null)
            {
                var newEvent = new CourseEvent
                {
                    Name     = "Public Course",
                    CourseId = id,
                    AllowablePercentageBeforeWithdraw = entity.DefaultAllowablePercentageBeforeWithdraw,
                    CreatedBy      = createdBy,
                    EnrollmentCode = $"PUBLIC ({entity.Id})",
                    ViewCategory   = ViewCategory.Public,
                    Status         = entity.ViewCategory == ViewCategory.Public ? CourseEventStatus.AvailableToPublic : CourseEventStatus.AvailableToPrivate,
                    Start          = DateTime.Now,
                    IsDisplayed    = entity.ViewCategory == ViewCategory.Public ? true : false
                };

                db.CourseEvents.Add(newEvent);

                await db.SaveChangesAsync();
            }

            //sum total content - added by wawar

            var totalContent = db.CourseContents.Where(x => x.CourseId == id);

            entity.TotalContents = totalContent.Count();

            var totalModule = db.CourseModules.Where(x => x.CourseId == id);

            entity.TotalModules = totalContent.Count();

            //end sum

            entity.Status = CourseStatus.Published;

            if (entity.CourseApprovalLog == null)
            {
                entity.CourseApprovalLog = new List <CourseApprovalLog>();
            }

            var createdByName = "";
            var user          = await db.User.FindAsync(createdBy);

            if (user != null)
            {
                createdByName = user.Name;
            }

            entity.CourseApprovalLog.Add(new CourseApprovalLog
            {
                CreatedByName  = createdByName,
                ActionDate     = DateTime.Now,
                Remark         = "Course " + entity.Title + " is published.",
                ApprovalStatus = ApprovalStatus.None
            });

            await db.SaveChangesAsync();

            ChangeCourseStatusModel data = new ChangeCourseStatusModel
            {
                CourseId   = entity.Id,
                CourseName = entity.Title,
                Message    = "Published"
            };

            return(Ok(data));
        }