import network, json, machine, time
from m5stack import lcd, btnA, btnB, btnC
from uiflow import cfgRead
from uiflow import cfgWrite

wlan_sta = network.WLAN(network.STA_IF)
wlan_sta.active(True)

def screenShow():
	lcd.font(lcd.FONT_Default)
	lcd.setColor(0xCCCCCC, 0)
	lcd.rect(0, 210, 320, 30, lcd.BLACK, lcd.BLACK)
	message = 'reconnect'
	lcd.text(62 - int(lcd.textWidth(message) / 2), 235 - lcd.fontSize()[1], message)
	message = 'set wifi'
	lcd.text(253 - int(lcd.textWidth(message) / 2), 235 - lcd.fontSize()[1], message)

_reconnectTime = 0
_reconnectState = True
def reconnect(block=False):
	global _reconnectTime, _reconnectState
	if wlan_sta.isconnected():
		return True
		
	if time.ticks_ms() > _reconnectTime:
		if wlan_sta.isconnected():
			return True

		if _reconnectState == True:
			_reconnectState = False
			_reconnectTime = time.ticks_ms() + 1000
			print("disconnect, wait next ...")
			wlan_sta.disconnect()
			return False

		_reconnectTime = time.ticks_ms() + 15000
		_reconnectState = True

		if not wlan_sta.isconnected():
			wlan_sta.active(True)
			jdata = cfgRead('wifi')
			if jdata:
				wlan_sta.connect(jdata['ssid'], jdata['password'])
		return True
	else:
		return False

def doConnect(ntwrk_ssid, netwrk_pass, lcdShow=False):
	if lcdShow:
		lcd.font(lcd.FONT_DejaVu18)
		lcd.setCursor(0, 0)
		lcd.rect(0, 0, 320, 210, lcd.BLACK, lcd.BLACK)
	if not wlan_sta.isconnected():
		wlan_sta.active(True)
		print('Connect Wi-Fi: SSID:'+ntwrk_ssid+' PASSWD:'+netwrk_pass+' network...')
		wlan_sta.connect(ntwrk_ssid, netwrk_pass)
		if lcdShow:
			lcd.println('Connect WiFi: \r\nWiFi SSID:'+ntwrk_ssid)
			lcd.print('Connecting.')
		a=0
		while not wlan_sta.isconnected() | (a > 20) :
			time.sleep_ms(500)
			a+=1
			print('.', end='')
			if lcdShow:
				lcd.print('.',wrap=1)
		if wlan_sta.isconnected():
			print('\nConnected. Network config:', wlan_sta.ifconfig())
			if lcdShow:
				lcd.println("Connected! \r\nNetwork config:\r\n"+wlan_sta.ifconfig()[0]+', '+wlan_sta.ifconfig()[3])
			saveWiFi(ntwrk_ssid, netwrk_pass)
			return (True)
		else : 
			print('\nProblem. Not Connected to :'+ntwrk_ssid)
			if lcdShow:
				lcd.println('.',wrap=1)
				lcd.println('Problem. Not Connected to :'+ntwrk_ssid)
			wlan_sta.disconnect()
			return (False)
	return (True)

def autoConnect(lcdShow=False):
	if lcdShow:
		screenShow()
	try:
		if not wlan_sta.isconnected():
			jdata = cfgRead('wifi')
			ssid = jdata['ssid']
			passwd = jdata['password']
			if ssid == '' and passwd == '':
				history = machine.nvs_getstr('history')
				if history != None:
					data = json.loads(history)
					ssid = data[-1][0]
					passwd = data[-1][1]
					jdata['ssid'] = ssid
					jdata['password'] = passwd
					cfgWrite('wifi', jdata)
				else:
					raise OSError
			if doConnect(ssid, passwd, lcdShow):
				return (True)
			print('connect fail!')

			if not wlan_sta.isconnected():
				while True:
					time.sleep_ms(20)
					if btnA.wasReleased():
						if doConnect(ssid, passwd, lcdShow):
							return (True)
					elif btnC.wasPressed():
						wlan_sta.disconnect()
						import wifiWebCfg
						wifiWebCfg.webserver_start()
		else:
			return (True)
	except OSError:
		# Web server for connection manager
		import wifiWebCfg
		wifiWebCfg.webserver_start()

def saveWiFi(ssid, password):
	ssidMap = {}
	ssidMap['ssid'] = ssid
	ssidMap['password'] = password

	cfgWrite('wifi', ssidMap)

	change = False
	wifi_history = machine.nvs_getstr("history")
	
	if wifi_history != None:
		wifi_history = json.loads(wifi_history)
		for i in wifi_history:
			if i[0] == ssid:
				i[1] = password
				change = True
				break
		if not change:
			if len(wifi_history) == 4:
				wifi_history.pop(0)
			wifi_history.append([ssid, password])
	else:
		wifi_history = [[ssid, password]]
	
	machine.nvs_setstr('history', json.dumps(wifi_history))

def isconnected():
	return wlan_sta.isconnected()