import urllib, mechanize, logging

USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1729.3 Safari/537.36"

class JSObject(dict):
	__getattr__ = dict.__getitem__

def parseData(response):
	data = JSObject()
	while response:
		_a = response.find('&')
		if _a < 0:
			_a = len(response)
		a, response = response[:_a], response[_a+1:]
		_e = a.find('=')
		if _e < 0:
			data[a] = None
		elif _e > 0:
			data[a[:_e]] = a[_e+1:]
	return data

class NeopetsOfflineError(RuntimeError):
	pass

class DynamicUseragent(object):
	def __get__(self, instance, owner):
		if instance:
			return instance._useragent
		return owner._useragent

	def __set__(self, instance, value):
		if not value:
			return self.__del__(instance)
		if instance:
			if not hasattr(instance, '_useragent') or instance._useragent != value:
				instance._useragent = value
				instance.changeHeader('User-agent', instance._useragent)
			return
		pass

	def __delete__(self, instance=None):
		try:
			del instance._useragent
			instance.changeHeader('User-agent', instance._useragent)
		except AttributeError:
			pass

class AccountWrapper(mechanize.Browser):
	useragent = DynamicUseragent()
	logger = logging.getLogger('neoaccount')
	
	def __init__(self, **kwargs):
		ua = kwargs.pop('useragent', USER_AGENT)
		self.username = kwargs.pop('username', None)
		self.password = kwargs.pop('password', None)
		self.birthday = {}
		self.birthday['month'] = kwargs.pop('month', None)
		self.birthday['day'] = kwargs.pop('day', None)
		self.birthday['year'] = kwargs.pop('year', None)
		mechanize.Browser.__init__(self, **kwargs)
		self.useragent = ua
		self.logger = logging.getLogger(self.username)
		self.logger.addHandler(logging.NullHandler())

	def login(self, **kwargs):
		values = {'username': self.username, 'password': self.password}
		a = {
			'month': 'dob_m',
			'day': 'dob_d',
			'year': 'dob_y',
		}
		if self.birthday:
			v = {}
			for b in a:
				if self.birthday[b]:
					v[a[b]] = self.birthday[b]
				else:
					break
			else:
				# Complete birthday available
				values.update(v)
		values.update(kwargs)
		
		if values['username'] and values['password']:
			html = self.open_novisit("http://www.neopets.com/login.phtml", urllib.urlencode(values))
			url = html.geturl()
			print url
			if 'index.phtml' in url:
				return True
			else:
				try:
					url, param = url.split('?')
					data = parseData(param)
					if 'failed_bday' in data:
						if data.failed_bday == '2':
							self.reason = "Birthday required"
							return False
						elif data.failed_bday == '1':
							self.reason = "Wrong birthday and/or password"
							return False
						elif data.failed_bday == '0':
							self.reason = "Wrong password"
							return False
				except:
					pass
				if 'login' in url:
					f = open('login.html', 'w')
					f.write(html.read())
					f.close()
					self.reason = "Frozen"
					return False
		self.reason = None
		return False

	def changeHeader(self, header, value):
		headers = self.addheaders
		newHeader = (header, value)
		for i in xrange(len(headers)):
			if headers[i][0] == header:
				if headers[i][1] != value:
					headers[i] = newHeader
				return
		else:
			headers.append(newHeader)

	def getHeader(self, header):
		for headers in self.addheaders:
			if headers[0] == header:
				return headers[1]
		return None

AccountWrapper.logger.addHandler(logging.NullHandler())