import sys, subprocess, shlex
import settings as s


debug = 0
#lcl_cmd     = "/usr/local/bin/lcl-rpict-config.py"


def is_serial_port_used():
	fuser_cmd = s.FUSER_BIN + " " + s.SERIAL_PORT_NAME
	pid = '0'
	try:
		cmd_stdout = subprocess.check_output(shlex.split(fuser_cmd))
		pid = cmd_stdout.decode()
		if debug:
			sys.stderr.write(pid)
		
	except subprocess.CalledProcessError as e:
		return False, pid
	
	return True, pid


def read_rpict_config():
	
	cmd = "%s -a" % (s.LCL_RPICT_CONFIG_BIN)
	
	(is_used, pid) = is_serial_port_used()
	if is_used:
		return { "success": "false", "error": "Serial Port already in use by pid %s." % pid } 
		

	if debug:
		sys.stderr.write(cmd)
	
	data = { "success": "true", "error": "" }
	process_ok = True

	try:
		#p = subprocess.check_output(shlex.split(cmd), shell=True)
		#process = subprocess.Popen(shlex.split(cmd),stdout=subprocess.PIPE,shell=True)
		#pout, perr = process.communicate()
		
		p = subprocess.run(shlex.split(cmd))
		
	except subprocess.CalledProcessError as e:
		sys.stderr.write("Process failed")
		sys.stderr.write(e.output)
		process_ok = False
		data = { "success": "false", "error": "Program failed. Check logs." }
	
	if debug:
		sys.stderr.write("Returned Code: %s\n" % str(p.returncode))
	
	if p.returncode==0:	
		f = open(s.RPICT_CONFIG_FILE, 'r')
		content = f.read().replace('\n', "$")
		f.close()
		if debug:
			sys.stderr.write("Content: %s\n" % content)
		data = { "success": "true", "error": "" , "config": content} 
	else:	
		data = { "success": "false", "error": "Failed." }

	#if debug and process_ok:
		#sys.stderr.write(p.stdout.decode())
		
	print(data)
	return data	
		


def write_rpict_config(config):
	
	cmd = "%s -a -w %s" % (s.LCL_RPICT_CONFIG_BIN, s.RPICT_REMOTE_FILE)
	
	(is_used, pid) = is_serial_port_used()
	if is_used:
		return { "success": "false", "error": "Serial Port already in use by pid %s." % pid } 
		

	if debug:
		sys.stderr.write(config)
		sys.stderr.write(cmd)

	f = open(s.RPICT_REMOTE_FILE, 'w')
	f.write(config)
	f.close()

	data = { "success": "true", "error": "" }
	process_ok = True

	try:
		#p = subprocess.check_output(shlex.split(cmd), shell=True)
		#process = subprocess.Popen(shlex.split(cmd),stdout=subprocess.PIPE,shell=True)
		#pout, perr = process.communicate()
		
		p = subprocess.run(shlex.split(cmd))
		
	except subprocess.CalledProcessError as e:
		sys.stderr.write("Process failed")
		sys.stderr.write(e.output)
		process_ok = False
		data = { "success": "false", "error": "Program failed. Check logs." }
	
	
	if p.returncode==18:
		data = { "success": "false", "error": "Timeout. No serial data received in the last 10 seconds." }
	elif p.returncode==17:
		data = { "success": "false", "error": "Error. Malformed configuration." }
	elif p.returncode==16:
		data = { "success": "false", "error": "Error. 3 phase nodes must be multiples of 3." }

	#if debug and process_ok:
		#sys.stderr.write(p.stdout.decode())
		
	
	return data


