import random
import base64
from hashlib import blake2b

db.define_table(
    'Room',
    Field('code', 'string', notnull=True, unique=True),
    Field('hashcode', 'string', notnull=True),
    Field('player_max', 'integer', notnull=True),
    Field('creation', 'datetime', default=request.now, notnull=True),
    Field('heartbeat', 'datetime', default=request.now, notnull=True),
    Field('started', 'boolean', default=False),
    Field('roles', 'string', default=base64.standard_b64encode(b'{}'), notnull=True),
    Field('closed', 'boolean', default=False)
)

def generateRoomCode():
    code = None

    while not code or db((db.Room.code == code) & (db.Room.closed == False)).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():
    digest = blake2b(digest_size=32)
    digest.update(str(request.now).encode("utf-8"))
    digest.update(str(random.random()).encode("utf-8"))
    return (digest.hexdigest())

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