public List<RequestsWtihLinkedData> GetAdHocBookings()
        {
            IEnumerable<round> adHocRounds = (new SemRouController()).GetAdHocRoundSet();
            List<int> adHocRoundsID = new List<int>();

            foreach (round rnd in adHocRounds)
            {
                adHocRoundsID.Add(rnd.id);
            }

            IEnumerable<request> requests =
                from req in _db.requests.Include("roomsAlloc").Include("roomsPref").Include("facilities").Include("module")
                where (req.status == 1 || req.status == 2)
                        &&
                        req.module.active == true
                        &&
                        adHocRoundsID.Contains(req.roundID)
                select req;

            List<RequestsWtihLinkedData> rwldList = new List<RequestsWtihLinkedData>();

            foreach (request req in requests)
            {
                RequestsWtihLinkedData rwld = new RequestsWtihLinkedData(req);

                rwldList.Add(rwld);
            }

            return rwldList;
        }
        public List <RequestsWtihLinkedData> GetBookings()
        {
            IEnumerable <round> liveRounds   = (new SemRouController()).GetLiveRoundSet();
            List <int>          liveRoundsID = new List <int>();

            foreach (round rnd in liveRounds)
            {
                liveRoundsID.Add(rnd.id);
            }

            IEnumerable <request> requests =
                from req in _db.requests.Include("roomsAlloc").Include("roomsPref").Include("facilities").Include("module")
                where (req.status == 1 || req.status == 2)
                &&
                req.module.active == true
                &&
                liveRoundsID.Contains(req.roundID)
                select req;

            List <RequestsWtihLinkedData> rwldList = new List <RequestsWtihLinkedData>();

            foreach (request req in requests)
            {
                RequestsWtihLinkedData rwld = new RequestsWtihLinkedData(req);

                rwldList.Add(rwld);
            }

            return(rwldList);
        }
        public HttpResponseMessage PostUpdateRequest(RequestsWtihLinkedData rwld)
        {
            if (ModelState.IsValid)
            {
                request currentReq =
                    (from req in _db.requests.Include("facilities").Include("roomsPref").Include("roomsAlloc")
                     where req.id == rwld.id
                     select req).FirstOrDefault();

                currentReq.facilities.Clear();

                currentReq.roomsPref.Clear();

                _db.SaveChanges();

                var updateReq = UpdateRequestObject(rwld, currentReq);

                _db.Entry(currentReq).CurrentValues.SetValues(updateReq);

                _db.SaveChanges();

                HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, updateReq);
                response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = updateReq.id }));
                return(response);
            }
            else
            {
                return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState));
            }
        }
        public List <RequestsWtihLinkedData> GetRequests()
        {
            round liveRound = (new SemRouController()).GetLiveRound();

            IEnumerable <request> requests =
                from req in _db.requests.Include("roomsAlloc").Include("roomsPref").Include("facilities").Include("module")
                where (req.status == null || req.status == 0)
                &&
                req.module.department.code == nsd.code
                &&
                req.module.active == true
                &&
                req.roundID == liveRound.id
                select req;

            List <RequestsWtihLinkedData> rwldList = new List <RequestsWtihLinkedData>();

            foreach (request req in requests)
            {
                RequestsWtihLinkedData rwld = new RequestsWtihLinkedData(req);

                rwldList.Add(rwld);
            }

            return(rwldList);
        }
        public HttpResponseMessage PostNewAdHocRequest(RequestsWtihLinkedData rwld)
        {
            if (ModelState.IsValid)
            {
                var newReq = SetupNewRequestObject(rwld, false);

                _db.requests.Add(newReq);

                _db.SaveChanges();

                HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, newReq);
                response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = newReq.id }));
                return(response);
            }
            else
            {
                return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState));
            }
        }
        public List <RequestsWtihLinkedData> GetHistory()
        {
            SemRouController srAPI = new SemRouController();

            IEnumerable <round> liveRounds   = srAPI.GetLiveRoundSet();
            List <int>          liveRoundsID = new List <int>();

            IEnumerable <round> adhocRounds   = srAPI.GetAdHocRoundSet();
            List <int>          adhocRoundsID = new List <int>();

            foreach (round rnd in liveRounds)
            {
                liveRoundsID.Add(rnd.id);
            }

            foreach (round rnd in adhocRounds)
            {
                adhocRoundsID.Add(rnd.id);
            }

            IEnumerable <request> requests =
                from req in _db.requests.Include("roomsAlloc").Include("roomsPref").Include("facilities").Include("module")
                where (req.status == 1 || req.status == 2)
                &&
                req.module.department.code == nsd.code
                &&
                !liveRoundsID.Contains(req.roundID)
                &&
                !adhocRoundsID.Contains(req.roundID)
                select req;

            List <RequestsWtihLinkedData> rwldList = new List <RequestsWtihLinkedData>();

            foreach (request req in requests)
            {
                RequestsWtihLinkedData rwld = new RequestsWtihLinkedData(req);

                rwldList.Add(rwld);
            }

            return(rwldList);
        }
        public HttpResponseMessage DeleteRequest(RequestsWtihLinkedData rwld)
        {
            if (ModelState.IsValid)
            {

                request deleteReq =
                    (from req in _db.requests
                     where req.id == rwld.id
                     select req).FirstOrDefault();

                _db.requests.Remove(deleteReq);

                _db.SaveChanges();

                HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, deleteReq);
                response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = deleteReq.id }));
                return response;

            }
            else return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
        }
        public HttpResponseMessage DeleteRequest(RequestsWtihLinkedData rwld)
        {
            if (ModelState.IsValid)
            {
                request deleteReq =
                    (from req in _db.requests
                     where req.id == rwld.id
                     select req).FirstOrDefault();

                _db.requests.Remove(deleteReq);

                _db.SaveChanges();

                HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, deleteReq);
                response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = deleteReq.id }));
                return(response);
            }
            else
            {
                return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState));
            }
        }
        private request UpdateRequestObject(RequestsWtihLinkedData rwld, request currentReq)
        {
            module selectedModule =
                (from mod in _db.modules
                 where mod.code == rwld.moduleCode
                 select mod).FirstOrDefault();

            currentReq.moduleCode = selectedModule.code;
            currentReq.module = selectedModule;

            currentReq.priority = rwld.priority;
            currentReq.day = rwld.day;
            currentReq.startPeriod = rwld.startPeriod;
            currentReq.endPeriod = rwld.endPeriod;
            currentReq.weeks = rwld.weeks;
            currentReq.numberOfStudents = rwld.numberOfStudents;
            currentReq.parkPreference = rwld.parkPreference;
            currentReq.sessionType = rwld.sessionType;
            currentReq.numberOfRooms = rwld.numberOfRooms;
            currentReq.otherRequirements = rwld.otherRequirements;
            currentReq.status = rwld.status;
            currentReq.traditional = rwld.traditional;

            foreach (var facData in rwld.facilities)
            {

                facility selectedFacility =
                    (from fac in _db.facilities
                     where fac.id == facData.id
                     select fac).FirstOrDefault();

                currentReq.facilities.Add(selectedFacility);

            }

            foreach (var roomData in rwld.roomPref)
            {

                room selectedRoom =
                    (from rm in _db.rooms
                     where rm.code == roomData.code
                     select rm).FirstOrDefault();

                currentReq.roomsPref.Add(selectedRoom);

            }

            IEnumerable<round> adHocRounds = (new SemRouController()).GetAdHocRoundSet();

            List<int> adHocRoundIDs = new List<int>();

            foreach (round rnd in adHocRounds) adHocRoundIDs.Add(rnd.id);

            if (adHocRoundIDs.IndexOf(currentReq.roundID) != -1)
            {
                currentReq.roomsAlloc.Clear();

                foreach (var roomData in rwld.roomPref)
                {

                    room selectedRoom =
                        (from rm in _db.rooms
                         where rm.code == roomData.code
                         select rm).FirstOrDefault();

                    currentReq.roomsAlloc.Add(selectedRoom);

                }
            }

            return currentReq;
        }
        private request SetupNewRequestObject(RequestsWtihLinkedData rwld, bool current)
        {
            request newRequest = new request();

            module selectedModule =
                (from mod in _db.modules
                 where mod.code == rwld.moduleCode
                 select mod).FirstOrDefault();

            newRequest.moduleCode = selectedModule.code;
            newRequest.module = selectedModule;

            SemRouController srAPI = new SemRouController();

            round selectedRound;
            if (current) {

                selectedRound = srAPI.GetLiveRound();

                newRequest.status = rwld.status;

            }
            else
            {

                selectedRound = srAPI.GetAdHocRound();

                newRequest.status = 1;

            }

            newRequest.roundID = selectedRound.id;

            newRequest.priority = rwld.priority;
            newRequest.day = rwld.day;
            newRequest.startPeriod = rwld.startPeriod;
            newRequest.endPeriod = rwld.endPeriod;
            newRequest.weeks = rwld.weeks;
            newRequest.numberOfStudents = rwld.numberOfStudents;
            newRequest.parkPreference = rwld.parkPreference;
            newRequest.sessionType = rwld.sessionType;
            newRequest.numberOfRooms = rwld.numberOfRooms;
            newRequest.otherRequirements = rwld.otherRequirements;
            newRequest.traditional = rwld.traditional;

            foreach (var facData in rwld.facilities)
            {

                facility selectedFacility =
                    (from fac in _db.facilities
                     where fac.id == facData.id
                     select fac).FirstOrDefault();

                newRequest.facilities.Add(selectedFacility);

            }

            foreach (var roomData in rwld.roomPref)
            {

                room selectedRoom =
                    (from rm in _db.rooms
                     where rm.code == roomData.code
                     select rm).FirstOrDefault();

                newRequest.roomsPref.Add(selectedRoom);

            }

            if (!current)
            {

                foreach (var roomData in rwld.roomPref)
                {

                    room selectedRoom =
                        (from rm in _db.rooms
                         where rm.code == roomData.code
                         select rm).FirstOrDefault();

                    newRequest.roomsAlloc.Add(selectedRoom);

                }

            }

            return newRequest;
        }
        public HttpResponseMessage PostUpdateRequest(RequestsWtihLinkedData rwld)
        {
            if (ModelState.IsValid)
            {
                request currentReq =
                    (from req in _db.requests.Include("facilities").Include("roomsPref").Include("roomsAlloc")
                     where req.id == rwld.id
                     select req).FirstOrDefault();

                currentReq.facilities.Clear();

                currentReq.roomsPref.Clear();

                _db.SaveChanges();

                var updateReq = UpdateRequestObject(rwld, currentReq);

                _db.Entry(currentReq).CurrentValues.SetValues(updateReq);

                _db.SaveChanges();

                HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, updateReq);
                response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = updateReq.id }));
                return response;

            }
            else return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
        }
        public HttpResponseMessage PostNewRequest(RequestsWtihLinkedData rwld)
        {
            if (ModelState.IsValid)
            {

                var newReq = SetupNewRequestObject(rwld, true);

                _db.requests.Add(newReq);

                _db.SaveChanges();

                HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, newReq);
                response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = newReq.id }));
                return response;

            }
            else return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
        }
        public List<RequestsWtihLinkedData> GetRequests()
        {
            round liveRound = (new SemRouController()).GetLiveRound();

            IEnumerable<request> requests =
                from req in _db.requests.Include("roomsAlloc").Include("roomsPref").Include("facilities").Include("module")
                where (req.status == null || req.status == 0)
                        &&
                        req.module.department.code == nsd.code
                        &&
                        req.module.active == true
                        &&
                        req.roundID == liveRound.id
                select req;

            List<RequestsWtihLinkedData> rwldList = new List<RequestsWtihLinkedData>();

            foreach (request req in requests)
            {
                RequestsWtihLinkedData rwld = new RequestsWtihLinkedData(req);

                rwldList.Add(rwld);
            }

            return rwldList;
        }
        public List<RequestsWtihLinkedData> GetHistory()
        {
            SemRouController srAPI = new SemRouController();

            IEnumerable<round> liveRounds = srAPI.GetLiveRoundSet();
            List<int> liveRoundsID = new List<int>();

            IEnumerable<round> adhocRounds = srAPI.GetAdHocRoundSet();
            List<int> adhocRoundsID = new List<int>();

            foreach (round rnd in liveRounds)
            {
                liveRoundsID.Add(rnd.id);
            }

            foreach (round rnd in adhocRounds)
            {
                adhocRoundsID.Add(rnd.id);
            }

            IEnumerable<request> requests =
                from req in _db.requests.Include("roomsAlloc").Include("roomsPref").Include("facilities").Include("module")
                where (req.status == 1 || req.status == 2)
                        &&
                        req.module.department.code == nsd.code
                        &&
                        !liveRoundsID.Contains(req.roundID)
                        &&
                        !adhocRoundsID.Contains(req.roundID)
                select req;

            List<RequestsWtihLinkedData> rwldList = new List<RequestsWtihLinkedData>();

            foreach (request req in requests)
            {
                RequestsWtihLinkedData rwld = new RequestsWtihLinkedData(req);

                rwldList.Add(rwld);
            }

            return rwldList;
        }
        private request UpdateRequestObject(RequestsWtihLinkedData rwld, request currentReq)
        {
            module selectedModule =
                (from mod in _db.modules
                 where mod.code == rwld.moduleCode
                 select mod).FirstOrDefault();

            currentReq.moduleCode = selectedModule.code;
            currentReq.module     = selectedModule;

            currentReq.priority          = rwld.priority;
            currentReq.day               = rwld.day;
            currentReq.startPeriod       = rwld.startPeriod;
            currentReq.endPeriod         = rwld.endPeriod;
            currentReq.weeks             = rwld.weeks;
            currentReq.numberOfStudents  = rwld.numberOfStudents;
            currentReq.parkPreference    = rwld.parkPreference;
            currentReq.sessionType       = rwld.sessionType;
            currentReq.numberOfRooms     = rwld.numberOfRooms;
            currentReq.otherRequirements = rwld.otherRequirements;
            currentReq.status            = rwld.status;
            currentReq.traditional       = rwld.traditional;


            foreach (var facData in rwld.facilities)
            {
                facility selectedFacility =
                    (from fac in _db.facilities
                     where fac.id == facData.id
                     select fac).FirstOrDefault();

                currentReq.facilities.Add(selectedFacility);
            }

            foreach (var roomData in rwld.roomPref)
            {
                room selectedRoom =
                    (from rm in _db.rooms
                     where rm.code == roomData.code
                     select rm).FirstOrDefault();

                currentReq.roomsPref.Add(selectedRoom);
            }



            IEnumerable <round> adHocRounds = (new SemRouController()).GetAdHocRoundSet();

            List <int> adHocRoundIDs = new List <int>();

            foreach (round rnd in adHocRounds)
            {
                adHocRoundIDs.Add(rnd.id);
            }

            if (adHocRoundIDs.IndexOf(currentReq.roundID) != -1)
            {
                currentReq.roomsAlloc.Clear();

                foreach (var roomData in rwld.roomPref)
                {
                    room selectedRoom =
                        (from rm in _db.rooms
                         where rm.code == roomData.code
                         select rm).FirstOrDefault();

                    currentReq.roomsAlloc.Add(selectedRoom);
                }
            }

            return(currentReq);
        }
        private request SetupNewRequestObject(RequestsWtihLinkedData rwld, bool current)
        {
            request newRequest = new request();

            module selectedModule =
                (from mod in _db.modules
                 where mod.code == rwld.moduleCode
                 select mod).FirstOrDefault();

            newRequest.moduleCode = selectedModule.code;
            newRequest.module     = selectedModule;

            SemRouController srAPI = new SemRouController();

            round selectedRound;

            if (current)
            {
                selectedRound = srAPI.GetLiveRound();

                newRequest.status = rwld.status;
            }
            else
            {
                selectedRound = srAPI.GetAdHocRound();

                newRequest.status = 1;
            }

            newRequest.roundID = selectedRound.id;

            newRequest.priority          = rwld.priority;
            newRequest.day               = rwld.day;
            newRequest.startPeriod       = rwld.startPeriod;
            newRequest.endPeriod         = rwld.endPeriod;
            newRequest.weeks             = rwld.weeks;
            newRequest.numberOfStudents  = rwld.numberOfStudents;
            newRequest.parkPreference    = rwld.parkPreference;
            newRequest.sessionType       = rwld.sessionType;
            newRequest.numberOfRooms     = rwld.numberOfRooms;
            newRequest.otherRequirements = rwld.otherRequirements;
            newRequest.traditional       = rwld.traditional;

            foreach (var facData in rwld.facilities)
            {
                facility selectedFacility =
                    (from fac in _db.facilities
                     where fac.id == facData.id
                     select fac).FirstOrDefault();

                newRequest.facilities.Add(selectedFacility);
            }

            foreach (var roomData in rwld.roomPref)
            {
                room selectedRoom =
                    (from rm in _db.rooms
                     where rm.code == roomData.code
                     select rm).FirstOrDefault();

                newRequest.roomsPref.Add(selectedRoom);
            }

            if (!current)
            {
                foreach (var roomData in rwld.roomPref)
                {
                    room selectedRoom =
                        (from rm in _db.rooms
                         where rm.code == roomData.code
                         select rm).FirstOrDefault();

                    newRequest.roomsAlloc.Add(selectedRoom);
                }
            }


            return(newRequest);
        }