from gluon.tools import Mail
response.title = "Viikkotehtävät"

@auth.requires_login()
def index(): 
   response.title = "Täydennä henkilötietosi"
   record = db.auth_user(auth.user.id) 
   # pyytää täydentämään henkilötiedot jos ne ovat vajaat
   if ( record.first_name == "" or record.last_name == "" or ( record.first_name == record.last_name ) ):
     form = SQLFORM(db.auth_user, record, fields = ['first_name', 'last_name'], showid=False)
     if str(form.vars.first_name).strip() != "" and str(form.vars.last_name).strip() != "" and form.process().accepted:
        return redirect(URL('palauta'))
     elif form.errors:
        response.flash = 'Lomakkeessa on virheitä'
     else:
        response.flash = 'Täytä lomake'
     return dict(form=form)
  
   return redirect(URL('palauta'))

def user(): 
  return dict(form=auth())

def kiitos(): 
  return dict(form="kiitos")
  
def arviointi(): 
  return dict(form="arviointi")
  

@auth.requires_login()
def palauta():
   record = db.auth_user(auth.user.id) 
   # tarkistetaan vielä jos nimitietoja ei ole syötetty ja ohjataan index-sivulle jos on puutteita
   if ( record.first_name.strip() == "" or record.last_name.strip() == ""):
     return redirect(URL('index'))
   if ( record.first_name == record.last_name  ):
     return redirect(URL('index'))

   response.title = "Palauta viikkotehtävä"
   # kellonaika tietokannalle sopivassa muodossa 
   aika = datetime.datetime.fromtimestamp(time.time()+3*60*60).strftime('%Y-%m-%d %H:%M:%S') 
   # haetaan viikot joiden deadline on myöhemmin kuin kellonaika, järjestetään kunkin viikon takarajan perusteella ja
   # otetaan näin saaduista viikoista ensimmäinen (.first())
   vt = db( db.viikko.deadline > aika).select(orderby=db.viikko.deadline).first() 
   # haetaan jos tehtävä olisi palautettu jo aiemmin eli viimeinen 
   # kirjautuneena olevan käyttäjän palauttama tehtävä, joka on halutulta viikolta
   # kysely palauttaa oikeasti vain yhden tuloksen mutta tietorakenne on kuitenkin lista niin pitää pyytää .last()
   # jotta saadaan vain se yksi kappale
   tehtava = db( (db.tehtava.palauttaja == auth.user.id) & (db.tehtava.vt == vt)).select(orderby=db.tehtava.palautusaika).last() 
   update = False
   # jos tehtävä löytyi niin näytetään lomake päivitysmoodissa ja muussa tapauksessa lisäysmoodissa
   if ( tehtava ):
     form = SQLFORM(db.tehtava, tehtava, showid=False)
     update = True
   else:
     form = SQLFORM(db.tehtava)

   # tarkistetaan lomakkeen tiedot, jos ok niin syötetään uusi tai päivitetään vanha 
   if form.validate():
     # lisätään lomakkeelta tulleiden muuttujien joukkoon viikkotehtävän numero, käyttäjän tunniste ja palautusaika
     # näitähän ei kysytty lomakkeella mutta tarvitaan kuitenkin, että lisääminen onnistuu
     form.vars.vt = vt
     form.vars.palauttaja = auth.user.id
     form.vars.palautusaika = datetime.datetime.fromtimestamp(time.time()+3*60*60).strftime('%Y-%m-%d %H:%M:%S')
     # tehdään varsinainen päivitys tai lisäys tietokantaan. Jos ehtojen mukaista tietuetta ei löydy niin syötetään uusi
     # lomakkeella olevan tietojen pohjalta. Jos löytyy niin silloin tehdään päivitys
     # Tässä olisi voinut hyödyntää myös ylempänä jo haettua tehtävää ja toteuttaa ihan eri tavalla
     db.tehtava.update_or_insert((db.tehtava.vt==form.vars.vt)&(db.tehtava.palauttaja==form.vars.palauttaja),**dict(form.vars))

     # lähetetään myös sähköposti. App Engine antaa lähettää 100 sähköpostiviestiä päivässä
     user = db.auth_user(auth.user.id)
     mail = Mail()
     mail.settings.server = 'gae'
     try:
       onnistui = mail.send(to=[user.first_name + " " + user.last_name + " <" + user.email + ">"],
          subject='TIEA218 Viikkotehtävä ' + str(vt.viikko), 
		  sender="hazorus@gmail.com",
		  bcc="hazorus@gmail.com",
          message="Palautit viikkotehtävän: " + str(vt.viikko) + "\n" +
            "Palautusaika: " + str(form.vars.palautusaika) + "\n" +
		    "Taso: " + str(form.vars.taso) + "\n" +
		    "Aika: " + str(form.vars.aika) + "\n" +
		    "Url: " + str(form.vars.url) + "\n" +
		    "Zip: " + str(form.vars.url_zip) + "\n")
     except apiproxy_errors.OverQuotaError, message:
        logging.error(message)

     return redirect(URL('kiitos'))
#     else: 
#	    response.flash = 'Sähköposti epäonnistui'
   elif form.errors:
        response.flash = 'Lomakkeessa on virheitä'
   else:
        response.flash = 'Täytä lomake'
   return dict(form=form, viikko=vt, update=update)

	 
   return "foo"

		
@auth.requires_login()
def tarkista(): 
  user = db.auth_user(auth.user.id)
  response.title = "Tarkista viikkotehtävä"

  # Haetaan valmis palaute
  palaute = db(db.palaute.arvostelija == auth.user.id).select(db.palaute, orderby=db.palaute.arvosteluaika).last()
  if not palaute:
     return dict(form="", palaute="", tehtava="", user="")

  # tarkistettava tehtävä
  tehtava = db( db.tehtava.id == palaute.tehtava).select(db.tehtava, orderby=db.tehtava.palautusaika).last()

  form = SQLFORM(db.palaute, palaute, fields = ['palaute', 'arvosana'], showid=False)

  if form.process().accepted:
        return redirect(URL('arviointi'))
  elif form.errors:
        response.flash = 'Lomakkeessa on virheitä'
  else:
        response.flash = 'Täytä lomake'
  return dict(form=form, palaute=palaute, tehtava=tehtava, user=user)

@auth.requires_login()
def omat(): 
  user = db.auth_user(auth.user.id)

  # haetaam kaikki omat tehtävät
  tehtavat = db(db.tehtava.palauttaja == user).select(db.tehtava, orderby=db.tehtava.palautusaika)
  palautteet = {}

  # haetaan tehtäviä vastaavat palautteet ja muodostetaan näistä näkymälle sopiva tietorakenne
  # relaatiotietokannassa nämä olisi pitänyt hakea samassa kyselyssä, kun haettiin tehtävätkin mutta
  # nyt käytössä ei ole relaatiotietokanta ja liitoksia ei voida tehdä vaan täytyy hoitaa sama asia
  # ohjelmallisesti  
  for item in tehtavat:
     palaute = db(db.palaute.tehtava == item).select(db.palaute.ALL).first()
     if palaute:
	    palautteet[(item.id,"palaute")] = palaute.palaute 
	    palautteet[(item.id,"arvosana")] = palaute.arvosana 
     else:
	    palautteet[(item.id,"palaute")] = "" 
	    palautteet[(item.id,"arvosana")] = "" 
	   
  # haetaan myös ite tehdyt arvostelut 
  arvostelut = db(db.palaute.arvostelija == user).select(db.palaute, orderby=db.palaute.arvosteluaika)

  return dict(tehtavat=tehtavat, user=user, arvostelut=arvostelut, palautteet=palautteet)

