import getpass # hides types characters, very useful
import json
import sys
import hashlib # library for hashing

def get_credentials():
    username = input('Enter your username: ')
    password = getpass.getpass('Enter your password: ')
    return (username, password)

def authenticate(username, password, pwdb):
    return pwhash(password) == pwdb[username]

def add_user(username, pwdb):
    pwdb[username] = pwhash(getpass.getpass(f'Enter password for {username}: '))
    return pwdb

def read_pwdb(pwdb_path):
    try:
        pwdb_file = open(pwdb_path, 'rt')
        pwdb = json.load(pwdb_file)
    except Exception:
        pwdb = {}
    return pwdb

def write_pwdb(pwdb, pwdb_path):
    pwdb_file = open(pwdb_path, 'wt')
    json.dump(pwdb, pwdb_file)

def pwhash(password): 
	# encodes password with sha256 
	return hashlib.sha256(password.encode()).hexdigest()
	
	
	
pwdb_path = 'pwdb.json'
pwdb = read_pwdb(pwdb_path)

if len(sys.argv) > 1:
    pwdb = add_user(sys.argv[1], pwdb)
    write_pwdb(pwdb, pwdb_path)
else:
    username, password = get_credentials()
    if username not in pwdb or not authenticate(username, password, pwdb):
        print('Wrong username or password!')
    else:
        print('Successfully authenticated!')
