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


from sitepackage.cgiweb import template, cgi_cover
from sitepackage.thissql import sqlw, sqlr
from admin import make_header


import os
import json
import datetime


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

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):
  errors, ok = None, False
  if 'session_id' in geted_simple_cookies:
    session_id = geted_simple_cookies['session_id'].value
    if "exit" in parametrs:
      sqlw("DELETE FROM admin_sessions WHERE session_id=?", [session_id])
    sessions_data = sqlr("SELECT login,expires FROM admin_sessions WHERE session_id=?",
      [session_id])
    if len(sessions_data) == 1:
      login, expires = sessions_data[0]
      utcnow = datetime.datetime.utcnow()
      if expires > str(utcnow.timestamp()):
        role = sqlr("SELECT role FROM admins WHERE login=?", [login])
        if "files" in role[0][0].split(" "):
          ok = True
        else:
          errors = "error4.no access"
      else:
        errors = "error1.session expire"
    else:
      errors = "error2.session expire"
  else:
    errors = "error3.no email or pass"
  if ok:
    utc_tz = datetime.timezone(datetime.timedelta(hours=0))
    checked = ""
    if "checked" in parametrs:
      checked = " checked"
    if ("date_from" in parametrs and
        "time_from" in parametrs and
        "date_to" in parametrs and
        "time_to" in parametrs):
      date1 = parametrs["date_from"][0]
      time1 = parametrs["time_from"][0]
      find_utc_date1 = datetime.datetime.strptime(date1+time1, "%Y-%m-%d%H:%M").replace(tzinfo=utc_tz)
      date2 = parametrs["date_to"][0]
      time2 = parametrs["time_to"][0]
      find_utc_date2 = datetime.datetime.strptime(date2+time2, "%Y-%m-%d%H:%M").replace(tzinfo=utc_tz)
      max_find_utc_date = (datetime.datetime.now(datetime.UTC)-datetime.timedelta(minutes=1))
      if find_utc_date1 > max_find_utc_date:
        find_utc_date1 = max_find_utc_date
      if find_utc_date2 > max_find_utc_date:
        find_utc_date2 = max_find_utc_date
      if find_utc_date1 > find_utc_date2:
        find_utc_date1 = find_utc_date2-datetime.timedelta(minutes=1)
    else:
      find_utc_date1 = (datetime.datetime.now(datetime.UTC) - datetime.timedelta(hours=24))
      find_utc_date2 = datetime.datetime.now(datetime.UTC)

    settings = read_settings()
    pay_sys_id_name_dict = {
      None:"no pay_sys",
      "no pay_sys":"no pay_sys",
      "telr":"telr",
      "payae":"payae",
      'cc':'cc'
    }
    for item in settings["pay_sys"]:
      pay_sys_id_name_dict[item["id"]] =item["name"]
    table = ""
    '''
    for uid, pay_sys, pay_sys_ref, payment, payment_success, mail_success, mail_success2, date in sorted(sqlr(
        """SELECT uid, pay_sys, pay_sys_ref, payment, payment_success,
        mail_success, mail_success2, date FROM payment WHERE date BETWEEN ? AND ?""", [
          str(find_utc_date1.timestamp()), str(find_utc_date2.timestamp())]), key=lambda item: item[-1]):
      date = datetime.datetime.utcfromtimestamp(float(date))
      date = date.strftime('%Y-%m-%d %H:%M:%SGTM')
      if payment_success == 0:
        payment_success_text = "NO"
      elif payment_success == 1:
        payment_success_text = "YES"
      elif payment_success == 2:
        payment_success_text = "refund"
      elif payment_success == -1:
        payment_success_text = "NO and never will be"
      else:
        payment_success_text = payment_success
      if mail_success == 0:
        mail_success_text = "NO"
      elif mail_success == 1:
        mail_success_text = "YES"
      else:
        mail_success_text = mail_success
      if mail_success2 == 0:
        mail_success2_text = "NO"
      elif mail_success2 == 1:
        mail_success2_text = "YES"
      else:
        mail_success2_text = mail_success2
      data = sqlr("SELECT request, login FROM application WHERE uid=?", [uid])
      if len(data) == 1:
        request, this_login = data[0]
        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)
        appointment = '<table border="1"><tr>%s</tr></table>' % "</tr><tr>".join(
          ["<td>%s</td><td>%s</td>" % (key, value) for key, value in request["parametrs"].items()])
        data = appointment, files_td, this_login, uid, pay_sys_id_name_dict[pay_sys], pay_sys_ref, date, payment_success_text, mail_success_text, mail_success2_text, '<a href="%s">payment_url</a>' % payment
      else:
        data = "no_data", "no_data", "no_data", pay_sys_id_name_dict[pay_sys], pay_sys_ref, date, payment_success_text, mail_success_text, mail_success2_text, '<a href="%s">payment_url</a>' % payment
      if checked != "":
        if pay_sys != "no pay_sys":
         table += "<tr><td>%s</td></tr>" % "</td><td>".join([str(index) for index in data])
      else:
        if payment_success in [1,2]:
          table += "<tr><td>%s</td></tr>" % "</td><td>".join([str(index) for index in data])
    '''
    
    
    
    

    for uid, pay_sys, pay_sys_ref, request, payment, payment_success, mail_success, mail_success2, date in sorted(sqlr(
        "SELECT uid, pay_sys, pay_sys_ref, request, payment, payment_success, mail_success, mail_success2, date FROM pay_result WHERE date BETWEEN ? AND ?""", [
          str(find_utc_date1.timestamp()), str(find_utc_date2.timestamp())]), key=lambda item: item[-1]):
      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')
      if payment_success in [0, "0"]:
        payment_success_text = "ожидает оплаты"
      elif payment_success in [1, "1"]:
        payment_success_text = "оплачено"
      elif payment_success in [-1, "-1"]:
        payment_success_text = "не будет оплачено"
      else:
        payment_success_text = str([payment_success])
      if mail_success == 0:
        mail_success_text = "NO"
      elif mail_success == 1:
        mail_success_text = "YES"
      else:
        mail_success_text = mail_success
      if mail_success2 == 0:
        mail_success2_text = "NO"
      elif mail_success2 == 1:
        mail_success2_text = "YES"
      else:
        mail_success2_text = mail_success2
      data = uid, pay_sys_id_name_dict[pay_sys], pay_sys_ref, date, payment_success_text, mail_success_text, mail_success2_text, files_td, str(request["parametrs"]), payment
      if checked != "":
        if pay_sys != "no pay_sys":
         table += "<tr><td>%s</td></tr>" % "</td><td>".join([str(index) for index in data])
      else:
        if payment_success == 1:
          table += "<tr><td>%s</td></tr>" % "</td><td>".join([str(index) for index in data])
    table += "</table>"
    
    
    
    
    
    header = make_header(login, role)
    page = template(
      open(
        os.path.join(
          __config__["template_dir_path"],
          "list_apps.html"),
        encoding="utf8").read(),
      { "header":header,
        "time_from":find_utc_date1.strftime('%H:%M'),
        "time_to":find_utc_date2.strftime('%H:%M'),
        "date_from":find_utc_date1.strftime('%Y-%m-%d'),
        "date_to":find_utc_date2.strftime('%Y-%m-%d'),
        "checked":checked,
        "table":table
      }
    )
  else:
    page = str(errors)
  return {'page':page}


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