text: # -*- coding: utf-8 -*-
  # Copyright (c) 2017, Frappe Technologies and contributors
  # For license information, please see license.txt
  
  from __future__ import unicode_literals
  import frappe
  from frappe.model.document import Document
  from frappe import _
  import urllib
  from frappe.utils import get_url, call_hook_method, cint
  from frappe.integrations.utils import make_get_request, make_post_request, create_request_log, create_payment_gateway
  
  class StripeSettings(Document):
  	supported_currencies = [
  		"AED", "ALL", "ANG", "ARS", "AUD", "AWG", "BBD", "BDT", "BIF", "BMD", "BND",
  		"BOB", "BRL", "BSD", "BWP", "BZD", "CAD", "CHF", "CLP", "CNY", "COP", "CRC", "CVE", "CZK", "DJF",
  		"DKK", "DOP", "DZD", "EGP", "ETB", "EUR", "FJD", "FKP", "GBP", "GIP", "GMD", "GNF", "GTQ", "GYD",
  		"HKD", "HNL", "HRK", "HTG", "HUF", "IDR", "ILS", "INR", "ISK", "JMD", "JPY", "KES", "KHR", "KMF",
  		"KRW", "KYD", "KZT", "LAK", "LBP", "LKR", "LRD", "MAD", "MDL", "MNT", "MOP", "MRO", "MUR", "MVR",
  		"MWK", "MXN", "MYR", "NAD", "NGN", "NIO", "NOK", "NPR", "NZD", "PAB", "PEN", "PGK", "PHP", "PKR",
  		"PLN", "PYG", "QAR", "RUB", "SAR", "SBD", "SCR", "SEK", "SGD", "SHP", "SLL", "SOS", "STD", "SVC",
  		"SZL", "THB", "TOP", "TTD", "TWD", "TZS", "UAH", "UGX", "USD", "UYU", "UZS", "VND", "VUV", "WST",
  		"XAF", "XOF", "XPF", "YER", "ZAR"
  	]
  
  	def validate(self):
  		create_payment_gateway('Stripe')
  		call_hook_method('payment_gateway_enabled', gateway='Stripe')
  		if not self.flags.ignore_mandatory:
  			self.validate_stripe_credentails()
  	
  	def validate_stripe_credentails(self):
  		if self.publishable_key and self.secret_key:
  			header = {"Authorization": "Bearer {0}".format(self.get_password(fieldname="secret_key", raise_exception=False))}
  			try:
  				make_get_request(url="https://api.stripe.com/v1/charges", headers=header)
  			except Exception:
  				frappe.throw(_("Seems Publishable Key or Secret Key is wrong !!!"))
  	
  	def validate_transaction_currency(self, currency):
  		if currency not in self.supported_currencies:
  			frappe.throw(_("Please select another payment method. Stripe does not support transactions in currency '{0}'").format(currency))
  
  	def get_payment_url(self, **kwargs):
  		return get_url("./integrations/stripe_checkout?{0}".format(urllib.urlencode(kwargs)))
  	
  	def create_request(self, data):
  		self.data = frappe._dict(data)
  
  		try:
  			self.integration_request = create_request_log(self.data, "Host", "Stripe")
  			return self.create_charge_on_stripe()
  		except Exception:
  			frappe.log_error(frappe.get_traceback())
  			return{
  				"redirect_to": frappe.redirect_to_message(_('Server Error'), _("Seems issue with server's razorpay config. Don't worry, in case of failure amount will get refunded to your account.")),
  				"status": 401
  			}
  	
  	def create_charge_on_stripe(self):
  		headers = {"Authorization":
  			"Bearer {0}".format(self.get_password(fieldname="secret_key", raise_exception=False))}
  		
  		data = {
  			"amount": cint(self.data.amount)*100,
  			"currency": self.data.currency,
  			"source": self.data.stripe_token_id,
  			"description": self.data.description
  		}
  		
  		redirect_to = self.data.get('redirect_to') or None
  		redirect_message = self.data.get('redirect_message') or None
  
  		try:
  			resp = make_post_request(url="https://api.stripe.com/v1/charges", headers=headers, data=data)
  			
  			if resp.get("captured") == True:
  				self.integration_request.db_set('status', 'Completed', update_modified=False)
  				self.flags.status_changed_to = "Completed"
  
  			else:
  				frappe.log_error(str(resp), 'Stripe Payment not completed')
  
  		except:
  			frappe.log_error(frappe.get_traceback())
  			# failed
  			pass
  
  		status = frappe.flags.integration_request.status_code
  
  		if self.flags.status_changed_to == "Completed":
  			if self.data.reference_doctype and self.data.reference_docname:
  				custom_redirect_to = None
  				try:
  					custom_redirect_to = frappe.get_doc(self.data.reference_doctype,
  						self.data.reference_docname).run_method("on_payment_authorized", self.flags.status_changed_to)
  				except Exception:
  					frappe.log_error(frappe.get_traceback())
  
  				if custom_redirect_to:
  					redirect_to = custom_redirect_to
  
  			redirect_url = 'payment-success'
  		else:
  			redirect_url = 'payment-failed'
  
  		if redirect_to:
  			redirect_url += '?' + urllib.urlencode({'redirect_to': redirect_to})
  		if redirect_message:
  			redirect_url += '&' + urllib.urlencode({'redirect_message': redirect_message})
  
  		return {
  			"redirect_to": redirect_url,
  			"status": status
  		}
  