/// <summary>
		/// Updates an existing rental agreement.
		/// </summary>
		/// <param name="theRentalAgreement">The modified rental agreement</param>
		/// <exception cref="InvalidPermissionsException">InvalidPermissionsException will be thrown 
		/// if the user attempting to modify the rental agreement is not an employee</exception>
		/// <returns></returns>
		public RentalAgreement UpdateRentalAgreement(RentalAgreement theRentalAgreement)
		{
			var aUser = _userRepository.GetUser(theRentalAgreement.EmployeeId);

			if (!aUser.IsEmployee)
				throw new InvalidPermissionsException(
					$"The user {aUser.LastName}, {aUser.FirstName} is not an employee and cannot modify a rental agreement");

			_rentalAgreementRepository.UpdateRentalAgreement(theRentalAgreement);

			return GetRentalAgreement(theRentalAgreement.Id);
		}
		/// <summary>
		/// Saves a new rental agreement.
		/// </summary>
		/// <exception cref="InvalidRentalAgreementException">Will throw InvalidRentalAgreementException if there is a validation error</exception>
		/// <param name="theRentalAgreement">The rental agreement to save</param>
		/// <returns>The id of the rental agreement (maybe change to rental agreement with id?)</returns>
		public int AddRentalAgreement(RentalAgreement theRentalAgreement)
		{
			var aCustomer = _customerRepository.GetCustomer(theRentalAgreement.Customer);

			if (!aCustomer.AllowsAdditionalDrivers && theRentalAgreement.AdditionalDrivers.Any())
				throw new InvalidRentalAgreementException("No additional drivers are allowed", theRentalAgreement);

			if (!aCustomer.AllowsAdditions && theRentalAgreement.Additions.Any())
				throw new InvalidRentalAgreementException("No additions are allowed", theRentalAgreement);

			var aTimeSpan = theRentalAgreement.InDate.Subtract(theRentalAgreement.OutDate).Days;
			if (aCustomer.HasMaxRentalDays && aTimeSpan > aCustomer.MaxRentalDays)
				throw new InvalidRentalAgreementException("Rental agreement exceed the maximum number of rental days allowed for this customer", theRentalAgreement);

			return _rentalAgreementRepository.AddRentalAgreement(theRentalAgreement);
		}
		public async Task<RentalAgreement> UpdateRentalAgreementAsync(RentalAgreement theRentalAgreement)
		{
			var aUser = await _userRepository.GetUserAsync(theRentalAgreement.EmployeeId);

			if (!aUser.IsEmployee)
				throw new InvalidPermissionsException(
					$"The user {aUser.LastName}, {aUser.FirstName} is not an employee and cannot modify a rental agreement");

			await _rentalAgreementRepository.UpdateRentalAgreementAsync(theRentalAgreement);

			return await GetRentalAgreementAsync(theRentalAgreement.Id);
		}
		public async Task<int> AddRentalAgreementAsync(RentalAgreement theRentalAgreement)
		{
			return await _rentalAgreementRepository.AddRentalAgreementAsync(theRentalAgreement);
		}
		public void AddValidRentalAgreementTest()
		{
			var aRentalAgreement = new RentalAgreement
			{
				AdditionalDrivers = new List<int> { 1, 2, 3, 4, 5 },
				Additions = new List<string> { "gps", "baby seat" },
				Automobile = 1,
				Customer = PassingCustomerId,
				EmployeeId = 1,
				InDate = DateTime.Now.AddDays(2),
				Location = 1,
				OutDate = DateTime.Now,
				Renter = 1,
				Status = "Reservation"
			};

			var aAgreementNumber = _service.AddRentalAgreement(aRentalAgreement);

			Assert.Equal(RentalAgreementId, aAgreementNumber);
		}
		public async Task DeleteRentalAgreementAsync(RentalAgreement theRentalAgreement)
		{
			await _rentalAgreementRepository.DeleteRentalAgreementAsync(theRentalAgreement);
		}
		public void UpdateRentalAgreementPassingTest()
		{
			var aRentalAgreement = new RentalAgreement
			{
				AdditionalDrivers = new List<int> { 1, 2, 3, 4, 5 },
				Additions = new List<string> { "gps", "baby seat" },
				Automobile = 1,
				Customer = PassingCustomerId,
				EmployeeId = EmployeeUser,
				InDate = DateTime.Now.AddDays(2),
				Location = 1,
				OutDate = DateTime.Now,
				Renter = 1,
				Status = "Reservation"
			};

			_service.UpdateRentalAgreement(aRentalAgreement);
		}
		public void UpdateRentalAgreementInvalidPermissionsTest()
		{
			var aRentalAgreement = new RentalAgreement
			{
				AdditionalDrivers = new List<int> { 1, 2, 3, 4, 5 },
				Additions = new List<string> { "gps", "baby seat" },
				Automobile = 1,
				Customer = PassingCustomerId,
				EmployeeId = NonEmployeeUser,
				InDate = DateTime.Now.AddDays(2),
				Location = 1,
				OutDate = DateTime.Now,
				Renter = 1,
				Status = "Reservation"
			};

			Assert.Throws<InvalidPermissionsException>(() => _service.UpdateRentalAgreement(aRentalAgreement));
		}
		public async Task UpdateRentalAgreementAsync(RentalAgreement theRentalAgreement)
		{
			await ConnectionAsync.UpdateAsync(theRentalAgreement);
		}
		public async Task DeleteRentalAgreementAsync(RentalAgreement theRentalAgreement)
		{
			await ConnectionAsync.DeleteAsync(theRentalAgreement);
		}
		public async Task<int> AddRentalAgreementAsync(RentalAgreement theRentalAgreement)
		{
			return await ConnectionAsync.InsertAsync(theRentalAgreement);
		}
		public void DeleteRentalAgreement(RentalAgreement theRentalAgreement)
		{
			Connection.Delete<RentalAgreementDTO>(theRentalAgreement.Id);
		}
		public void UpdateRentalAgreement(RentalAgreement theRentalAgreement)
		{
			Connection.Update(theRentalAgreement.ToDTO());
		}
		public int AddRentalAgreement(RentalAgreement theRentalAgreement)
		{
			return Connection.Insert(theRentalAgreement.ToDTO());
		}
		public InvalidRentalAgreementException(string theMessage, RentalAgreement theRentalAgreement) : base(theMessage)
		{
			RentalAgreement = theRentalAgreement;
		}