from gluon import current
from gluon.dal import Field
from gluon.settings import settings
from gluon.tools import Auth
from gluon.validators import IS_IN_DB, IS_NOT_EMPTY, CRYPT, IS_NOT_IN_DB, \
    IS_EMAIL

def init_auth(db):
    T = current.T
    
    request = current.request
    auth = Auth(db, hmac_key=Auth.get_or_create_key())
    current.auth = auth
    
    db.define_table('auth_user',
        Field('username', 
              type='string',
              label=T('Username')
              ),
        Field('first_name', 
              type='string',
              label=T('First Name')
              ),
        Field('last_name', 
              type='string',
              label=T('Last Name')
              ),
        Field('email', 
              type='string',
              label=T('Email')
              ),
        Field('password', 
              type='password',
              readable=False,
              label=T('Password')
              ),
        Field('created_on', 
              type='datetime',
              default=request.now,
              label=T('Created On'),
              writable=False,
              readable=False
              ),
        Field('modified_on', 
              type='datetime', 
              default=request.now,
              label=T('Modified On'), 
              writable=False, 
              readable=False,
              update=request.now
              ),
        Field('registration_key', 
              default='',
              writable=False, 
              readable=False
              ),
        Field('reset_password_key', 
              default='',
              writable=False, 
              readable=False
              ),
        Field('registration_id', 
              default='',
              writable=False, 
              readable=False 
              ),
        Field('company', 
              type='reference company',
              label=T('Company')
              ),
        format='%(username)s')
    
    
    db.auth_user.first_name.requires = IS_NOT_EMPTY(error_message=auth.messages.is_empty)
    db.auth_user.last_name.requires = IS_NOT_EMPTY(error_message=auth.messages.is_empty)
    db.auth_user.password.requires = CRYPT(key=auth.settings.hmac_key)
    db.auth_user.username.requires = IS_NOT_IN_DB(db, db.auth_user.username)
    db.auth_user.email.requires = (IS_EMAIL(error_message=auth.messages.invalid_email),
                                   IS_NOT_IN_DB(db, db.auth_user.email))
    db.auth_user.company.requires=IS_IN_DB(db,'company.id', '%(name)s')
    auth.define_tables(migrate = settings.migrate)
    
    ## configure auth policy
    auth.settings.actions_disabled.append('register')
    auth.settings.registration_requires_verification = False
    auth.settings.registration_requires_approval = False
    auth.settings.reset_password_requires_verification = True
    auth.settings.create_user_groups = True
    
    auth.settings.long_expiration = 3600*24*30 # one month
    auth.settings.remember_me_form = True
    auth.settings.formstyle = "ul"
    
    ## configure email
    #mail=auth.settings.mailer
    #mail.settings.server = 'logging' or 'smtp.gmail.com:587'
    #mail.settings.sender = 'you@gmail.com'
    #mail.settings.login = 'username:password'
    #
    #from gluon.contrib.login_methods.rpx_account import use_janrain
    #use_janrain(auth,filename='private/janrain.key')
    #
    #mail.settings.server = settings.email_server
    #mail.settings.sender = settings.email_sender
    #mail.settings.login = settings.email_login
    return auth