class StatusWorker(Thread):
	def __init__(self, main_window):
		Thread.__init__(self)
		self._main_window = main_window
		self.d = Datasource()
		self.d.token()
		self.start()
	def run(self):
		while True:
			result = self.d.action("status", {})
			wx.PostEvent(self._main_window, ResultEvent(GET_STATUS_ID, result) )
			time.sleep(1)
class DataWorker(Thread):
	def __init__(self, main_window):
		Thread.__init__(self)
		self._main_window = main_window
		self.d = Datasource()
		self.d.token()
		self.start()
	def run(self):
		while True:
			result = self.d.action("exchange_rate", {})
			wx.PostEvent(self._main_window, ResultEvent(GET_EXCHANGE_RATE_ID, result) )
			time.sleep(1)
class BitcoinATM(wx.App):

	def OnInit(self):
		self.res = xrc.XmlResource('gui.xrc')
		self.init_frame()
		self.d = Datasource()
		self.d.token()
		return True
	def init_frame(self):
		self.frame = self.res.LoadFrame(None, 'mainFrame')
		self.scanPanel = xrc.XRCCTRL(self.frame, 'scanPanel')
		self.insertPanel = xrc.XRCCTRL(self.frame, 'insertPanel')
		self.insertPanel.GetParent().GetSizer().Hide(self.insertPanel)
		self.insertPanel.GetParent().GetSizer().Layout()
		self.boughtPanel = xrc.XRCCTRL(self.frame, 'boughtPanel')
		self.boughtPanel.GetParent().GetSizer().Hide(self.boughtPanel)
		self.boughtPanel.GetParent().GetSizer().Layout()

		self.next_btn = xrc.XRCCTRL(self.scanPanel, 'next');
		self.buy_btn = xrc.XRCCTRL(self.insertPanel, 'buy');
		self.again_btn = xrc.XRCCTRL(self.boughtPanel, 'again');

		self.service_status_label = xrc.XRCCTRL(self.scanPanel, 'service_status_label');
		self.alert_bar = xrc.XRCCTRL(self.insertPanel, 'alert_bar')
		self.price_label = xrc.XRCCTRL(self.scanPanel, 'price_label')
		self.identity_textbox = xrc.XRCCTRL(self.scanPanel, 'identity')
		self.identity_textbox.SetFocus()
		self.amount_inserted_label = xrc.XRCCTRL(self.insertPanel, 'amount_inserted_label')
		self.qr_code_image = xrc.XRCCTRL(self.boughtPanel, 'qr_code_image')

		self.frame.Bind(wx.EVT_BUTTON, self.OnScanned, id=xrc.XRCID('next') )
		self.frame.Bind(wx.EVT_BUTTON, self.OnBuy, id=xrc.XRCID('buy') )
		self.frame.Bind(wx.EVT_BUTTON, self.OnAgain, id=xrc.XRCID('again') )
		self.Connect(-1, -1, GET_EXCHANGE_RATE_ID, self.GetExchangeRate)
		self.Connect(-1, -1, GET_INSERTED_AMOUNT_ID, self.GetInsertedAmount)
		self.Connect(-1, -1, GET_STATUS_ID, self.GetServiceStatus)
		StatusWorker(self)
		DataWorker(self)
		self.frame.Show()
	def OnScanned(self, event):
		self.scanPanel.GetParent().GetSizer().Hide(self.scanPanel)
		self.scanPanel.GetParent().GetSizer().Layout()
		self.insertPanel.GetParent().GetSizer().Show(self.insertPanel)
		self.insertPanel.GetParent().GetSizer().Layout()
		try:
			self.acceptor = Acceptor(self)
		except IOError as e:
			print e
		except:
			raise
	def OnBuy(self, event):
		try:
			self.acceptor.abort()
		except AttributeError as e:
			print e
		# send request to bitcoin api and get bitcoin private key
		#
		amount = self.amount_inserted_label.GetLabel()
		result = self.d.action("exchange", {'amount': amount} )
		if(result['meta']['code'] != 200):
			self.alert_bar.SetLabel(result['meta']['status'])
			self.alert_bar.SetForegroundColour("red");
		else:
			self.CreateQR(result['wif'])
			self.insertPanel.GetParent().GetSizer().Hide(self.insertPanel)
			self.insertPanel.GetParent().GetSizer().Layout()
			self.boughtPanel.GetParent().GetSizer().Show(self.boughtPanel)
			self.boughtPanel.GetParent().GetSizer().Layout()
			self.amount_inserted_label.SetLabel("")
	def OnAgain(self, event):
		self.boughtPanel.GetParent().GetSizer().Hide(self.boughtPanel)
		self.scanPanel.GetParent().GetSizer().Layout()
		self.scanPanel.GetParent().GetSizer().Show(self.scanPanel)
		self.boughtPanel.GetParent().GetSizer().Layout()
	def CreateQR(self, string):
		qr = QRCode(version=1, box_size=3, border=1)
		qr.add_data(string)
		qr.make(fit=True)

		im = qr.make_image()
		qrfile = os.path.join("tmp", str(time.time() ) + ".png")
		image = open(qrfile, 'wb')
		im.save(image, "PNG")
		self.qr_code_image.SetBitmap(wx.BitmapFromImage(wx.Image(qrfile, wx.BITMAP_TYPE_ANY) ) )
	def GetExchangeRate(self, event):
		self.price_label.SetLabel(str(event.data['exchange_rate']) )
	def GetInsertedAmount(self, event):
		self.amount_inserted_label.SetLabel(str(event.data) )
	def GetServiceStatus(self, event):
		self.service_status_label.SetLabel("Status: " + str(event.data['meta']['status']) )
		if(event.data['meta']['code'] != 200):
			self.next_btn.Disable()
			self.buy_btn.Disable()
			self.again_btn.Disable()