#!/usr/bin/python3
#encoding:utf-8

from sitepackage.cgiweb import template, cgi_cover
from sitepackage.thissql import sqlw, sqlr
from sitepackage.helper import passhash, generate

import datetime
import http
import os


__config__ = {
  "files_path":"files",
  "template_dir_path":"template",
  "session_expires_days_int":60}


def main(geted_simple_cookies, info, parametrs, files):
  ok, new_cookies = False, None
  if "login" in parametrs and "password" in parametrs:
    login = parametrs["login"][0]
    password = parametrs["password"][0]
    if login != "" and password != "":
      password_hash = passhash(password, login)
      role = sqlr("SELECT role FROM users WHERE login=? AND password=?",
        (login,password_hash))
      if len(role) == 1:
        utcnow = datetime.datetime.utcnow()
        session_id = str(utcnow.timestamp()) + generate(16)
        #TODO удаление старых сессий
        expires = str((utcnow + datetime.timedelta(
          days=__config__["session_expires_days_int"])).timestamp())
        sqlw("INSERT INTO sessions (session_id,login,expires) VALUES (?,?,?)",
          (session_id, login, expires))
        new_cookies = http.cookies.SimpleCookie()
        new_cookies['session_id'] = session_id
        ok = True
      else:
        errors = "error1.bad pass or email"
    else:
      errors = "error2.bad pass or email"
  elif 'session_id' in geted_simple_cookies:
    session_id = geted_simple_cookies['session_id'].value
    if "exit" in parametrs:
      sqlw("DELETE FROM sessions WHERE session_id=?", [session_id])
    sessions_data = sqlr("SELECT login,expires FROM sessions WHERE session_id=?",
      [session_id])
    if len(sessions_data) != 1:
      errors = "error3.session expire"
    else:
      login, expires = sessions_data[0]
      utcnow = datetime.datetime.utcnow()
      if expires > str(utcnow.timestamp()):
        role = sqlr("SELECT role FROM users WHERE login=?", [login])
        ok = True
      else:
        errors = "error4.session expire"
  else:
    errors = "error5.no email or pass"
  if ok:
    if "admin" in role[0][0]:
      redirect = "/admin.py"
    else:
      redirect = "/work.py"
    page = """<html><head><meta http-equiv="refresh" content="0; URL='%s'" /></head><body></body></html>""" % redirect
  else:
    options = ""
    for index in sqlr("SELECT login FROM users"):
      options += '''<option value="%s">%s</option>\n''' % (index[0], index[0])
    page = template(
      open(
        os.path.join(
          __config__["template_dir_path"],
          "auth.html"),
        encoding="utf8").read(),
      {
        'options':options,
        "message":errors
      }
    )
  if new_cookies is not None:
    return {"page":page, 'cookies':new_cookies}
  else:
    return {"page":page}

if __name__ == '__main__':
  import cgitb
  cgitb.enable(display=1, logdir="log")
  cgi_cover(main)
