# -*- coding: utf-8 -*-
import os
areas=['Est','Ofi','DP','Adm','Emb']
tipo_oco=['Email','Aviso','Irregularidade']
def checkInbox(form): 
 
    session.avisa=True
    #mail.send(to='antonio.ramos@cires.pt',subject='new user',message='new user email is %s'%form.vars.email)   

def getempreiteiroid():
    if auth.is_logged_in():
        temp=db(db.auth_user.id==auth.user_id).select().first()         
        temp=temp.empresa    
    else:
        temp=0
    return auth.user_id 


#db = DAL('sqlite://sqlite.storage')
#
db = DAL('mysql://admin:xxxx@cires.c22xvphrpqix.eu-west-1.rds.amazonaws.com:3306/empre')

T.force('pt')
## by default give a view/generic.extension to all actions from localhost
## none otherwise. a pattern can be 'controller/function.extension'
response.generic_patterns = ['*'] #if request.is_local else []

from gluon.tools import Auth, Crud, Service, PluginManager, prettydate
auth = Auth(db, hmac_key=Auth.get_or_create_key())
crud, service, plugins = Crud(db), Service(), PluginManager()
#auth.settings.register_onaccept.append(lambda form:   mail.send(to='antonio.ramos@cires.pt',subject='new user',message='new user email is %s'%form.vars.email))

#################### EMPRESA  #####################################################
auth.settings.extra_fields['auth_user']= [
    Field('empresa','string', required=True,label='Empresa'),
    Field('email','string', required=True,label='Email'),
    Field('telefone','string',label='Telefone'),
    Field('alvara','upload',autodelete=True,label='Alvará',uploadfolder=os.path.join(request.folder,'uploads')),
    Field('alvaraval','date', required=True,label='Validade do Alvará'),
    Field('segrespcivil','upload', autodelete=True,required=True,label='Seguro de responsabilidade civil',uploadfolder=os.path.join(request.folder,'uploads')),
    Field('segrespcivilval','date', required=True,label='Validade do Seg. resp. civil'),
    Field('segactrab','upload', autodelete=True,required=True,label='Seguro Acidentes de trabalho',uploadfolder=os.path.join(request.folder,'uploads')),
    Field('segactrabval','date', required=True,label='Validade do Seg. acid. trab.'),
    Field('obs','text',label='Observações'),
   Field('confirm_agreement', 'boolean',default=False, requires=IS_NOT_EMPTY(error_message="Por favor aceite o acordo de utilização"),label='Li e aceito o Acordo de Utilização')    
    ]
#requires
#db.auth_user.empresa.requires=IS_NOT_EMPTY(error_message=e_m['empresa'])

##################################################################################
auth.define_tables()
# quando login ...> auth.settings.login_onaccept = lambda form: mail.send(to="antonio.ramos@cires.pt", subject="%(first_name)s logged in" % form.vars, message="User logged in %s" % str(form.vars.email))
auth.settings.verify_email_onaccept = lambda form: mail.send(to='antonio.ramos@cires.pt',subject='Conta pendente de Aprovação. Portal da Empresa Externa',message="Por favor aprove a conta da empresa: "+repr(form.empresa))

db.auth_user.email.requires=IS_EMAIL(error_message="Por favor indique um email valido")
db.auth_user.alvara.requires=IS_NOT_EMPTY(error_message="Por favor anexe o Alvará")
db.auth_user.empresa.requires=IS_NOT_EMPTY(error_message="Por favor indique a Empresa")
db.auth_user.alvaraval.requires=requires=[IS_NOT_EMPTY(error_message=e_m['alvara']),IS_DATE(format=T('%Y/%m/%d'))]
db.auth_user.email.requires=IS_EMAIL(error_message=e_m['email'])
db.auth_user.segrespcivil.requires=IS_NOT_EMPTY(error_message=e_m['respcivil'])
db.auth_user.segrespcivilval.requires=[IS_NOT_EMPTY(error_message=e_m['respcivilval']),IS_DATE(format=T('%Y/%m/%d'))]
db.auth_user.segactrab.requires=requires=IS_NOT_EMPTY(error_message=e_m['actrab'])
db.auth_user.segactrabval.requires=[IS_NOT_EMPTY(error_message=e_m['actrabval']),IS_DATE(format=T('%Y/%m/%d'))]
db.auth_user._format = '%(empresa)s'

#db.auth_user.format='%(first_name)s'
## configure email
mail = auth.settings.mailer
mail.settings.server = '194.65.91.157:25'
mail.settings.sender = "Portal da Empresa Externa <antonio.ramos@cires.pt>"
mail.settings.tls = False
mail.settings.login = None

auth.settings.registration_requires_verification = True
auth.settings.registration_requires_approval = True
auth.settings.reset_password_requires_verification = True
auth.settings.register_onaccept=checkInbox
#auth.settings.login_after_registration = True
auth.settings.create_user_groups = False
#################### TRABALHADOR  #####################################################
db.define_table('trabalhador',
    Field('empresa',db.auth_user,readable=True,writable=False,label="Empresa",default=getempreiteiroid),
    Field('nome','string',label="Nome do Trabalhador",required=True),
    Field('foto','upload',autodelete=True,label="Foto"),
    Field('bi','string',label="BI",required=True),
    Field('ncart','string',label="Número do cartão",required=True),
    Field('ncartval','date',label="Validade do cartão",required=True,notnull=True),
    Field('apt_medica','upload',autodelete=True,required=True,uploadfolder=os.path.join(request.folder,'uploads'),label='Ficha de aptidão médica'),
    Field('apt_medicaval','date',label='Validade da aptidão médica',required=True,notnull=True),
    Field('val_formacao','date',label='Validade da formação'),
    Field('rfid','string',default="",label="RFID"),
    Field('area','string'),
    Field('obs','text',label="Obs."),
    format='%(nome)s'
)
# -requires
db.trabalhador.bi.requires=[IS_NOT_EMPTY(error_message="Por favor indique o BI")]
db.trabalhador.ncart.requires=[IS_NOT_EMPTY(error_message="Por favor indique o número do cartão")]
db.trabalhador.val_formacao.requires=IS_EMPTY_OR(IS_DATE(format=T('%Y/%m/%d'), error_message=T("Formato pretendido aaa/mm/dd")))
db.trabalhador.area.requires=IS_IN_SET(areas)
db.trabalhador.empresa.requires=IS_IN_DB(db, 'auth_user.id','auth_user.empresa',error_message=e_m['not_in_db'])
db.trabalhador.nome.requires=[IS_NOT_EMPTY(error_message="Por favor escreva o nome completo")]
db.trabalhador.ncartval.requires=[IS_NOT_EMPTY(error_message="Por favor indique a validade do cartão"),IS_DATE(format=T('%Y/%m/%d'), error_message=T("Formato pretendido aaaa/mm/dd"))]
db.trabalhador.apt_medica.requires=[IS_NOT_EMPTY(error_message="Por favor anexe a aptidão médica")]
db.trabalhador.apt_medicaval.requires=[IS_NOT_EMPTY(error_message="Por favor indique a validade da aptidão médica"),IS_DATE(format=T('%Y/%m/%d'), error_message=T("Formato pretendido aaa/mm/dd"))]
db.trabalhador.rfid.requires=IS_LENGTH(11)
db.trabalhador.nome.requires=IS_NOT_IN_DB(db,'trabalhador.nome')

######################################################################################


#,requires = [IS_IMAGE(maxsize=(400,400),error_message="Escolha imagem com tamanho<=200x200"),IS_LENGTH(1048576, 1024)]

#################### VALIDADES  #####################################################
db.define_table('validades',
    Field('empresa',db.auth_user,unique=True),
    Field('descricao',compute=lambda row: db.auth_user[row.empresa]['empresa']),
    Field('validade','date', required=True,label='Validade da informação apresentada'))
# -requires
db.validades.empresa.requires=IS_IN_DB(db, 'auth_user.id','auth_user.empresa',error_message=e_m['not_in_db'])
db.validades.validade.requires=[IS_DATE(format=T('%Y/%m/%d'),error_message=T("Formato pretendido aaa/mm/dd"))]
#################### ALERTAS  #########################################################
db.define_table('alertlog',
    Field('data','datetime'),
    Field('descricao','string')
    )
######################################################################################
#################### T_DOCS  #########################################################
db.define_table('t_docs',
        Field('f_trab_ref', db.trabalhador, notnull=True, writable=False, readable=False),
        Field('f_titulo', type='string', label=T('Categoria'), notnull=False), # notnull=False is required
        Field('f_doc', type='upload', autodelete=True,notnull=False, # notnull=False is required
                label=T('Documentos'),
                represent=lambda x, row:x and A('%s'%(db.t_docs.f_doc.retrieve(x)[0]),
                                                _href=URL('default','viewer.html',args=x),
                                                _target="_blank",
                                                _title=T("open file"),
                                                _class='file-reference')
                                            or ''),
    )
######################################################################################
#################### E_DOCS  #########################################################
db.define_table('e_docs',
        Field('f_emp_ref', db.auth_user, notnull=True, writable=False, readable=False),
        Field('f_titulo', type='string', label=T('Categoria'), notnull=False), # notnull=False is required
        Field('f_doc', type='upload', autodelete=True,notnull=False, # notnull=False is required
                label=T('Documentos'),
                represent=lambda x, row:x and A('%s'%(db.e_docs.f_doc.retrieve(x)[0]),
                                                _href=URL('default','viewer.html',args=x),
                                                _target="_blank",
                                                _title=T("open file"),
                                                _class='file-reference')
                                            or ''),
    )

######################################################################################
#,represent=lambda id,row:db.auth_user(row.id)['empresa']
#Formação segurança
#Passaporte segurança
#Condução empilhadores
#Documento entrega EPI (S/N)
#Observações
######################################################################################
#################### CARD_LOGs########################################################
db.define_table('card_logs',
    Field('trabalhador',db.trabalhador),
    Field('checked_when','datetime',label='data',default=request.now),
    Field('stat',default='success')
    )
db.card_logs.trabalhador.requires=IS_IN_DB(db, db.trabalhador.id,'%(nome)s',error_message='O trabalhador não é válido')

######################################################################################
#################### OCO  ############################################################
db.define_table('oco',
    Field('rel_trab','list:reference trabalhador',label='Trabalhador'),
    Field('rel_auth',db.auth_user,label="Empresa"),
    Field('tipo'),
    Field('title',label="Titulo"),
    Field('body','text',label="Descrição"),
    Field('created_on', 'date', required=True,label='Data'),
    
    )
db.oco.created_on.requires=[IS_DATE(format=T('%Y/%m/%d'), error_message=T("Formato pretendido aaaa/mm/dd"))]
db.oco.rel_trab.requires=IS_EMPTY_OR(IS_IN_DB(db, db.trabalhador.id,'%(nome)s',error_message='O trabalhador não é válido',multiple=True))
db.oco.rel_auth.requires=IS_EMPTY_OR(IS_IN_DB(db, db.auth_user.id,'%(empresa)s',error_message='A empresa não é válida'))   
db.oco.tipo.requires=IS_IN_SET(tipo_oco,error_message="Por favor escolha uma das opções")
db.oco.body.requires=IS_NOT_EMPTY(error_message="Por favor indique o sucedido")


######################################################################################
#################### EQUIP  ##########################################################
db.define_table('equip',
    Field('empresa',db.auth_user,default=auth.user_id,writable=False),
    Field('nome_mod_ns',label="Nome/ Modelo / nº série"),
    Field('manobrador',db.trabalhador),
    Field('cert_apt_man','date',label="Cert. de aptidão do manobrador"),
    Field('cert_apt_man_files','upload',label="Cert. apt. manobrador - anexos",uploadfolder=os.path.join(request.folder,'uploads')),
    Field('cert_conf_ce','date',label="Cert. de conf. CE do equipamento"),
    Field('cert_conf_ce_files','upload',label="Cert. conf. - anexos",uploadfolder=os.path.join(request.folder,'uploads')),
    Field('insp','date',label="Inspecção ao equipamento"),
    Field('insp_files','upload',label="Insp. equip - anexos",uploadfolder=os.path.join(request.folder,'uploads')),
    Field('diag_carg_grua_files','upload',label="Diagrama de cargas da grua"),
    Field('ver_maq_ferr','upload',label="Verificação de máquinas e ferramentas",uploadfolder=os.path.join(request.folder,'uploads')),
    Field('obs','text',label="Observações")
    )
# db.equip.created_on.requires=[IS_DATE(format=T('%Y/%m/%d'), error_message=T("Formato pretendido aaaa/mm/dd"))]
# db.equip.rel_trab.requires=IS_EMPTY_OR(IS_IN_DB(db, db.trabalhador.id,'%(nome)s',error_message='O trabalhador não é válido',multiple=True))
# db.equip.rel_auth.requires=IS_EMPTY_OR(IS_IN_DB(db, db.auth_user.id,'%(empresa)s',error_message='A empresa não é válida'))   
# db.equip.tipo.requires=IS_IN_SET(tipo_oco,error_message="Por favor escolha uma das opções")
# db.equip.body.requires=IS_NOT_EMPTY(error_message="Por favor indique o sucedido")
######################################################################################
#################### Equip_DOCS  #####################################################
db.define_table('equip_docs',
        Field('f_equip_ref', db.equip, notnull=True, writable=False, readable=False),
        Field('f_titulo', type='string', label=T('Categoria'), notnull=False), # notnull=False is required
        Field('f_doc', type='upload', autodelete=True,notnull=False, # notnull=False is required
                label=T('Documentos'),
                represent=lambda x, row:x and A('%s'%(db.equip_docs.f_doc.retrieve(x)[0]),
                                                _href=URL('default','viewer.html',args=x),
                                                _target="_blank",
                                                _title=T("open file"),
                                                _class='file-reference')
                                            or ''),
    )
