import os, yaml
from passlib.hash import pbkdf2_sha256


class usermgr:
    def __init__(self):
        if not os.path.exists("db"):
            os.makedirs("db")
        self.srcdir = "db"

    def write_user(self, uid, obj):
        with open(self.srcdir + os.sep + uid, "w") as f:
            f.write(yaml.dump(obj))

    def get_user(self, uid):
        if self.check_user_exists(uid):
            with open(self.srcdir + os.sep + uid) as f:
                obj = yaml.safe_load(f)
            return obj
        else:
            return {"message": "not found"}

    def check_user_exists(self, uid):
        if uid == "" or uid is None:
            return False
        if os.path.exists(self.srcdir + os.sep + uid):
            return True
        return False

    def auth_user(self, uid, attempt):
        if self.check_user_exists(uid):
            phash = self.get_user(uid)["passw"]
            if pbkdf2_sha256.verify(attempt, phash):
                return True
        return False

    def make_user(self, uid, passw):
        obj = {"passw": pbkdf2_sha256.hash(passw)}
        self.write_user(uid, obj)

    def set_user_password(self, uid, newpass):
        if self.check_user_exists(uid):
            obj = self.get_user(uid)
            hashed_pw = pbkdf2_sha256.hash(newpass)
            obj["passw"] = hashed_pw
            self.write_user(uid, obj)
            return {"message": "done."}
        else:
            return {"message": f"error: no such user {uid}"}

    def set_user_prop(self, uid, key, val):
        if self.check_user_exists(uid):
            obj = self.get_user(uid)
            obj[key] = val
            self.write_user(uid, obj)
            return {"message": "done"}
        else:
            return {"message": f"error: no such user {uid}"}

    def dump_users(self):
        return os.listdir(self.srcdir)
