from datetime import datetime
from turbogears.database import metadata, session
from turbogears import identity 
from turboentity import *


class Visit (Entity):
    class turboentity:
        tablename = "visit"
    
    visit_key = Column(String(40), primary_key=True)
    created = Column(DateTime, nullable=False, default=datetime.now)
    expiry = Column(DateTime)

    @classmethod
    def lookup_visit(cls, visit_key):
        return Visit.get(visit_key)


class VisitIdentity (Entity):
    class turboentity:
        tablename = "visit_identity"

    visit_key = Column(String(40), primary_key=True)
    user_id = Column(Integer, ForeignKey("tg_user.user_id"), index=True)


class Group (Entity):
    """
        An ultra-simple group definition.
    """
    
    class turboentity:
        tablename = "tg_group"
    
    group_id = Column(Integer, primary_key=True)
    group_name = Column(Unicode(16), unique=True)
    display_name = Column(Unicode(255))
    created = Column(DateTime, default=datetime.now)
    
    users = ManyToMany("User")
    permissions = ManyToMany("Permission")


class User (Entity):
    """
        Reasonably basic User definition. Probably
        would want additional attributes.
    """
    
    class turboentity:
        tablename = "tg_user"

    user_id = Column(Integer, primary_key=True)
    user_name = Column(Unicode(16), unique=True)
    email_address = Column(Unicode(255), unique=True)
    display_name = Column(Unicode(255))
    password = Column(Unicode(40))
    created = Column(DateTime, default=datetime.now)
    
    groups = ManyToMany("Group")

    @property
    def permissions(self):
        perms = set()
        for g in self.groups:
            perms = perms | set(g.permissions)
        return perms


class Permission (Entity):   
    class turboentity:
        tablename = "tg_permission"
    
    permission_id = Column(Integer, primary_key=True)
    permission_name = Column(Unicode(16), unique=True)
    description = Column(Unicode(255))

    groups = ManyToMany("Group")

