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


import cgitb
cgitb.enable(display=1, logdir="log")
from sitepackage.cgiweb import template, cgi_cover
from sitepackage.thissql import sqlw, sqlr
from sitepackage.helper import passhash, generate


import os
import random
import datetime
import json


__config__ = {
  'settings':'settings.json',
  "template_dir_path":"template",
  "session_expires_days_int":60}



def save_format_json(filename, obj_dict):
  json_text = json.dumps(obj_dict)
  json_text = json_text.replace('": [', '": [\n')
  json_text = json_text.replace('": {', '": {\n')
  json_text = json_text.replace('], "', '],\n"')
  json_text = json_text.replace('}, "', '},\n"')
  json_text = json_text.replace('], [', '\n],[')
  json_text = json_text.replace('}, {', '\n},{')
  json_text = json_text.replace('], {', '\n],{')
  json_text = json_text.replace('}, [', '\n},[')
  json_text = json_text.replace('", "', '",\n"')
  json_text = json_text.replace('{"', '{\n"')
  json_text = json_text.replace('["', '[\n"')
  json_text = json_text.replace('"]', '"\n]')
  json_text = json_text.replace('"}', '"\n}')
  json_text = json_text.replace(']]', ']\n]')
  json_text = json_text.replace('}'+'}', '}\n}')
  json_text = json_text.replace(']}', ']\n}')
  json_text = json_text.replace('}]', '}\n]')
  typesetting = 0
  with open(filename, 'w') as outfile:
    for line in json_text.split("\n"):
      opening_bracket = 0
      opening_bracket += line.count('{')
      opening_bracket += line.count('[')
      closing_bracket = 0
      closing_bracket += line.count('}')
      closing_bracket += line.count(']')
      new_typesetting = typesetting + opening_bracket - closing_bracket
      if opening_bracket == closing_bracket == 1:
        outfile.write('  '*(typesetting-1)+line+"\n")
      elif opening_bracket > 0:
        outfile.write('  '*typesetting+line+"\n")
        typesetting = new_typesetting
      else:
        typesetting = new_typesetting
        outfile.write('  '*typesetting+line+"\n")


def read_settings():
  with open(__config__['settings'], "r", encoding="utf-8") as read_file:
    data = json.load(read_file)
  return data



def main(geted_simple_cookies, info, parametrs, files):
  cookies = geted_simple_cookies

  ok = False
  if "email" in parametrs and "password" in parametrs:
    login = parametrs["email"][0]
    password = parametrs["password"][0]
    if login != "" and password != "":
      password_hash = passhash(password, login)
      data = sqlr("SELECT user_id FROM logins WHERE login=? AND passhash=?",
        (login,password_hash))
      if len(data) == 1:
        user_id = data[0][0]
        utcnow = datetime.datetime.utcnow()+datetime.timedelta(hours=12)
        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,user_id,expires) VALUES (?,?,?)",
          (session_id, user_id, expires))
        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
    sessions_data = sqlr("SELECT user_id,expires FROM sessions WHERE session_id=?",
      [session_id])
    if len(sessions_data) != 1:
      errors = "error3.session expire"
    else:
      user_id, expires = sessions_data[0]
      utcnow = datetime.datetime.utcnow()
      if expires > str(utcnow.timestamp()):
        ok = True
      else:
        errors = "error4.session expire"
  else:
    errors = "error5.no email or pass"
  if ok:
    settings = read_settings()
    if "select_pay_sys" in parametrs:
      settings["select_pay_sys"] = parametrs["select_pay_sys"][0]
      save_format_json(__config__['settings'], settings)
    payment_select = ""
    for item in settings["pay_sys"]:
      plus_minus = "+" if item["id"] == settings["select_pay_sys"] else "-"
      payment_select += '%s <a href="admin2.py?select_pay_sys=%s">%s</a><br>' % (plus_minus, item["id"], item["name"])
      payment_select += 'test link <a href="save.py?pay_sys=%s">%s</a><br>' % (item["id"], item["name"])
      payment_select += "<table>"
      for key, value in item["default_data"].items():
        payment_select += "<tr><td>%s</td><td>%s</td></tr>" % (key, str(value))
      payment_select += "</table>"

    table = """<table><tr><td>request_files</td>
<td>request_values</td>
<td>payment</td>
<td>payment_success</td>
<td>mail_success</td>
<td>date</td>
</tr>"""
    for data in sqlr("SELECT request, payment, payment_success, mail_success, date FROM pay_result", []):
      request, payment, payment_success, mail_success, date = data
      request = json.loads(request)
      files_td = ""
      for key, values in request["files"].items():
        for value in values:
          files_td += ' <a href="/files/%s">%s</a>' % (value, value)
      date = datetime.datetime.fromtimestamp(float(date))
      date = date.strftime('%Y-%m-%d %H:%M:%S')
      data2 = files_td, str(request["parametrs"]), payment, payment_success, mail_success, date
      table += "<tr><td>%s</td></tr>" % "</td><td>".join([str(index) for index in data2])
    table += "</td></tr></table>"
    page = payment_select+table
  else:
    page = str(errors)
  return {'page':page, "cookies":cookies}


if __name__ == "__main__":
  cgi_cover(main)
