import random
from hashlib import blake2b

db.define_table(
    'Room',
    Field('code', 'string', notnull=True, requires=IS_NOT_EMPTY(), writable=False, unique=True),
    Field('hashcode', 'string', notnull=True, requires=IS_NOT_EMPTY(), writable=False),
    Field('player_max', 'integer', notnull=True, requires=IS_NOT_EMPTY()),
    Field('creation', 'datetime', default=request.now, notnull=True, requires=IS_NOT_EMPTY()),
    Field('heartbeat', 'datetime', default=request.now, notnull=True, requires=IS_NOT_EMPTY())
)

def generateRoomCode(_record):
    code = None

    while not code or db(db.Room.code == code).count() > 0:
        code = ""
        for i in range(4):
            # Removed characters which could be confused like 0 and O
            code = code + random.choice("346789ABCDEFGHJKLMNPQRTUVWXY")

    return(code)

def generateHashCode(_record):
    code = ""
    digest = blake2b(digest_size=32)
    digest.update(_record.code.encode("utf-8"))
    digest.update(str(_record.player_max).encode("utf-8"))
    digest.update(str(_record.creation).encode("utf-8"))
    digest.update(str(random.random()).encode("utf-8"))
    return (digest.hexdigest())

db.Room.code.compute = generateRoomCode
db.Room.hashcode.compute = generateHashCode