def digits_of(number):
    return [int(i) for i in str(number)]

def checksum_luhn(card_number):
	digits = digits_of(card_number)
	odd_digits = digits[-1::-2] # From right
	even_digits = digits[-2::-2] # From right
	total = sum(odd_digits)
	for digit in even_digits:
		total += sum(digits_of(2 * digit))
	return total % 10

def is_valid(card_number):
	return checksum_luhn(card_number) == 0

def main():
	choice = 'y'
	while choice == 'y' or choice == 'Y':
		try:
			card_number = input("\nEnter the credit card number: ")
			#TODO use reg-ex instead for pattern matching
			if is_valid(card_number) and 12 <= len(card_number) and len(card_number) <= 19:
				print("\nThis is a valid credit card number.")
				if card_number[0:1] == "4":
					print("Type: Visa card.")
				elif card_number[0:2] == "34" or card_number[0:2] == "37":
					print("Type: American Express (AMEX) card.")
				elif card_number[0:2] == "36":
					print("Type: Diner’s Club International card.")
				elif card_number[0:2] == "51" or card_number[0:2] == "52" or card_number[0:2] == "53" or card_number[0:2] == "54" or card_number[0:2] == "55":
					print("Type: Mastercard.")
				elif card_number[0:4] == "6011":
					print("Type: Discover card.")
			else:
				print("\nInvalid!! Credit card number.")

			choice = input("\nWant to check again? (y/n): ")
		except ValueError:
			print("\nErr! Credit card number should be numeric. Try again.")
		except:
			print("Unexpected error:", sys.exc_info()[0])
			raise

if __name__ == '__main__':
	main()