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


import os
import datetime
import shlex
import subprocess
import json
import traceback


__config__ = {
  'log_dir_path':'log'
}


def log(text, data):
  index = 1
  name = os.path.join(
    __config__['log_dir_path'],
    'payment_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 get_token(payment_data):
  ok, token = False, None
  try:
    curl = '''curl --header "accept: application/vnd.ni-identity.v1+json"\
 --header "authorization: Basic %s"\
 --header "content-type: application/vnd.ni-identity.v1+json"\
 -X POST -d '{"realmName":"%s"}' "%s"''' % (
      payment_data["token_API_Key"],
      payment_data["realm_name"],
      payment_data["token_url"]
    )
    args = shlex.split(curl)
    process = subprocess.Popen(args, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    stdout, stderr = process.communicate()
    log("request", curl)
    log("request", str(stdout.decode('utf-8')))
    response = json.loads(stdout.decode('utf-8'))
    token = response["access_token"]
    ok = True
  except:
    log("error2", str(traceback.format_exc())) # ошибка получения данных
  return ok, token


def get_payment_link(token, payment_data):
  ok, payment_link, ref = False, None, None
  try:
    payment_request = '''{"action": "PURCHASE","amount" : { "currencyCode" : "%s", "value" : %s }}''' % (
      payment_data["currency_str"], str(payment_data["amountcent_int"]))
    url = payment_data["payment_url"] % payment_data["payment_outlet"]
    curl = '''curl --header "Authorization: Bearer %s"\
 --header "Content-Type: application/vnd.ni-payment.v2+json"\
 --header "Accept: application/vnd.ni-payment.v2+json"\
 -X POST -d '%s' "%s"''' % (token, payment_request, url)
    args = shlex.split(curl)
    process = subprocess.Popen(args, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    stdout, stderr = process.communicate()
    response = json.loads(stdout.decode('utf-8'))
    payment_link = response["_links"]["payment"]["href"]
    ok = True
  except:
    log("error2", str(traceback.format_exc())) # ошибка получения данных
  return ok, payment_link, ref


def network_create_payment_url(payment_data):
  ok, token, ref = get_token(payment_data)
  if not ok:
    raise Exception('Error: can not get_token')
  ok, payment_link = get_payment_link(token, payment_data)
  if not ok:
    raise Exception('Error: can not get_payment_link')
  return payment_link, ref

