import { IsString } from 'class-validator';
import { NotAcceptableError, NotFoundError } from 'routing-controllers';


/**
 * Error to throw when no username or email is set.
 * We somehow need to identify you on login.
 */
export class UsernameOrEmailNeededError extends NotFoundError {
	@IsString()
	name = "UsernameOrEmailNeededError"

	@IsString()
	message = "No username or email is set!"
}

/**
 * Error to throw when no username contains illegal characters.
 * Right now the only one is "@" but this could change in the future.
 */
export class UsernameContainsIllegalCharacterError extends NotAcceptableError {
	@IsString()
	name = "UsernameContainsIllegalCharacterError"

	@IsString()
	message = "The provided username contains illegal characters! \n Right now the following characters are considered illegal: '@'"
}

/**
 * Error to throw when no email is set.
 * We somehow need to identify you :)
 */
export class UserEmailNeededError extends NotFoundError {
	@IsString()
	name = "UserEmailNeededError"

	@IsString()
	message = "No email is set! \n You have to provide email addresses for users (used for password reset among others)."
}

/**
 * Error to throw when a user couldn't be found.
 */
export class UserNotFoundError extends NotFoundError {
	@IsString()
	name = "UserNotFoundError"

	@IsString()
	message = "User not found!"
}

/**
 * Error to throw when two users' ids don't match.
 * Usually occurs when a user tries to change a user's id.
 */
export class UserIdsNotMatchingError extends NotAcceptableError {
	@IsString()
	name = "UserIdsNotMatchingError"

	@IsString()
	message = "The ids don't match!! \n And if you wanted to change a user's id: This isn't allowed!"
}

/**
 * Error to throw when two users' ids don't match.
 * Usually occurs when a user tries to change a user's id.
 */
export class UserDeletionNotConfirmedError extends NotAcceptableError {
	@IsString()
	name = "UserDeletionNotConfirmedError"

	@IsString()
	message = "You are trying to delete a user! \n If you're sure about doing this: provide the ?force=true query param."
}

export class PasswordMustContainUppercaseLetterError extends NotAcceptableError {
	@IsString()
	name = "PasswordMustContainUppercaseLetterError"

	@IsString()
	message = "Passwords must contain at least one uppercase letter."
}
export class PasswordMustContainLowercaseLetterError extends NotAcceptableError {
	@IsString()
	name = "PasswordMustContainLowercaseLetterError"

	@IsString()
	message = "Passwords must contain at least one lowercase letter."
}
export class PasswordMustContainNumberError extends NotAcceptableError {
	@IsString()
	name = "PasswordMustContainNumberError"

	@IsString()
	message = "Passwords must contain at least one number."
}
export class PasswordTooShortError extends NotAcceptableError {
	@IsString()
	name = "PasswordTooShortError"

	@IsString()
	message = "Passwords must be at least ten characters long."
}