public UploadModel UploadFile(string providerUserKey, UploadModel model, bool isProfilePhoto = false)
        {
            using (var context = new greenMoneyEntities())
            {

                var upload = context.Uploads.Create();

                var user = context.Users1.Find(new Guid(providerUserKey));

                upload.Contents = model.Contents;
                upload.ContentType = model.ContentType;
                upload.FileName = model.FileName;
                upload.UploadedBy_Id = user.Id;

                context.Uploads.Add(upload);

                context.SaveChanges();

                if (isProfilePhoto)
                {
                    user.PhotoID = upload.Id;
                }

                context.SaveChanges();

                model.UploadId = upload.Id;

                return model;
            }
        }
        public UserModel AddUserToInInterestedPeople(UserModel userModel)
        {
            using (var context = new greenMoneyEntities())
            {
                var ip = new InterestedPeople
                {
                    FirstName = userModel.FirstName,
                    LastName = userModel.LastName,
                    SendEmailOffers = false,//registrationViewModel.SendEmailOffers, //Redesing
                    SendEmailUpdates = userModel.SendEmailOffers,
                    Email = userModel.Email,
                    Postcode = userModel.Postcode,
                    Gender = null, //model.Sex, //Redesing
                    DateOfBirth = userModel.DateOfBirth,
                    FreeStandingHome = true,
                    HasRfidTag = false,
                    StreetName = "N/A",
                    StreetNumber = "N/A",
                    StreetType = "N/A",
                    State = "N/A",
                    Suburb = "N/A",
                    UnitNumber = "N/A"
                };

                context.InterestedPeople.Add(ip);
                context.SaveChanges();

                return userModel;
            }
        }
        public bool AddPoints(int userChallengeId)
        {
            using (var context = new greenMoneyEntities())
            {
                var time = DateTime.Now;

                UserChallenges userChallenge = context.UserChallenges.Single(x => x.Id == userChallengeId);
                Users1 user = context.Users1.Single(x => x.Id == userChallenge.UserId);
                Challenges challenge = context.Challenges.Single(x => x.Id == userChallenge.ChallengeId);

                userChallenge.PointsClaimed = true;

                var transaction = new Transactions
                {
                    Address_Id = user.Address_Id,
                    User_Id = user.Id,
                    Time = time,
                    Description = "Challenge " + challenge.Name,
                    Points = Convert.ToInt64(challenge.Points),
                    TransactionTypeID = 2
                };

                context.Transactions.Add(transaction);
                context.SaveChanges();

                return true;
            }
        }
 //add points to translactions
 public bool AddPoints(string providerUserKey, int id, string promoCode = "")
 {
     try
     {
         using (var context = new greenMoneyEntities())
         {
             var user = context.Users1.Find(new Guid(providerUserKey));
             var time = DateTime.Now;
             var userChallenge =
                 context.UserChallenges.FirstOrDefault(
                     x => x.ChallengeId == id && x.UserId == user.Id);
             if (userChallenge != null)
             {
                 userChallenge.PointsClaimed = true;
                 var challenge = context.Challenges.SingleOrDefault(x => x.Id.Equals(id));
                 if (challenge != null)
                 {
                     //just for challenge action
                     if (string.IsNullOrEmpty(promoCode) || challenge.PromoCode.Equals(promoCode))
                     {
                         var addPoints = challenge.Points.HasValue ? Convert.ToInt64(challenge.Points.Value) : 0;
                         var transaction = new Transactions
                         {
                             Addresses = user.Addresses,
                             Users1 = user,
                             Time = time,
                             Description = "Challenge " + challenge.Name,
                             Points = +addPoints,
                             TransactionTypeID = 2
                         };
                         context.Transactions.Add(transaction);
                         context.SaveChanges();
                         return true;
                     }
                 }
             }
         }
         return false;
     }
     catch
     {
         return false;
     }
 }
        //challenge
        public int? CreateChallenge(Guid providerUserKey, ChallengeModel model)
        {
            using (var context = new greenMoneyEntities())
            {
                var user = context.Users1.FirstOrDefault(u => u.Id == providerUserKey);
                if (user != null)
                {
                    Challenges challenge = new Challenges();

                    Utils.CopyProperties(model, challenge);

                    challenge.DateAdded = DateTime.Now;

                    context.Challenges.Add(challenge);
                     try
                    {
                        context.SaveChanges();

                        return challenge.Id;

                    }
                     catch (DbEntityValidationException dbEx)
                     {
                         foreach (var validationErrors in dbEx.EntityValidationErrors)
                         {
                             foreach (var validationError in validationErrors.ValidationErrors)
                             {
                                 Trace.TraceInformation("Class: {0}, Property: {1}, Error: {2}",
                                     validationErrors.Entry.Entity.GetType().FullName,
                                     validationError.PropertyName,
                                     validationError.ErrorMessage);
                             }
                         }

                         return null;
                     }
                }
            }
            return null;
        }
        public string AddSupplierAddressDefault()
        {
            using (var context = new greenMoneyEntities())
            {

                var address = context.Addresses.Create();
                address.Id = 1;
                address.StreetNumber = "1";
                address.Instance_Id = 1;
                address.StreetName = "Supplier";
                address.Suburb = "Supplier";
                address.StreetType = "Supplier";
                address.UnitNumber = "Supplier";
                address.State = "000";
                address.Postcode = "0000";

                context.Addresses.Add(address);
                context.SaveChanges();

                return address.Id.ToString();
            }
        }
        public ChallengeModel CopyChallenge(int id)
        {
            using (var context = new greenMoneyEntities())
            {
                Challenges challenge = context.Challenges.Single(x => x.Id == id);
                challenge.DateAdded = DateTime.Now;
                context.Challenges.Add(challenge);

                try
                {
                    context.SaveChanges();

                    ChallengeModel challengeModel = new ChallengeModel();

                    Utils.CopyProperties(challenge, challengeModel);
                    //  challengeModel.AustraliaState = challenge.State;

                    return challengeModel;

                }
                catch (DbEntityValidationException dbEx)
                {
                    foreach (var validationErrors in dbEx.EntityValidationErrors)
                    {
                        foreach (var validationError in validationErrors.ValidationErrors)
                        {
                            Trace.TraceInformation("Class: {0}, Property: {1}, Error: {2}",
                                validationErrors.Entry.Entity.GetType().FullName,
                                validationError.PropertyName,
                                validationError.ErrorMessage);
                        }
                    }

                    return null;
                }
            }
        }
        public bool DeleteUserChallenge(int id)
        {
            using (var context = new greenMoneyEntities())
            {
                UserChallenges userChallenge = context.UserChallenges.Single(x => x.Id == id);
                context.UserChallenges.Remove(userChallenge);
                try
                {
                    context.SaveChanges();
                }
                catch (Exception)
                {

                    return false;
                }
                return true;
            }
        }
        public UserModel CreateSupplierUser(UserModel model, int numPoints, string description, int? transactionTypeId)
        {
            using (var context = new greenMoneyEntities())
            {
                var address = context.Addresses.First(i => i.Id == model.AddressId);
                var user = new Users1
                {
                    Id = model.Id,
                    Instance_Id = model.Instance_Id,
                    FirstName = model.FirstName,
                    LastName = model.LastName,
                    Addresses = address,
                    SendEmailUpdates = model.SendEmailUpdates,
                    IsAdditionalAccountHolder = model.IsAdditionalAccountHolder,
                    BusinessName = model.BusinessName,
                    BusinessNumberABN = model.BusinessNumberABN,
                    BusinessType = model.BusinessType,
                    BussinesWebSite = model.BussinesWebSite,
                    BussinesEmail = model.BussinesEmail,
                    BussinesPhone = model.BussinesPhone,
                    BussinesPhoneArea = model.BussinesPhoneArea,
                    BussinesPhoneMobile = model.BussinesPhoneMobile,
                    BussinesLocation = model.BussinesLocation,
                    EmailBussinesOnVoucherRedeem = model.EmailBussinesOnVoucherRedeem
                };

                // store it
                context.Users1.Add(user);

                AddPoints(context, user, numPoints, description, transactionTypeId);

                context.SaveChanges();

                return GetUserById(user.Id);
            }
        }
        public bool DeleteReward(int id)
        {
            using (var context = new greenMoneyEntities())
            {
                Rewards reward = context.Rewards.Single(x => x.Id == id);
                context.Rewards.Remove(reward);
                context.SaveChanges();

                return true;
            }
        }
        //challenge
        public int? CreateChallenge(Guid providerUserKey, ChallengeModel model)
        {
            using (var context = new greenMoneyEntities())
            {
                var user = context.Users1.FirstOrDefault(u => u.Id == providerUserKey);
                if (user != null)
                {
                    Challenges challenge = new Challenges();

                    Utils.CopyProperties(model, challenge);

                    challenge.Owner_Id = user.Id;
                    challenge.Instance_Id = user.Instance_Id;

                    challenge.DateAdded = DateTime.Now;
                    challenge.Popularity = 0;
                    //  challenge.State = model.AustraliaState;

                    if (model.ProfileImages.Count > 0)
                    {
                        if (model.ProfileImages[0] != null && model.ProfileImages[0].FileName != null)
                        {
                            var upload = new UploadsRepository().UploadFile(providerUserKey.ToString(), model.ProfileImages[0]);
                            challenge.ImageId1 = upload.UploadId;
                        }

                        if (model.ProfileImages[1] != null && model.ProfileImages[1].FileName != null)
                        {
                            var upload = new UploadsRepository().UploadFile(providerUserKey.ToString(), model.ProfileImages[1]);
                            challenge.ImageId2 = upload.UploadId;
                        }

                        if (model.ProfileImages[2] != null && model.ProfileImages[2].FileName != null)
                        {
                            var upload = new UploadsRepository().UploadFile(providerUserKey.ToString(), model.ProfileImages[2]);
                            challenge.ImageId3 = upload.UploadId;
                        }

                        if (model.ProfileImages[3] != null && model.ProfileImages[3].FileName != null)
                        {
                            var upload = new UploadsRepository().UploadFile(providerUserKey.ToString(), model.ProfileImages[3]);
                            challenge.ImageId4 = upload.UploadId;
                        }

                    }

                    context.Challenges.Add(challenge);
                    try
                    {
                        context.SaveChanges();

                        return challenge.Id;

                    }
                    catch (DbEntityValidationException dbEx)
                    {
                        foreach (var validationErrors in dbEx.EntityValidationErrors)
                        {
                            foreach (var validationError in validationErrors.ValidationErrors)
                            {
                                Trace.TraceInformation("Class: {0}, Property: {1}, Error: {2}",
                                    validationErrors.Entry.Entity.GetType().FullName,
                                    validationError.PropertyName,
                                    validationError.ErrorMessage);
                            }
                        }

                        return null;
                    }
                }
            }
            return null;
        }
        public int? CreateReward(Guid providerUserKey, RewardModel model)
        {
            using (var context = new greenMoneyEntities())
            {
                var user = context.Users1.FirstOrDefault(u => u.Id == providerUserKey);

                if (user != null)
                {
                    Rewards reward = new Rewards();
                    reward.PartnerEmail = model.PartnerEmail;
                    reward.State = (int)RewardState.Incomplete;
                    reward.Owner_Id = user.Id;
                    reward.Instance_Id = user.Instance_Id;
                    reward.Instance = user.Instance;

                    Utils.CopyProperties(model, reward);

                    reward.DateAdded = DateTime.Now;

                    if (model.ProfileImages.Count > 0)
                    {
                        if (model.ProfileImages[0] != null && model.ProfileImages[0].FileName != null)
                        {
                            var upload = new UploadsRepository().UploadFile(providerUserKey.ToString(), model.ProfileImages[0]);
                            reward.ImageId = upload.UploadId;
                        }

                        if (model.ProfileImages[1] != null && model.ProfileImages[1].FileName != null)
                        {
                            var upload = new UploadsRepository().UploadFile(providerUserKey.ToString(), model.ProfileImages[1]);
                            reward.Image2Id = upload.UploadId;
                        }

                        if (model.ProfileImages[2] != null && model.ProfileImages[2].FileName != null)
                        {
                            var upload = new UploadsRepository().UploadFile(providerUserKey.ToString(), model.ProfileImages[2]);
                            reward.Image3Id = upload.UploadId;
                        }

                        if (model.ProfileImages[3] != null && model.ProfileImages[3].FileName != null)
                        {
                            var upload = new UploadsRepository().UploadFile(providerUserKey.ToString(), model.ProfileImages[3]);
                            reward.Image4Id = upload.UploadId;
                        }

                    }

                    context.Rewards.Add(reward);

                    try
                    {
                        context.SaveChanges();

                        return reward.Id;

                    }
                    catch (DbEntityValidationException dbEx)
                    {
                        foreach (var validationErrors in dbEx.EntityValidationErrors)
                        {
                            foreach (var validationError in validationErrors.ValidationErrors)
                            {
                                Trace.TraceInformation("Class: {0}, Property: {1}, Error: {2}",
                                    validationErrors.Entry.Entity.GetType().FullName,
                                    validationError.PropertyName,
                                    validationError.ErrorMessage);
                            }
                        }

                        return null;
                    }

                }
            }

            return null;
        }
        public int? UpdateReward(Guid providerUserKey, RewardModel model)
        {
            using (var context = new greenMoneyEntities())
            {
                var user = context.Users1.FirstOrDefault(u => u.Id == providerUserKey);
                var reward = context.Rewards.FirstOrDefault(r => r.Id == model.Id);

                if (user != null && reward != null)
                {
                    reward.PartnerEmail = model.PartnerEmail;
                    Utils.CopyProperties(model, reward);

                    //CopyProperties doesn't work for null values...
                    reward.ImageSmallId = model.ImageSmallId;
                    reward.VoucherBarcodeId = model.VoucherBarcodeId;

                    if (model.ProfileImages.Count > 0)
                    {
                        if (model.ProfileImages[0] != null && model.ProfileImages[0].FileName != null)
                        {
                            var upload = new UploadsRepository().UploadFile(providerUserKey.ToString(), model.ProfileImages[0]);
                            reward.ImageId = upload.UploadId;
                        }
                        else if (model.ImageId == null)
                        {
                            Uploads uploadOld = context.Uploads.SingleOrDefault(x => x.Id == reward.ImageId);
                            if (uploadOld != null)
                            {
                                context.Uploads.Remove(uploadOld);
                                reward.ImageId = null;
                            }
                        }

                        if (model.ProfileImages[1] != null && model.ProfileImages[1].FileName != null)
                        {
                            var upload = new UploadsRepository().UploadFile(providerUserKey.ToString(), model.ProfileImages[1]);
                            reward.Image2Id = upload.UploadId;
                        }
                        else if (model.Image2Id == null)
                        {
                            Uploads uploadOld = context.Uploads.SingleOrDefault(x => x.Id == reward.Image2Id);
                            if (uploadOld != null)
                            {
                                context.Uploads.Remove(uploadOld);
                                reward.Image2Id = null;
                            }
                        }

                        if (model.ProfileImages[2] != null && model.ProfileImages[2].FileName != null)
                        {
                            var upload = new UploadsRepository().UploadFile(providerUserKey.ToString(), model.ProfileImages[2]);
                            reward.Image3Id = upload.UploadId;
                        }
                        else if (model.Image3Id == null)
                        {
                            Uploads uploadOld = context.Uploads.SingleOrDefault(x => x.Id == reward.Image3Id);
                            if (uploadOld != null)
                            {
                                context.Uploads.Remove(uploadOld);
                                reward.Image3Id = null;
                            }
                        }

                        if (model.ProfileImages[3] != null && model.ProfileImages[3].FileName != null)
                        {
                            var upload = new UploadsRepository().UploadFile(providerUserKey.ToString(), model.ProfileImages[3]);
                            reward.Image4Id = upload.UploadId;
                        }
                        else if (model.Image4Id == null)
                        {
                            Uploads uploadOld = context.Uploads.SingleOrDefault(x => x.Id == reward.Image4Id);
                            if (uploadOld != null)
                            {
                                context.Uploads.Remove(uploadOld);
                                reward.Image4Id = null;
                            }
                        }
                    }

                    try
                    {

                        context.SaveChanges();

                        return reward.Id;
                    }
                    catch (DbEntityValidationException dbEx)
                    {
                        foreach (var validationErrors in dbEx.EntityValidationErrors)
                        {
                            foreach (var validationError in validationErrors.ValidationErrors)
                            {
                                Trace.TraceInformation("Class: {0}, Property: {1}, Error: {2}",
                                    validationErrors.Entry.Entity.GetType().FullName,
                                    validationError.PropertyName,
                                    validationError.ErrorMessage);
                            }
                        }

                        return null;
                    }
                }
            }

            return null;
        }
        public bool InvitationAcceptedAddBonusPoints(string inviterEmail, int numPoints, string description, int? transactionTypeId)
        {
            using (var context = new greenMoneyEntities())
            {
                var user = context.Users.FirstOrDefault(i => i.UserName == inviterEmail);

                if (user != null)
                {
                    AddPoints(context, user.Users1, numPoints, description, transactionTypeId);
                    context.SaveChanges();
                    return true;

                }

                return false;
            }
        }
        public bool UpdateToCompleteSupplierUser(UserModel model)
        {
            using (var context = new greenMoneyEntities())
            {
                var user = context.Users1.Find(model.Id);

                user.BusinessNumberABN = model.BusinessNumberABN;
                user.BusinessType = model.BusinessType;
                user.BussinesWebSite = model.BussinesWebSite;

                context.SaveChanges();

                return true;
            }
        }
 //when user starts the process for getting points
 public bool ClaimPoints(string providerUserKey, int id, bool claim)
 {
     try
     {
         using (var context = new greenMoneyEntities())
         {
             var userGuid = new Guid(providerUserKey);
             var challenge =
                 context.UserChallenges.FirstOrDefault(
                     x => x.ChallengeId == id && x.UserId == userGuid);
             if (challenge == null)
             {
                 context.UserChallenges.Add(
                     new UserChallenges
                     {
                         ChallengeId = id,
                         UserId = userGuid,
                         PointsClaimed = claim,
                         Issued = DateTime.Now
                     });
                 context.SaveChanges();
             }
         }
         return true;
     }
     catch
     {
         return false;
     }
 }
        public InviteUserModel InviteHouseholdMembers(InviteUserModel userModel, int numBonusPoints, string descBonusPoints, int? transactionTypeId)
        {
            using (var context = new greenMoneyEntities())
            {
                Users1 inviterUser = context.Users1.FirstOrDefault(x => x.Id == userModel.User_Id);
                var user = new InvitedUsers
                {
                    FirstName = userModel.FirstName,
                    LastName = userModel.LastName,
                    Email = userModel.Email,
                    User_Id = userModel.User_Id
                };

                context.InvitedUsers.Add(user);
                AddPoints(context, inviterUser, numBonusPoints, descBonusPoints, transactionTypeId);

                context.SaveChanges();

                return userModel;
            }
        }
        public bool UpdateMyCart(string providerUserKey, IList<CartItemSummary> cartItems)
        {
            try
            {
                using (var context = new greenMoneyEntities())
                {
                    var user = context.Users1.Find(new Guid(providerUserKey));

                    foreach (var item in cartItems)
                    {
                        var cartItem = user.CartItems.Single(i => i.Id == item.Id);

                        cartItem.Quantity = item.Quantity;

                        if (cartItem.Quantity <= 0)
                        {
                            context.CartItems.Remove(cartItem);
                        }
                    }

                    context.SaveChanges();

                    return true;
                }
            }
            catch (Exception)
            {
                return false;
            }
        }
        public CheckoutSubmitModel AddCartToMyWallet(string providerUserKey)
        {
            CheckoutSubmitModel model = new CheckoutSubmitModel();

            using (var context = new greenMoneyEntities())
            {
                var user = context.Users1.Find(new Guid(providerUserKey));

                var items = user.CartItems.ToList();
                long total = items.Sum(i => i.Cost);
                decimal dollartotal = items.Sum(i => i.DollarCost);

                // User don't have any items in cart
                if (!items.Any())
                {
                    model.CheckoutSubmitModelState = CheckoutSubmitModelState.NoItemsFound;
                    return model;
                }

                // User has enough points to purchase
                if (user.PointsTotal >= total)
                {
                    var time = DateTime.Now;

                    string description;
                    int? transactionType = null;

                    if (user.CartItems.Count == 1)
                    {
                        description = "Redeem " + user.CartItems.Single().Rewards.PartnerName
                            + " " + user.CartItems.Single().Rewards.Name;
                        transactionType = 4;
                    }
                    else
                    {
                        description = "Voucher redemption x" + user.CartItems.Sum(i => i.Quantity);
                        transactionType = 1;
                    }

                    var purchases = new List<OrderSummaryItemModel>();

                    int costIndex = 1;

                    foreach (var item in items)
                    {
                        int itemidx;
                        if (item.DollarCost == 0)
                        {
                            for (int i = 0; i < item.Quantity; i++)
                            {
                                var voucher = new Vouchers
                                {
                                    Id = Guid.NewGuid(),
                                    Issued = time,
                                    Rewards = item.Rewards,
                                    Users1 = user
                                };

                                context.Vouchers.Add(voucher);

                                voucher.Rewards.Popularity += 1;

                                var ownerUser = context.Users.FirstOrDefault(x => x.UserId == item.Rewards.Owner_Id);

                                purchases.Add(new OrderSummaryItemModel
                                {
                                    VoucherId = voucher.Id,
                                    Name = item.Rewards.Name,
                                    Points = item.Cost,
                                    Quantity = item.Quantity,
                                    DollarCost = item.DollarCost,
                                    PayPalIndex = 0,
                                    AttachVoucherUrl = true,
                                    NotifyOnRedeem = item.Rewards.NotifyOnRedeem,
                                    UserFirstName = user.FirstName,
                                    UserLastName = user.LastName,
                                    PartnerName = item.Rewards.PartnerName,
                                    PartnerOwnerEmail = ownerUser != null ? ownerUser.UserName : null,
                                    Category = item.Rewards.RewardCategories.Name
                                });
                            }
                        }
                        else
                        {
                            itemidx = costIndex++;
                            var ownerUser = context.Users.FirstOrDefault(x => x.UserId == item.Rewards.Owner_Id);

                            purchases.Add(new OrderSummaryItemModel
                            {
                                Name = item.Rewards.Name,
                                Points = item.Cost,
                                Quantity = item.Quantity,
                                DollarCost = item.DollarCost,
                                PayPalIndex = itemidx,
                                AttachVoucherUrl = false,
                                VoucherUrl = string.Empty,
                                NotifyOnRedeem = item.Rewards.NotifyOnRedeem,
                                UserFirstName = user.FirstName,
                                UserLastName = user.LastName,
                                PartnerName = item.Rewards.PartnerName,
                                PartnerOwnerEmail = ownerUser != null ? ownerUser.UserName : null,
                                Category = item.Rewards.RewardCategories.Name
                            });
                        }

                       // Remove from cart items after added to purchases
                       context.CartItems.Remove(item);
                    }

                    var transaction = new Transactions
                    {
                        Addresses = user.Addresses,
                        Users1 = user,
                        Time = time,
                        Description = description,
                        Points = -total,
                        TransactionTypeID = transactionType
                    };
                    context.Transactions.Add(transaction);
                    context.SaveChanges();

                    if (dollartotal > 0)
                    {
                        model.CheckoutSubmitModelState = CheckoutSubmitModelState.SuccessWithProductOrderConfirmation;
                    }
                    else
                    {
                        model.CheckoutSubmitModelState = CheckoutSubmitModelState.SuccessWithOrderConfirmation;
                    }

                    model.Purchases = purchases;

                    return model;

                }
                else // User does NOT have enough points to purchase
                {
                    model.CheckoutSubmitModelState = CheckoutSubmitModelState.NotEnoughPoints;
                    return model;
                }
            }
        }
        public bool AddToMyCart(string providerUserKey, int rewardId, int quantity = 1)
        {
            try
            {
                using (var context = new greenMoneyEntities())
                {
                    var user = context.Users1.Find(new Guid(providerUserKey));

                    var cartItem = user.CartItems.SingleOrDefault(c => c.Rewards.Id == rewardId);

                    if (cartItem != null)
                    {
                        cartItem.Quantity += quantity;
                    }
                    else
                    {
                        cartItem = new CartItems
                        {
                            Rewards = context.Rewards.Single(r => r.Id == rewardId),
                            Users1 = user,
                            Quantity = quantity
                        };
                        context.CartItems.Add(cartItem);
                    }

                    context.SaveChanges();
                }
                return true;
            }
            catch (Exception)
            {

                return false;
            }
        }
        public int? UpdateChallenge(Guid providerUserKey, ChallengeModel model)
        {
            using (var context = new greenMoneyEntities())
            {
                var user = context.Users1.FirstOrDefault(u => u.Id == providerUserKey);
                var challenge = context.Challenges.FirstOrDefault(r => r.Id == model.Id);

                if (user != null && challenge != null)
                {

                    Utils.CopyProperties(model, challenge);
                    // challenge.State = model.AustraliaState;

                    challenge.Owner_Id = user.Id;
                    challenge.Instance_Id = user.Instance_Id;
                    challenge.LogoImageId = model.LogoImageId;

                    if (model.ProfileImages.Count > 0)
                    {
                        if (model.ProfileImages[0] != null && model.ProfileImages[0].FileName != null)
                        {
                            var upload = new UploadsRepository().UploadFile(providerUserKey.ToString(), model.ProfileImages[0]);
                            challenge.ImageId1 = upload.UploadId;
                        }
                        else if (model.ImageId1 == null)
                        {
                            Uploads uploadOld = context.Uploads.SingleOrDefault(x => x.Id == challenge.ImageId1);
                            if (uploadOld != null)
                            {
                                context.Uploads.Remove(uploadOld);
                                challenge.ImageId1 = null;
                            }
                        }

                        if (model.ProfileImages[1] != null && model.ProfileImages[1].FileName != null)
                        {
                            var upload = new UploadsRepository().UploadFile(providerUserKey.ToString(), model.ProfileImages[1]);
                            challenge.ImageId2 = upload.UploadId;
                        }
                        else if (model.ImageId2 == null)
                        {
                            Uploads uploadOld = context.Uploads.SingleOrDefault(x => x.Id == challenge.ImageId2);
                            if (uploadOld != null)
                            {
                                context.Uploads.Remove(uploadOld);
                                challenge.ImageId2 = null;
                            }
                        }

                        if (model.ProfileImages[2] != null && model.ProfileImages[2].FileName != null)
                        {
                            var upload = new UploadsRepository().UploadFile(providerUserKey.ToString(), model.ProfileImages[2]);
                            challenge.ImageId3 = upload.UploadId;
                        }
                        else if (model.ImageId3 == null)
                        {
                            Uploads uploadOld = context.Uploads.SingleOrDefault(x => x.Id == challenge.ImageId3);
                            if (uploadOld != null)
                            {
                                context.Uploads.Remove(uploadOld);
                                challenge.ImageId3 = null;
                            }
                        }

                        if (model.ProfileImages[3] != null && model.ProfileImages[3].FileName != null)
                        {
                            var upload = new UploadsRepository().UploadFile(providerUserKey.ToString(), model.ProfileImages[3]);
                            challenge.ImageId4 = upload.UploadId;
                        }
                        else if (model.ImageId4 == null)
                        {
                            Uploads uploadOld = context.Uploads.SingleOrDefault(x => x.Id == challenge.ImageId4);
                            if (uploadOld != null)
                            {
                                context.Uploads.Remove(uploadOld);
                                challenge.ImageId4 = null;
                            }
                        }
                    }

                    try
                    {
                        context.SaveChanges();

                        return challenge.Id;
                    }
                    catch (DbEntityValidationException dbEx)
                    {
                        foreach (var validationErrors in dbEx.EntityValidationErrors)
                        {
                            foreach (var validationError in validationErrors.ValidationErrors)
                            {
                                Trace.TraceInformation("Class: {0}, Property: {1}, Error: {2}",
                                    validationErrors.Entry.Entity.GetType().FullName,
                                    validationError.PropertyName,
                                    validationError.ErrorMessage);
                            }
                        }

                        return null;
                    }
                }
            }

            return null;
        }
        public UserModel CreateUser(UserModel model, int numPoints, string description, int? transactionTypeId)
        {
            using (var context = new greenMoneyEntities())
            {
                var address = context.Addresses.First(i => i.Id == model.AddressId);
                var user = new Users1
                {
                    Id = model.Id,
                    FirstName = model.FirstName,
                    LastName = model.LastName,
                    Addresses = address,
                    SendEmailOffers = model.SendEmailOffers,
                    SendEmailUpdates = model.SendEmailUpdates,
                    IsFBAccount = model.IsFBAccount,
                    FBUserId = model.FBUserId,
                    IsAdditionalAccountHolder = model.IsAdditionalAccountHolder,
                    Sex = model.Sex,
                    DateOfBirth = model.DateOfBirth,
                    PhoneNumber = model.PhoneNumber
                };

                if (address.Instance_Id != null)
                    user.Instance_Id = (int)address.Instance_Id;

                // store it
                context.Users1.Add(user);

                AddPoints(context, user, numPoints, description, transactionTypeId);

                context.SaveChanges();

                return GetUserById(user.Id);
            }
        }
        public bool UpdateProfile(string providerUserKey, UpdateProfileModel model)
        {
            try
            {
                using (var context = new greenMoneyEntities())
                {
                    // find from gm users
                    var user = context.Users1.Find(new Guid(providerUserKey));

                    user.FirstName = model.FirstName;
                    user.LastName = model.LastName;
                    user.PhoneNumber = model.PhoneNumber;
                    if (model.BirthDate != DateTime.MinValue)
                    {
                        user.DateOfBirth = model.BirthDate;
                    }
                    user.Sex = model.Sex;
                    user.SendEmailUpdates = model.SendEmailUpdates;
                    user.PushNotifications = model.PushNotifications;
                    user.PostToFacebook = model.PostToFacebook;

                    //Private company - auspost
                    user.EmploymentType = model.EmploymentType;
                    if (model.AddressId != null)
                    {
                        user.Address_Id = (int) model.AddressId;
                    }
                    // save changes
                    context.SaveChanges();

                }
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }
        public UserModel UpdateSupplierUser(UserModel model)
        {
            using (var context = new greenMoneyEntities())
            {
                var user = context.Users1.Find(model.Id);

                user.FirstName = model.FirstName;
                user.LastName = model.LastName;
                user.SendEmailOffers = model.SendEmailOffers;
                user.SendEmailUpdates = model.SendEmailUpdates;
                user.IsFBAccount = model.IsFBAccount;
                user.BusinessName = model.BusinessName;
                user.BusinessNumberABN = model.BusinessNumberABN;
                user.BusinessType = model.BusinessType;
                user.BussinesWebSite = model.BussinesWebSite;
                user.BussinesEmail = model.BussinesEmail;
                user.BussinesPhone = model.BussinesPhone;
                user.BussinesPhoneArea = model.BussinesPhoneArea;
                user.BussinesPhoneMobile = model.BussinesPhoneMobile;
                user.BussinesLocation = model.BussinesLocation;
                user.EmailBussinesOnVoucherRedeem = model.EmailBussinesOnVoucherRedeem;

                context.SaveChanges();

                return GetUserById(user.Id);
            }
        }