import clr
clr.AddReference('System.Drawing')
clr.AddReference('System.Windows.Forms')
from System.Drawing import *
from System.Windows.Forms import *
from System.Net import *
from System.Net.Sockets import *
from System.Text import *
from System import Array
import System

import string

class IronRadioController:
	def __init__(self, title='IronRadio', debug=False):
		self._telnet = IronTelnet('localhost', 1234, debug)

		self._base_form = Form(Text = title, Width = 450, Height = 250)		
		self._label = Label(Text = 'IronRadio Controller')
		self._uptime_label = Label()
		self._button = Button(Text = 'Skip to next song')
		self._timer = Timer()

		#	Setup our timer for updating the uptime
		self._timer.Interval = 10000
		self._timer.Tick += self.uptimeEvent
		self._timer.Start()

		# Setup our header label
		self._label.Width = 300
		self._label.Height = 55
		self._label.TextAlign = ContentAlignment.MiddleCenter
		#self._label.BorderStyle = BorderStyle.FixedSingle
		self._label.BackColor = Color.FromArgb(0,0,0,0);
		self._label.Font = Font('Verdana', 18)
		self._label.Dock = DockStyle.Top
		self._base_form.Controls.Add(self._label)

		self._button.Height = 45
		self._button.Dock = DockStyle.Bottom
		self._base_form.Controls.Add(self._button)

		self._uptime_label.Width = 300
		self._uptime_label.Font = Font('Verdana', 14)
		self._uptime_label.BackColor = Color.FromArgb(0,0,0,0);
		self._uptime_label.Location = Point(10, 100)
		self._base_form.Controls.Add(self._uptime_label)

		self._base_form.Show()
		self._base_form.Click += self.clkEvent
		self._button.Click += self.skipButtonEvent

		#	Now that the form has been shown, let's connect to telnet
		self._telnet.connect()
		self._update_uptime()


	def _update_uptime(self):	
		self._telnet.write('uptime\r\n')
		uptime = self._telnet.read()
		#	The uptimei will come back in the format:
		#	['5d 14h 22m 27s', 'END', '']
		if len(uptime) > 0:
			uptime = string.split(uptime, '\n')
			uptime = uptime[0]
			self._uptime_label.Text = 'Radio Uptime: %s' % uptime

	def uptimeEvent(self, *a):
		self._update_uptime()

	def skipButtonEvent(self, *a):
		self._telnet.write('radio.skip\r\n')
		print self._telnet.read()

	def clkEvent(self, *a):
		print repr(a)

	def closeEvent(self, *a):
		Application.Stop()

#####################################
#	IronTelnet related code
#####################################
class IronTelnetException(Exception):
	pass

class IronTelnet:
	def __init__(self, host='localhost', port=23, debug=False):
		self._debug = debug
		self._host = host
		self._address = ''
		self._port = port
		self._blocks = True
		self._socket = Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)

		hostentry = Dns.GetHostByName(self._host)
		for address in hostentry.AddressList:
			self._address = address
			break

	def __del__(self):
		if self._socket.Connected:
			self._socket.Close()

	def connect(self):
		if not self._socket.Connected:
			if self._debug:
				print 'Connecting to %s' % self._address
			
			endpoint = IPEndPoint(self._address, self._port)
			self._socket.Connect(endpoint)

			if self._debug:
				if self._socket.Connected:
					print 'Socket connected to %s' % self._address
				else:
					print 'Socket not connected to %s' % self._address
	
	def write(self, command):
		if not self._socket.Connected:
			raise IronTelnetException('Telnet session not connected!')
		
		encoding = ASCIIEncoding()

		rc = self._socket.Send(encoding.GetBytes(command))

		if rc > 0 and self._debug:
			print 'Successfully sent %d bytes' % rc		
		
		return rc
	
	def read(self):
		if not self._socket.Connected:
			raise IronTelnetException('Telnet session not connected!')
			
		encoding = ASCIIEncoding()
		bytes = Array.CreateInstance(System.Byte, self._socket.Available)
		rc = self._socket.Receive(bytes)

		if rc and self._debug:
			print 'Successfully received %d bytes' % rc
		
		return encoding.GetString(bytes)

if __name__ == '__main__':
	form = IronRadioController()
	Application.Run(form._base_form)
