public async Task<IHttpActionResult> PostAccount(Account account)
        {
            string badRequestDescription = "";

            if (account.Name == "" || account.Name == null)
            {
                badRequestDescription = "nameError";

                return Ok(badRequestDescription);
            }

            if (account.Balance == 0)
            {
                badRequestDescription = "balanceError";

                return Ok(badRequestDescription);
            }

            var user = db.Users.Find(User.Identity.GetUserId());

            if (user.HouseholdId == null)
            {
                return Ok("To create accounts you must first create or join a household.");
            }
            account.HouseholdId = (int)user.HouseholdId;
            account.Household = db.Households.Find(user.HouseholdId);
            account.ReconciledBalance = account.Balance;
            
            db.Accounts.Add(account);
            await db.SaveChangesAsync();

            Transaction trans = new Transaction()
            {
                Description = "Account Initialization",
                Amount = account.Balance,
                Reconciled = account.Balance,
                CategoryId = 6,
                Created = DateTimeOffset.Now,
                AccountId = account.Id,
                IsIncome = true,
                Settled = true
            };

            db.Transactions.Add(trans);
            await db.SaveChangesAsync();
            
            return Ok(account.Id);
            //"The " + account.Name + " account has been created for the " + account.Household.Name + " household. A transaction showing the initialization of this account has also been created." + 
        }
        public async Task<IHttpActionResult> PutTransaction(Transaction trans)
        {
            string badRequestDescription = "";

            if (trans.Description == "" || trans.Description == null)
            {
                badRequestDescription = "descriptionError";

                return Ok(badRequestDescription);
            }
            else if (trans.Amount == 0)
            {
                badRequestDescription = "amountError";

                return Ok(badRequestDescription);
            }
            else if (trans.CategoryId == 0 || trans.CategoryId == null)
            {
                badRequestDescription = "categoryError";

                return Ok(badRequestDescription);
            }

            //check the incoming model's validity
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            //look up the current user
            var user = db.Users.Find(User.Identity.GetUserId());

            //check the current user's authenticity
            if (!User.Identity.IsAuthenticated)
            {
                return Unauthorized();
            }


            if (trans.Category != null)
            {
                db.Entry(trans.Category).State = trans.Category.Id == 0 ? EntityState.Added : EntityState.Unchanged;
            }
            else
            {
                return BadRequest();
            }

            //if the incoming transaction is an expense
            if (!trans.IsIncome)
            {//change the value to reflect an expense
                if (trans.Amount > 0)
                    trans.Amount *= -1;

                if (trans.Reconciled > 0)
                    trans.Reconciled *= -1;
            }
            else//if for some reason the user is editing and sets the amount of an income tranaction to be negative change the value to reflect an income
            {
                if (trans.Amount < 0)
                    trans.Amount *= -1;

                if (trans.Reconciled < 0)
                    trans.Reconciled *= -1;
            }

            if (Math.Abs(trans.Amount) == Math.Abs(trans.Reconciled))
            {
                trans.Settled = true;
            }

            //look up the transaction in the database
            var existingTrans = db.Transactions.AsNoTracking().FirstOrDefault(t => t.Id == trans.Id);

            //use the 
            var etaBalance = existingTrans.Account.Balance;
            var etaAmount = existingTrans.Amount;

            etaBalance -= etaAmount;
            etaBalance += trans.Amount;

            var etaRecBalance = existingTrans.Account.ReconciledBalance;
            var etaRec = existingTrans.Reconciled;

            etaRecBalance -= etaRec;
            etaRecBalance += trans.Reconciled;

            var account = db.Accounts.FirstOrDefault(a => a.Id == trans.AccountId);

            account.Balance = etaBalance;
            account.ReconciledBalance = etaRecBalance;
            
            db.Entry(trans).State = EntityState.Modified;

            if (trans.Category.Id != 0)
            {
                trans.CategoryId = trans.Category.Id;
            }

            trans.Updated = DateTimeOffset.Now;

            try
            {
                await db.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!TransactionExists(trans.Id))
                {
                    return NotFound();
                }
                else
                {
                    throw;
                }
            }

            return Ok(trans);
        }
        public async Task<IHttpActionResult> PutAccount(Account account)
        {
            string badRequestDescription = "";

            if (account.Name == "" || account.Name == null)
            {
                badRequestDescription = "nameError";

                return Ok(badRequestDescription);
            }

            if (account.Balance == 0)
            {
                badRequestDescription = "balanceError";

                return Ok(badRequestDescription);
            }
            
            var user = db.Users.Find(User.Identity.GetUserId());

            //var existingAccount = db.Accounts.FirstOrDefault(a => a.Id == account.Id);

            var existingAccount = user.Household.Accounts.FirstOrDefault(a => a.Id == account.Id);

            if (account == null)
            {
                return Ok("You do not have permission to edit this account");
            }

            if (account.Balance != existingAccount.Balance)
            {
                decimal adjustmentAmount = account.Balance - existingAccount.Balance;

                Transaction trans = new Transaction()
                {
                    Description = "Manual Account Balance Adjustment",
                    Amount = adjustmentAmount,
                    Reconciled = adjustmentAmount,
                    Created = DateTimeOffset.Now,
                    AccountId = account.Id,
                    CategoryId = 5,
                    Settled = true
                };

                existingAccount.Balance = account.Balance;

                existingAccount.ReconciledBalance = account.Balance;

                db.Transactions.Add(trans);
            }

            if (account.Name != existingAccount.Name)
            {
                existingAccount.Name = account.Name;
            }
            /*
            if (account != null)
            {
                db.Entry(account).State = EntityState.Modified;
            }
            */
            await db.SaveChangesAsync();

            return Ok(account);
        }
        public async Task<IHttpActionResult> PostTransaction(Transaction trans)
        {
            string badRequestDescription = "";

            if (trans.Description == "" || trans.Description == null)
            {
                badRequestDescription = "descriptionError";

                return Ok(badRequestDescription);
            }
            else if (trans.Amount == 0)
            {
                badRequestDescription = "amountError";

                return Ok(badRequestDescription);
            }
            else if (trans.CategoryId == 0 || trans.CategoryId == null)
            {
                badRequestDescription = "categoryError";

                return Ok(badRequestDescription);
            }

            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }
            
            if (trans.Category != null)
            {
                db.Entry(trans.Category).State = trans.Category.Id == 0 ? EntityState.Added : EntityState.Unchanged;
            }

            if (!trans.IsIncome)
            {
                if (trans.Amount > 0)
                    trans.Amount *= -1;

                if (trans.Reconciled > 0)
                    trans.Reconciled *= -1;
            }
            else
            {
                if (trans.Amount < 0)
                    trans.Amount *= -1;

                if (trans.Reconciled < 0)
                    trans.Reconciled *= -1;
            }
                

            trans.Created = DateTimeOffset.Now;
            var account = db.Accounts.FirstOrDefault(a => a.Id == trans.AccountId);

            account.Balance = account.Balance + trans.Amount;

            if (Math.Abs(trans.Amount) == Math.Abs(trans.Reconciled))
            {
                trans.Settled = true;
            }

            account.ReconciledBalance += trans.Reconciled;
                
            if (trans.Category.Id != 0)
            {
                trans.CategoryId = trans.Category.Id;
            }

            db.Transactions.Add(trans);
            await db.SaveChangesAsync();

            return Ok(trans);
        }