/// PUT api/OrgUserMapping/318
        /// <summary>
        /// UPDATES a user by his OrgUserMapping Id that is passed in.
        /// You could use this api to make a user an admin. Can be used for partial updates
        /// </summary>
        public HttpResponseMessage PutOrgUserMappings(int id, Delta <OrgUserMappings> orgusermappings)
        {
            // find the org that the ID mapping belongs too
            OrgUserMappings _orgusermap = db.OrgUserMappings.SingleOrDefault(o => o.id == id);

            if (_orgusermap == null)
            {
                return(Request.CreateResponse(HttpStatusCode.NotFound));
            }


            // now find what org this ID belongs to, is this user an admin
            if (Auth.FB.IsOrgAdmin(_orgusermap.orgsId))
            {
                orgusermappings.Patch(_orgusermap);

                try
                {
                    db.SaveChanges();
                }
                catch (DbUpdateConcurrencyException)
                {
                    return(Request.CreateResponse(HttpStatusCode.NotFound));
                }

                return(Request.CreateResponse(HttpStatusCode.OK));
            }
            else
            {
                throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.Unauthorized));
            }
        }
        /// POST api/OrgUserMapping
        /// <summary>
        /// CREATE's a new user for an org
        /// </summary>
        public HttpResponseMessage PostOrgUserMappings(OrgUserMappings orgusermappings)
        {
            if (Auth.FB.IsOrgAdmin(orgusermappings.orgsId))
            {
                // add user to the org
                if (ModelState.IsValid)
                {
                    // Make sure the user does not already belong to the org
                    IEnumerable <OrgUserMappings> alreadyExist = db.OrgUserMappings.Where(a => a.usersId == orgusermappings.usersId && a.orgsId == orgusermappings.orgsId);
                    if (alreadyExist.Count() > 0) // user already exists in the orgs
                    {
                        return(Request.CreateResponse(HttpStatusCode.BadRequest));
                    }
                    else //user does not already belong to the org
                    {
                        // set the orgsID
                        db.OrgUserMappings.Add(orgusermappings);
                        db.SaveChanges();

                        var orgU = db.OrgUserMappings.Include("Users").FirstOrDefault(
                            o => o.usersId == orgusermappings.usersId &&
                            o.orgsId == orgusermappings.orgsId
                            );

                        // now if the users default org = 1 then change it to this orgsId
                        if (orgU.Users.defaultOrg == 1)
                        {
                            Users u = db.Users.Find(orgU.usersId);
                            u.defaultOrg = orgU.orgsId;
                            db.SaveChanges();
                        }


                        if (orgU == null)
                        {
                            throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
                        }

                        return(this.Request.CreateResponse(HttpStatusCode.Created, orgU));
                    }
                }
                else
                {
                    return(Request.CreateResponse(HttpStatusCode.BadRequest));
                }
            }
            else
            {
                throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.Unauthorized));
            }
        }
        public HttpResponseMessage PostFBUsers(IEnumerable <Users> usr)
        {
            //if (ModelState.IsValid)
            //{
            // loop users
            foreach (Users users in usr)
            {
                if (Auth.FB.IsOrgAdmin(users.defaultOrg))
                {
                    //Check to see FB ID already exists
                    Users existingUser = db.Users.FirstOrDefault(u => u.fbUserId == users.fbUserId);
                    if (existingUser == null)
                    {
                        // new user
                        // create account
                        Users newUser = new Users();
                        var   now     = DateTime.Now.ToString("O");
                        newUser.defaultOrg    = 1;
                        newUser.fbUserId      = users.fbUserId;
                        newUser.created_at    = now;
                        newUser.isSystemAdmin = false;
                        newUser.updated_at    = now;
                        newUser.name          = users.name;

                        db.Users.Add(newUser);
                        db.SaveChanges();


                        // add the user to an org with there name as the orgName
                        Orgs newOrg = new Orgs();
                        newOrg.created_at = now;
                        newOrg.orgName    = users.name;
                        newOrg.updated_at = now;

                        // save new org to the Org DB
                        db.Orgs.Add(newOrg);
                        db.SaveChanges();

                        // Map user to the org that was just created and make him the admin
                        db.OrgUserMappings.Add(new OrgUserMappings {
                            usersId = newUser.id, isOrgAdmin = true, orgsId = newOrg.id
                        });

                        // add an org user mapping
                        db.OrgUserMappings.Add(new OrgUserMappings {
                            usersId = newUser.id, isOrgAdmin = users.isSystemAdmin, orgsId = users.defaultOrg
                        });

                        db.SaveChanges();

                        // set the default org for the user
                        newUser.defaultOrg      = newOrg.id;
                        db.Entry(newUser).State = EntityState.Modified;
                        db.SaveChanges();
                    }
                    else
                    {
                        // if usr exists
                        // add an org user mapping, if one does not already exist
                        OrgUserMappings existingMapping = db.OrgUserMappings.FirstOrDefault(ou => ou.orgsId == users.defaultOrg && ou.usersId == existingUser.id);
                        if (existingMapping != null)
                        {
                            // update mapping
                            existingMapping.isOrgAdmin      = users.isSystemAdmin;
                            db.Entry(existingMapping).State = EntityState.Modified;
                        }
                        else
                        {
                            // create mapping
                            db.OrgUserMappings.Add(new OrgUserMappings {
                                isOrgAdmin = users.isSystemAdmin, orgsId = users.defaultOrg, usersId = existingUser.id
                            });
                        }

                        db.SaveChanges();
                    }
                }
            }

            return(Request.CreateResponse(HttpStatusCode.OK));

            //}
            //else
            //{
            //    return Request.CreateResponse(HttpStatusCode.BadRequest);
            //}

            //else
            //{
            //    throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.Unauthorized));
            //}
        }
        /// DELETE api/OrgUserMapping/5
        /// <summary>
        /// DELETE's a user from an org by passing in the id primary key from the OrgUserMapping Table
        /// </summary>
        public HttpResponseMessage DeleteOrgUserMappings(int id)
        {
            // find the org the ID mapping belongs too
            OrgUserMappings orgusermappings = db.OrgUserMappings.Find(id);

            if (orgusermappings == null)
            {
                return(Request.CreateResponse(HttpStatusCode.NotFound));
            }

            // now find what org this ID belongs to, is this user an admin
            if (Auth.FB.IsOrgAdmin(orgusermappings.orgsId))
            {
                // if this org was the users default org then set a different default org for him
                // if he is not a member of any more orgs then set the default org to 1 (World Survey Kit)
                Users u = db.Users.First(uu => uu.id == orgusermappings.usersId); // find the users default org
                if (u.defaultOrg == orgusermappings.orgsId)                       // if this is the users default org org then set it to something else
                {
                    // find another org the user is a member of
                    IEnumerable <OrgUserMappings> ou = db.OrgUserMappings.Where(oo => oo.orgsId != orgusermappings.orgsId && oo.usersId == orgusermappings.usersId);
                    if (ou.Count() > 0)
                    {
                        // set the first org as the new default org
                        Users setUser = db.Users.Find(orgusermappings.usersId);
                        setUser.defaultOrg = ou.First().orgsId;

                        // Update database
                        db.Entry(setUser).CurrentValues.SetValues(setUser);
                        db.SaveChanges();
                        db.Entry(setUser).State = EntityState.Detached;
                    }
                    else
                    {
                        // set the default org to 1
                        Users setUser = db.Users.Find(orgusermappings.usersId);
                        setUser.defaultOrg = 1;

                        // Update database
                        db.Entry(setUser).CurrentValues.SetValues(setUser);
                        db.SaveChanges();
                        db.Entry(setUser).State = EntityState.Detached;
                    }
                }

                // now remove the user from the org
                db.OrgUserMappings.Remove(orgusermappings);
                try
                {
                    db.SaveChanges();
                }
                catch (DbUpdateConcurrencyException)
                {
                    return(Request.CreateResponse(HttpStatusCode.NotFound));
                }


                return(Request.CreateResponse(HttpStatusCode.OK, orgusermappings));
            }
            else
            {
                throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.Unauthorized));
            }
        }