public ClassInfoOutput Remove([FromBody] ClassInfoInput input)
        {
            ClassInfoOutput output  = new ClassInfoOutput();
            AspUserService  aspUser = new AspUserService(_db, this);

            if (input == null)
            {
                Response.StatusCode = 400;
                output.Result       = "INPUT_IS_NULL";
            }
            else
            {
                if (aspUser.IsAdmin)
                {
                    Class selectedClass = _db.Classes.Where(e => e.Id.Equals(input.ClassId)).FirstOrDefault();
                    selectedClass.Deleted = true;
                    output.Result         = "OK";
                    _db.SaveChanges();
                }
                else
                {
                    Response.StatusCode = 400;
                    output.Result       = "NO_PRIVILEGE";
                }
            }

            return(output);
        }
        public ClassInfoOutput CheckClassById([FromBody] ClassInfoInput input)
        {
            ClassInfoOutput output  = new ClassInfoOutput();
            AspUserService  aspUser = new AspUserService(_db, this);

            if (input == null)
            {
                Response.StatusCode = 400;
                output.Result       = "INPUT_IS_NULL";
            }
            else
            {
                if (aspUser.IsAdmin)
                {
                    Class selectedClass = _db.Classes.Where(e => e.Id.Equals(input.ClassId)).FirstOrDefault();
                    if (selectedClass == null)
                    {
                        Response.StatusCode = 400;
                        output.Result       = "CLASS_NOT_EXIST";
                    }
                    else
                    {
                        output.ClassName = selectedClass.Name;
                        output.Result    = "OK";
                    }
                }
                else
                {
                    Response.StatusCode = 400;
                    output.Result       = "NO_PRIVILEGE";
                }
            }

            return(output);
        }
        public ClassInfoOutput Change([FromBody] ClassInfoInput input)
        {
            ClassInfoOutput output = new ClassInfoOutput();

            if (input == null)
            {
                Response.StatusCode = 400;
                output.Result       = "INPUT_IS_NULL";
            }
            else
            {
                AspUserService aspUser = new AspUserService(_db, this);
                if (aspUser.IsAdmin)
                {
                    Class thisClass = _db.Classes.Where(e => e.Id.Equals(input.ClassId) && e.Deleted == false).FirstOrDefault();
                    if (thisClass == null)
                    {
                        Response.StatusCode = 400;
                        output.Result       = "CLASS_NOT_EXIST";
                    }
                    else
                    {
                        BCPUser lecturer = _db._BCPUsers.Where(e => e.Id.Equals(input.LecturerId) && e.Deleted == false).Where(e => e.Status == 2 || e.Status == 4).FirstOrDefault();
                        if (lecturer == null && !string.IsNullOrEmpty(input.LecturerId))
                        {
                            Response.StatusCode = 400;
                            output.Result       = "LECTURER_NOT_EXIST";
                        }
                        else
                        {
                            thisClass.Capacity = input.Capacity;
                            thisClass.Name     = input.ClassName;
                            if (string.IsNullOrEmpty(input.LecturerId))
                            {
                                thisClass.Lecturer = null;
                            }
                            else
                            {
                                thisClass.Lecturer = lecturer;
                            }

                            _db.SaveChanges();
                            output.Result = "OK";
                        }
                    }
                }
                else
                {
                    Response.StatusCode = 400;
                    output.Result       = "NO_PRIVILEGE";
                }
            }

            return(output);
        }
        public ClassInfoOutput AddPhoto([FromBody] ClassInfoInput input)
        {
            ClassInfoOutput output = new ClassInfoOutput();

            if (input == null)
            {
                Response.StatusCode = 400;
                output.Result       = "INPUT_IS_NULL";
            }
            else
            {
                AspUserService aspUser    = new AspUserService(_db, this);
                Recognizer     recognizer = _db.Recognizers.Where(e => e.Id.Equals(input.RecognizerId) && e.Deleted == false).FirstOrDefault();
                if (recognizer == null)
                {
                    Response.StatusCode = 400;
                    output.Result       = "RECOGNIZER_NOT_EXIST";
                }
                else
                {
                    if (recognizer.Key.Equals(input.RecognizerKey))
                    {
                        Class thisClass = _db.Classes.Where(e => e.Id.Equals(input.ClassId) && e.Deleted == false).FirstOrDefault();
                        if (thisClass == null)
                        {
                            Response.StatusCode = 400;
                            output.Result       = "CLASS_NOT_EXIST";
                        }
                        else
                        {
                            GroupImage gi = new GroupImage
                            {
                                Url       = input.ImageUrl,
                                Class     = thisClass,
                                CreatedBy = recognizer.Id,
                                Status    = 1
                            };

                            _db.GroupImages.Add(gi);
                            _db.SaveChanges();
                            output.Result = "OK";
                        }
                    }
                    else
                    {
                        Response.StatusCode = 400;
                        output.Result       = "CREDENTIAL_ERROR";
                    }
                }
            }

            return(output);
        }
        public ClassInfoOutput Create([FromBody] ClassInfoInput input)
        {
            ClassInfoOutput output  = new ClassInfoOutput();
            AspUserService  aspUser = new AspUserService(_db, this);

            if (aspUser.IsAdmin)
            {
                if (input == null)
                {
                    Response.StatusCode = 400;
                    output.Result       = "INPUT_IS_NULL";
                }
                else
                {
                    if (string.IsNullOrEmpty(input.ClassName) || string.IsNullOrEmpty(input.ClassCode))
                    {
                        Response.StatusCode = 400;
                        output.Result       = "INPUT_IS_NULL";
                    }
                    else
                    {
                        Class thisClass = _db.Classes.Where(e => e.ClassCode.ToUpper().Equals(input.ClassCode.ToUpper()) && e.Deleted == false).FirstOrDefault();

                        if (thisClass == null)
                        {
                            Class newClass = new Class()
                            {
                                Name      = input.ClassName,
                                ClassCode = input.ClassCode.ToUpper(),
                                CreatedBy = aspUser.User.Id
                            };

                            output.Result = "OK";

                            _db.Classes.Add(newClass);
                            _db.SaveChanges();
                        }
                        else
                        {
                            Response.StatusCode = 400;
                            output.Result       = "CLASS_EXIST";
                        }
                    }
                }
            }
            else
            {
                Response.StatusCode = 400;
                output.Result       = "NO_PRIVILEGE";
            }

            return(output);
        }
        public ClassInfoOutput RemoveStudent([FromBody] ClassInfoInput input)
        {
            ClassInfoOutput output = new ClassInfoOutput();

            if (input == null)
            {
                Response.StatusCode = 400;
                output.Result       = "INPUT_IS_NULL";
            }
            else
            {
                AspUserService aspUser = new AspUserService(_db, this);
                if (aspUser.IsAdmin)
                {
                    Class thisClass = _db.Classes.Where(e => e.Id.Equals(input.ClassId) && e.Deleted == false).FirstOrDefault();
                    if (thisClass == null)
                    {
                        Response.StatusCode = 400;
                        output.Result       = "CLASS_NOT_EXIST";
                    }
                    else
                    {
                        List <ClassAllocation> classAllocationList = thisClass.List_ClassAllocation.Where(e => e.Student.Id.Equals(input.StudentId) && e.Deleted == false).ToList();
                        if (classAllocationList.Count() > 0)
                        {
                            foreach (ClassAllocation item in classAllocationList)
                            {
                                item.Deleted = true;
                            }

                            _db.SaveChanges();
                            output.Result = "OK";
                        }
                        else
                        {
                            Response.StatusCode = 400;
                            output.Result       = "STUDENT_NOT_IN_CLASS";
                        }
                    }
                }
                else
                {
                    Response.StatusCode = 400;
                    output.Result       = "NO_PRIVILEGE";
                }
            }

            return(output);
        }
        public async Task <ClassInfoOutput> ProcessPhoto([FromBody] ClassInfoInput input)
        {
            ClassInfoOutput output = new ClassInfoOutput();

            AspUserService aspUser = new AspUserService(_db, this);

            if (input == null)
            {
                Response.StatusCode = 400;
                output.Result       = "INPUT_IS_NULL";
            }
            else
            {
                if (aspUser.IsLecturer)
                {
                    Class thisClass = aspUser.User.List_Classes.Where(e => e.Id.Equals(input.ClassId) && e.Deleted == false).FirstOrDefault();
                    if (thisClass == null)
                    {
                        Response.StatusCode = 400;
                        output.Result       = "CLASS_NOT_EXIST";
                    }
                    else
                    {
                        string            siteUrl   = _db.SiteConfigs.Where(e => e.Key.Equals("SITEURL")).FirstOrDefault().Value;
                        List <string>     faceIds   = new List <string>();
                        List <string>     personIds = new List <string>();
                        List <GroupImage> images    = thisClass.List_GroupImages.Where(e => e.Status == 1 && e.Deleted == false).ToList();

                        foreach (GroupImage item in images)
                        {
                            string            personGroupId = _db.SiteConfigs.Where(e => e.Key.Equals("PERSONGROUP")).FirstOrDefault().Value;
                            Uri               uri           = new Uri("https://bcp-facial.cognitiveservices.azure.com/face/v1.0/detect?recognitionModel=recognition_02");
                            HttpClientHandler handler       = new HttpClientHandler();
                            StringContent     queryString   = null;
                            HttpClient        client        = new HttpClient(handler);
                            //string respond = null;
                            ClassDetectImage detectImg = new ClassDetectImage()
                            {
                                Url = siteUrl + "/" + item.Url
                            };
                            queryString = new StringContent(JsonConvert.SerializeObject(detectImg), Encoding.UTF8, "application/json");
                            client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "8d4c42ecbb784d909275492115ea56f0");
                            HttpResponseMessage response = await client.PostAsync(uri, queryString);

                            string respond = await response.Content.ReadAsStringAsync();

                            dynamic jsonObj = JsonConvert.DeserializeObject(respond);
                            foreach (var obj in jsonObj)
                            {
                                try
                                {
                                    faceIds.Add((string)obj.faceId);
                                } catch (RuntimeBinderException e)
                                {
                                    e.ToString();
                                }
                            }
                        }

                        bool completeCycle = false;
                        int  multiple      = 0;
                        while (!completeCycle)
                        {
                            List <string> tmpFaceIds = new List <string>();
                            for (int i = 0 + 10 * multiple; i < 10 + 10 * multiple; i++)
                            {
                                if (i > faceIds.Count() - 1)
                                {
                                    completeCycle = true;
                                }
                                else
                                {
                                    tmpFaceIds.Add(faceIds.ElementAt(i));
                                }
                            }
                            string            personGroupId = _db.SiteConfigs.Where(e => e.Key.Equals("PERSONGROUP")).FirstOrDefault().Value;
                            Uri               uri           = new Uri("https://bcp-facial.cognitiveservices.azure.com/face/v1.0/identify");
                            HttpClientHandler handler       = new HttpClientHandler();
                            StringContent     queryString   = null;
                            HttpClient        client        = new HttpClient(handler);
                            //string respond = null;

                            ClassIdentifyImage identifyImg = new ClassIdentifyImage()
                            {
                                ConfidenceThreshold        = "0.5",
                                MaxNumOfCandidatesReturned = "1",
                                PersonGroupId = personGroupId,
                                FaceIds       = tmpFaceIds
                            };
                            queryString = new StringContent(JsonConvert.SerializeObject(identifyImg), Encoding.UTF8, "application/json");
                            client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "8d4c42ecbb784d909275492115ea56f0");
                            HttpResponseMessage response = await client.PostAsync(uri, queryString);

                            string respond = await response.Content.ReadAsStringAsync();

                            dynamic jsonObj = JsonConvert.DeserializeObject(respond);
                            foreach (var obj in jsonObj)
                            {
                                try
                                {
                                    foreach (var tmpObj in obj.candidates)
                                    {
                                        personIds.Add((string)tmpObj.personId);
                                    }
                                } catch (RuntimeBinderException e)
                                {
                                    e.ToString();
                                }
                            }
                            multiple++;
                        }

                        Attendance newAttendance = new Attendance()
                        {
                            Class = thisClass
                        };

                        _db.Attendances.Add(newAttendance);
                        foreach (ClassAllocation item in thisClass.List_ClassAllocation.Where(e => e.Deleted == false))
                        {
                            if (personIds.Contains(item.Student.PersonId))
                            {
                                AttendanceItem newAttendanceItem = new AttendanceItem()
                                {
                                    Student    = item.Student,
                                    Attendance = newAttendance
                                };

                                _db.AttendanceItems.Add(newAttendanceItem);
                            }
                        }

                        _db.SaveChanges();
                    }
                }
                else
                {
                    Response.StatusCode = 400;
                    output.Result       = "NO_PRIVILEGE";
                }
            }

            return(output);
        }