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

def create_hash(password):
    m = hashlib.sha256(password.encode('utf-8'))
    pw_hex = m.hexdigest()
    return pw_hex

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

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

def add_user(username, pwdb):
    pwdb[username] = create_hash(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)

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!')
