public List<TeeTime> GetReservedTeeTimesForMember(Member member)
		{
			return _context.TeeTimes
				.Where(teeTime => teeTime.Member.Id == member.Id)
				.Where(teeTime => teeTime.Start >= DateTime.Now)
				.OrderBy(teeTime => teeTime.Start)
				.ToList();
		}
		public async Task<bool> IsUserAsync(Member member)
		{
			var roles = await _userManager.GetRolesAsync(member);
			if (roles.Contains("user"))
			{
				return true;
			}

			return false;
		}
		public async Task EnsureSeedData()
		{
			if (!_context.GolfCourses.Any())
			{
				//seed data
				var clubBaist = new GolfCourse()
				{
					Name = "Club BAIST",
					TeeTimeInterval = new TimeSpan(hours: 0, minutes: 7, seconds: 30),
					MondayOpen = new DateTime(year: 1900, month: 1, day: 1, hour: 10, minute: 0, second: 0),
					MondayClose = new DateTime(year:1900, month: 1, day: 1, hour: 20, minute: 0, second: 0),
				};

				clubBaist.TuesdayOpen = clubBaist.WednesdayOpen = clubBaist.ThursdayOpen = clubBaist.FridayOpen = clubBaist.SaturdayOpen = clubBaist.SundayOpen = clubBaist.MondayOpen;
				clubBaist.TuesdayClose = clubBaist.WednesdayClose = clubBaist.ThursdayClose = clubBaist.FridayClose = clubBaist.SaturdayClose = clubBaist.SundayClose = clubBaist.MondayClose;

				clubBaist.Holes = new List<Hole>()
				{
					new Hole()
					{
						HoleNumber = 1,
						Par = 3,
						YardsWhite = 300,
						YardsBlue = 310,
						YardsRed = 320,
						GolfCourse = clubBaist
					},
					new Hole()
					{
						HoleNumber = 2,
						Par = 4,
						YardsWhite = 350,
						YardsBlue = 360,
						YardsRed = 370,
						GolfCourse = clubBaist
					},
					new Hole()
					{
						HoleNumber = 3,
						Par = 4,
						YardsWhite = 310,
						YardsBlue = 320,
						YardsRed = 330,
						GolfCourse = clubBaist
					},
					new Hole()
					{
						HoleNumber = 4,
						Par = 4,
						YardsWhite = 313,
						YardsBlue = 323,
						YardsRed = 333,
						GolfCourse = clubBaist
					},
					new Hole()
					{
						HoleNumber = 5,
						Par = 4,
						YardsWhite = 432,
						YardsBlue = 442,
						YardsRed = 452,
						GolfCourse = clubBaist
					},
					new Hole()
					{
						HoleNumber = 6,
						Par = 4,
						YardsWhite = 543,
						YardsBlue = 553,
						YardsRed = 563,
						GolfCourse = clubBaist
					},
					new Hole()
					{
						HoleNumber = 7,
						Par = 4,
						YardsWhite = 123,
						YardsBlue = 133,
						YardsRed = 134,
						GolfCourse = clubBaist
					},
					new Hole()
					{
						HoleNumber = 8,
						Par = 4,
						YardsWhite = 310,
						YardsBlue = 320,
						YardsRed = 330,
						GolfCourse = clubBaist
					},
					new Hole()
					{
						HoleNumber = 9,
						Par = 4,
						YardsWhite = 310,
						YardsBlue = 320,
						YardsRed = 330,
						GolfCourse = clubBaist
					},
					new Hole()
					{
						HoleNumber = 10,
						Par = 4,
						YardsWhite = 310,
						YardsBlue = 320,
						YardsRed = 330,
						GolfCourse = clubBaist
					},
					new Hole()
					{
						HoleNumber = 11,
						Par = 4,
						YardsWhite = 310,
						YardsBlue = 320,
						YardsRed = 330,
						GolfCourse = clubBaist
					},
					new Hole()
					{
						HoleNumber = 12,
						Par = 4,
						YardsWhite = 310,
						YardsBlue = 320,
						YardsRed = 330,
						GolfCourse = clubBaist
					},
					new Hole()
					{
						HoleNumber = 13,
						Par = 4,
						YardsWhite = 310,
						YardsBlue = 320,
						YardsRed = 330,
						GolfCourse = clubBaist
					},
					new Hole()
					{
						HoleNumber = 14,
						Par = 4,
						YardsWhite = 310,
						YardsBlue = 320,
						YardsRed = 330,
						GolfCourse = clubBaist
					},
					new Hole()
					{
						HoleNumber = 15,
						Par = 4,
						YardsWhite = 310,
						YardsBlue = 320,
						YardsRed = 330,
						GolfCourse = clubBaist
					},
					new Hole()
					{
						HoleNumber = 16,
						Par = 4,
						YardsWhite = 310,
						YardsBlue = 320,
						YardsRed = 330,
						GolfCourse = clubBaist
					},
					new Hole()
					{
						HoleNumber = 17,
						Par = 4,
						YardsWhite = 310,
						YardsBlue = 320,
						YardsRed = 330,
						GolfCourse = clubBaist
					},
					new Hole()
					{
						HoleNumber = 18,
						Par = 4,
						YardsWhite = 310,
						YardsBlue = 320,
						YardsRed = 330,
						GolfCourse = clubBaist
					}
				};

				_context.GolfCourses.Add(clubBaist);
				_context.Holes.AddRange(clubBaist.Holes);

				_context.SaveChanges();

				if (await _userManager.FindByEmailAsync("*****@*****.**") == null)
				{
					var member = new Member()
					{
						UserName = "******",
						Email = "*****@*****.**",
						GolfCourse = clubBaist,
					};

					var result = await _userManager.CreateAsync(member, "P@ssword1");       //yup...

					var admin = new Member()
					{
						UserName = "******",
						Email = "*****@*****.**",
						GolfCourse = clubBaist,
					};

					await _userManager.CreateAsync(admin, "Adm1nP@ss");

					if (!await _roleManager.RoleExistsAsync("admin"))
					{
						var adminRole = new IdentityRole("admin");
						await _roleManager.CreateAsync(adminRole);

						var userRole = new IdentityRole("user");
						await _roleManager.CreateAsync(userRole);

						await _userManager.AddToRoleAsync(member, "user");
						await _userManager.AddToRoleAsync(admin, "admin");
					}
				}
			}
		}
		public List<TeeTime> GetTeeTimesWithScore(Member member)
		{
			return _context.TeeTimes
				.Where(teeTime => teeTime.Member.Id == member.Id)
				.Where(teeTime =>
					_context.Scores.Where(score => score.TeeTime.Start == teeTime.Start).Count() != 0)
				.OrderBy(teeTime => teeTime.Start)
				.ToList();
		}
		public async Task<IActionResult> ViewMember(Member member)
		{
			string email;

			if (member == null || string.IsNullOrEmpty(member.Email))
			{
				//TODO: Figure out how to default to the current user.
				email = "*****@*****.**";
			}
			else
			{
				email = member.Email;
			}

			member = await _userManager.FindByEmailAsync(email);
			
			var memberVM = Mapper.Map<MemberViewModel>(member);

			return View(memberVM);
		}