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


#import cgitb
#cgitb.enable(display=1, logdir="log")
from sitepackage.cgiweb import template, cgi_cover
from sitepackage.helper import generate
from sitepackage.thissql import sqlw, sqlr
from sitepackage.pay_network import network_create_payment_url
from sitepackage.pay_telr2 import telr_create_payment_url
from sitepackage.pay_payforu import payforu_create_payment_url
from sitepackage.pay_ccavenue import ccavenue_create_payment_form
from sitepackage.pay_paytabs import paytabs_create_payment_url
from sitepackage.mail import sendmail


import os
import json
import datetime
import urllib
import traceback


__config__ = {
  'settings':'settings.json',
  "files_path":"files",
  'log_dir_path':'log'
}


def log(text, data):
  index = 1
  name = os.path.join(
    __config__['log_dir_path'],
    'save_log_' + datetime.datetime.now().strftime('%Y%m%d%H%M%S%f') + '_1')
  while os.path.exists(name+ '.txt'):
    index += 1
    name = '_'.join(name.split('_')[:-1])+ '_'+str(index)
  savefile = open(name + '.txt', 'w', encoding="utf-8")
  try:
    savefile.write(str(text))
    savefile.write('\n')
  except:
    pass
  try:
    savefile.write(str(data))
  except:
    pass
  savefile.close()


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


def parametrs_to_dict(parametrs, files):
  request = {"parametrs":{}, "files":{}}
  for key, values in files.items():
    temp = []
    for value in values:
      file_name, file_obj = value
      file_id = str(int(sqlr("SELECT file_id FROM files ORDER BY file_id DESC LIMIT 1")[0][0])+1)
      sqlw("INSERT INTO files (file_id,file_name) VALUES (?,?)",
        [file_id, file_name])
      name = os.path.join(__config__["files_path"], file_id)
      savefile = open(name, 'wb')
      savefile.write(file_obj)
      savefile.close()
      temp.append(file_id)
    request["files"][key] = temp
  for key, values in parametrs.items():
    if values[0] == b'':
      values = ['']
    request["parametrs"][key] = values
  return request


def main(geted_simple_cookies, info, parametrs, files):
  settings = read_settings()
  utcnow = datetime.datetime.utcnow()
  timestam = utcnow.timestamp()
  request = parametrs_to_dict(parametrs, files)
  files_list = []
  for key, values in files.items():
    for value in values:
      file_name, file_obj = value
      files_list.append((file_name, file_obj))
  if "line30" in parametrs:
    country = parametrs["line30"][0]
    settings["select_pay_sys"] = settings["select_pay_sys_country"][country]
  if "pay_sys" in parametrs:
    settings["select_pay_sys"] = parametrs["pay_sys"][0]
  for item in settings["pay_sys"]:
    if item["id"] == settings["select_pay_sys"]:
      command = globals()[item["command"]]
      default_data = item["default_data"]
  default_data["uid"] = "0"+generate(14, number=True)
  """
  traceback_response, sendmail_error = sendmail(
          settings["mail"]["mail_to"],
          settings["mail"]["mail_login"],
          settings["mail"]["mail_sbj"],
          json.dumps(request)+"<br>uid="+default_data["uid"],
          "html",
          settings["mail"]["smtp_server_port"],
          settings["mail"]["mail_login"],
          settings["mail"]["mail_pass"],
          files_list)
  """
  email = ""
  if "line4" in parametrs:
    email = parametrs["line4"][0]
  dob_str = "01/01/1900"
  if "line3" in parametrs:
    if "/" in parametrs["line3"][0]:
      dob_str = parametrs["line3"][0]
  dob_dt = datetime.datetime.strptime(dob_str+"_23:59:59", '%d/%m/%Y_%H:%M:%S')
  offset = datetime.timedelta(hours=4)
  tz = datetime.timezone(offset, name='UAE')
  now_dt = datetime.datetime.now(tz=tz)
  age = now_dt.year - dob_dt.year - ((now_dt.month, now_dt.day) < (dob_dt.month, dob_dt.day))
  # payment_data["customer_name"]
  default_data["description"] = default_data["adult"]["description"]
  default_data["amountcent_int"] = default_data["adult"]["amountcent_int"]
  if age < 6:
    default_data["description"] = default_data["child"]["description"]
    default_data["amountcent_int"] = default_data["child"]["amountcent_int"]
  if "line1" in parametrs and "line2" in parametrs:
    if parametrs["line1"][0] != "" and parametrs["line2"][0] != "":
      default_data["customer_name"] = parametrs["line1"][0]
      default_data["customer_name"] += " "
      default_data["customer_name"] += parametrs["line2"][0]
  try:
    payment_url, ref = command(default_data)
    mid_url = default_data["url_to_mid"]
    mid_url += '?appId='+default_data["uid"]
    mid_url += '&email='+email
    mid_url += '&amount='+str(default_data["amountcent_int"])
    mid_url += '&currency='+default_data["currency_str"]
    if "url_form" in default_data:
      for index, (name, value) in enumerate(payment_url.items()):
        mid_url += '&name-'+str(index)+'='+urllib.parse.quote(name)
        mid_url += '&value-'+str(index)+'='+urllib.parse.quote(value)
    else:
      mid_url += '&redirectUrl='+urllib.parse.quote(payment_url)
  except:
    log("no_mid_url", str(traceback.format_exc()))
    mid_url = "no mid_url"
    ref = "None"
  sqlw("INSERT INTO pay_result (uid, pay_sys, pay_sys_ref, request, payment, payment_success, mail_success, mail_success2, date) VALUES (?,?,?,?,?,?,?,?,?)", [
    default_data["uid"],
    settings["select_pay_sys"],
    ref,
    json.dumps(request),
    mid_url,
    0,
    0, #1 if sendmail_error == "" else 0,
    0,
    str(timestam)])
  """
  traceback_response, sendmail_error = sendmail(
          email,
          settings["mail2"]["mail_login"],
          settings["mail2"]["mail_sbj"],
          settings["mail2"]["mail_body"],
          "html",
          settings["mail2"]["smtp_server_port"],
          settings["mail2"]["mail_login"],
          settings["mail2"]["mail_pass"])
  """
  page = """<head>
<meta http-equiv="refresh" content="1;URL=%s" />
</head>""" % mid_url
  return {'page':page}


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