import numpy as np
import time

class MockSerial:
  def __init__(self):
    self.humidity = np.zeros(100)
    self.humidifier_on = False
    self.humidity[:] = 80
    self.humidity[-1] = 20
    self.humidity[0] = 20

  def flush(self):
    pass

  def write(self, msg):
    if msg == b'h':
      print("mock hum toggle")
      self.humidifier_on = not self.humidifier_on

  def read(self, _):
    t = time.time()
    temp = 25 + np.sin(0.01*2*np.pi*t) + 0.5*np.sin(0.0001*2*np.pi*t + 7)

    # very janky model of humidity diffusion
    # fix end conditions
    for _ in range(20):
      self.humidity[-1] = 0.2*20 + 0.8*self.humidity[-2]
      self.humidity[0] = 20
      if self.humidifier_on:
        self.humidity[20] = 2
      # use the gradient to determine the change in humidity
      avg = 0.5*(self.humidity[:-2] + self.humidity[2:])
      self.humidity[1:-1] += 0.10*(avg - self.humidity[1:-1])
    #print(self.humidity)

    humidity = self.humidity[60] + np.random.random()*0.003
    if self.humidifier_on:
      hv = 3.3
    else:
      hv = 0.0
    return bytes("{},{},{}\n".format(humidity, temp, hv), "utf8")