private static void SendStudentInvitations(SyncCourseMessage message, GcCourse gcCourse, bool userIsDpi,
                                            ClassroomService service)
 {
     foreach (var gcCourseUser in gcCourse.GcCourseUsers.Where(u => u.IsTeacher == false))
     {
         if (userIsDpi && !gcCourseUser.EmailAddress.Contains("@test.dpi.wi.gov"))
         {
             gcCourse.GcMessage = $"{gcCourseUser.EmailAddress} is outside test.dpi.wi.gov, {gcCourse.GcMessage}";
         }
         else
         {
             Invitation i = new Invitation
             {
                 CourseId = gcCourse.AliasId,
                 UserId   = gcCourseUser.EmailAddress,
                 Role     = "STUDENT"
             };
             try
             {
                 var x = service.Invitations.Create(i).Execute();
                 gcCourse.GcMessage = $"{gcCourseUser.EmailAddress} invited {DateTime.Now}, {gcCourse.GcMessage}";
                 message.Logs.Add(new GcLog {
                     GcId = gcCourse.AliasId.IdToName(), Message = gcCourse.GcMessage
                 });
                 gcCourseUser.UserId = x.UserId;
             }
             catch (GoogleApiException ex)
             {
                 message.Logs.Add(new GcLog
                 {
                     GcId    = gcCourse.AliasId.IdToName(),
                     Error   = true,
                     Message = $"{gcCourseUser.EmailAddress} - {ex.Message}"
                 });
                 if (ex.HttpStatusCode == HttpStatusCode.Conflict)
                 {
                     gcCourse.GcMessage =
                         $"Invitation for '{gcCourseUser.EmailAddress}' already exists, {gcCourse.GcMessage}";
                 }
                 else
                 {
                     gcCourse.GcMessage = $"{ex.Message}, {gcCourse.GcMessage}";
                 }
             }
         }
     }
 }
        private static void SendTeacherInvitations(SyncCourseMessage message, ClassroomService service, GcCourse gcCourse,
                                                   bool userIsDpi)
        {
            var teachers = service.Courses.Teachers.List(gcCourse.AliasId).Execute();

            foreach (var gcCourseUser in gcCourse.GcCourseUsers.Where(u => u.IsTeacher == true))
            {
                if (userIsDpi && !gcCourseUser.EmailAddress.Contains("@test.dpi.wi.gov"))
                {
                    gcCourse.GcMessage = $"{gcCourseUser.EmailAddress} is outside test.dpi.wi.gov, {gcCourse.GcMessage}";
                }
                else
                {
                    if (gcCourseUser.UserId == null || teachers.Teachers.All(t => t.UserId != gcCourseUser.UserId))
                    {
                        Invitation i = new Invitation
                        {
                            CourseId = gcCourse.AliasId,
                            UserId   = gcCourseUser.EmailAddress,
                            Role     = "TEACHER"
                        };

                        try
                        {
                            var x = service.Invitations.Create(i).Execute();
                            gcCourse.GcMessage =
                                $"{gcCourseUser.EmailAddress} invited {DateTime.Now}, {gcCourse.GcMessage}";
                            message.Logs.Add(new GcLog
                            {
                                GcId = gcCourse.AliasId.IdToName(), Message = gcCourse.GcMessage
                            });
                            gcCourseUser.UserId = x.UserId;
                        }
                        catch (GoogleApiException ex)
                        {
                            message.Logs.Add(new GcLog
                            {
                                GcId    = gcCourse.AliasId.IdToName(),
                                Error   = true,
                                Message = $"{gcCourseUser.EmailAddress} - {ex.Message}"
                            });
                            //doing a get when course does not exists throws an exception, so does adding a course with the same id
                            if (ex.HttpStatusCode == HttpStatusCode.Conflict)
                            {
                                gcCourse.GcMessage =
                                    $"Invitation for '{gcCourseUser.EmailAddress}' already exists, {gcCourse.GcMessage}";
                            }
                            else
                            {
                                gcCourse.GcMessage = $"{ex.Message}, {gcCourse.GcMessage}";
                            }
                        }
                    }
                }
            }
        }
        private static Course SendCourse(SyncCourseMessage message, Course c, ClassroomService service, GcCourse gcCourse,
                                         string schoolName)
        {
            try
            {
                c = service.Courses.Get(gcCourse.AliasId).Execute();
                gcCourse.CourseId = c.Id;
                gcCourse.Owner    = c.OwnerId;
                gcCourse.Saved    = true;
                if (c.CourseState == "ACTIVE")
                {
                    gcCourse.Activated = true;
                }
                ;

                //if previously saved and then deleted directly in Google, clear the UserId so it can save again
                if (gcCourse.GcCourseUsers.Any(u => u.UserId != null))
                {
                    foreach (var gcCourseGcCourseUser in gcCourse.GcCourseUsers)
                    {
                        gcCourseGcCourseUser.UserId = null;
                    }
                }
            }
            catch (GoogleApiException ex)
            {
                //new course
                if (ex.HttpStatusCode == HttpStatusCode.NotFound)
                {
                    var gc = new Course
                    {
                        Id      = gcCourse.AliasId,
                        Name    = gcCourse.LocalCourseTitle,
                        Section =
                            $"{gcCourse.SectionIdentifier} - {gcCourse.SchoolYear} {gcCourse.SessionName} at {schoolName}",
                        OwnerId = gcCourse.Owner
                    };
                    try
                    {
                        c = service.Courses.Create(gc).Execute();
                        gcCourse.GcMessage = $"Saved {DateTime.Now}";
                        gcCourse.Saved     = true;
                        gcCourse.CourseId  = c.Id;
                        gcCourse.Owner     = c.OwnerId;
                        gcCourse.Activated = false;
                        message.Logs.Add(new GcLog {
                            GcId = gcCourse.AliasId.IdToName(), Message = gcCourse.GcMessage
                        });
                    }
                    catch (GoogleApiException ex2)
                    {
                        message.Logs.Add(new GcLog {
                            GcId = gcCourse.AliasId.IdToName(), Error = true, Message = ex2.Message
                        });
                        gcCourse.Saved     = false;
                        gcCourse.GcMessage = ex2.Message;
                    }
                }
                else
                {
                    gcCourse.Saved     = false;
                    gcCourse.GcMessage = ex.Message;
                }
            }

            return(c);
        }