import time
import asyncio
from tasks import ATask
from ws.message import MsgIo
from components import ATemperatureSensor
from components import AHeater
from components import APid
from tracer import Tracer

import numpy as np
import scipy.io
import os


class TracerTask(ATask):
	def __init__(self, sensor: ATemperatureSensor, heater: AHeater, temp_ctrl: APid, tracer: Tracer, interval, msg_handler: MsgIo, path= './logs'):
		ATask.__init__(self, interval)
		if not os.path.exists(path):
			os.makedirs(path)

		self.msg_handler = msg_handler
		msg_handler.set_recv_handler(self.recv)

		self.sensor = sensor
		self.heater = heater
		self.temp_ctrl = temp_ctrl
		self.tracer = tracer
		self.path = path

	async def recv(self, data):
		pass

	async def send(self, data):
		await self.msg_handler.send(data)

	async def on_process(self):
		print("{}: Started with interval {} s".format(self.msg_handler.get_key(), self.interval))

		timestamp = 0
		_timestamp = np.empty(0)
		_sensor_temp = np.empty(0)
		_heater_power = np.empty(0)
		_tc_temp_ist = np.empty(0)
		_tc_dtemp_ist = np.empty(0)
		_tc_temp_soll = np.empty(0)
		_tc_dtemp_soll = np.empty(0)
		_tc_dtemp_commanded = np.empty(0)

		name = 'brewpi'
		filename = os.path.join(self.path, '') + name + ".mat"
		filename_full = os.path.join(self.path, '') + name + "." + time.strftime("%Y%m%d%H%M%S", time.localtime()) + ".mat"

		while True:
			self.tracer.process()

			_timestamp = np.append(_timestamp, timestamp)
			_sensor_temp = np.append(_sensor_temp, self.sensor.temperature())
			_heater_power = np.append(_heater_power, self.heater.get_power())
			_tc_temp_ist = np.append(_tc_temp_ist, self.temp_ctrl.theta_ist)
			_tc_dtemp_ist = np.append(_tc_dtemp_ist, max(-1, self.temp_ctrl.heatrate_ist))
			_tc_temp_soll = np.append(_tc_temp_soll, self.temp_ctrl.theta_soll_set)
			_tc_dtemp_soll = np.append(_tc_dtemp_soll, self.temp_ctrl.heatrate_soll_set)
			_tc_dtemp_commanded = np.append(_tc_dtemp_commanded, self.temp_ctrl.heatrate_soll)

			data = {'time': _timestamp, 'sensor_temp': _sensor_temp, 'heater_power': _heater_power, 'tc_temp_ist': _tc_temp_ist, 'tc_dtemp_ist': _tc_dtemp_ist, 'tc_temp_soll': _tc_temp_soll, 'tc_dtemp_soll': _tc_dtemp_soll, 'tc_dtemp_commanded': _tc_dtemp_commanded}

			scipy.io.savemat(filename, data)
			scipy.io.savemat(filename_full, data)
			timestamp += 1
			await asyncio.sleep(self.interval)


