#include "esphome.h"
#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

struct Valve {
  gpio_num_t open_pin;
  gpio_num_t close_pin;
  bool open;
  bool motor_running;
};

static Valve valve = {
  .open_pin = GPIO_NUM_19,
  .close_pin = GPIO_NUM_18,
  .open = false,
  .motor_running = false,
};


void boot() {
  gpio_set_direction(GPIO_NUM_19, GPIO_MODE_OUTPUT);
  gpio_set_level(GPIO_NUM_19, 1);
  gpio_set_direction(GPIO_NUM_18, GPIO_MODE_OUTPUT);
  gpio_set_level(GPIO_NUM_18, 1);
  valve = {
    .open_pin = GPIO_NUM_19,
    .close_pin = GPIO_NUM_18,
    .open = false,
    .motor_running = false,
  };
}

bool valveState() {
  return valve.open;
}

void valve_task(void *pvParameters) {
  gpio_num_t PIN = valve.open_pin;

  if (valve.open) {
    ESP_LOGI("custom", "Valve opening");
    PIN = valve.open_pin;

  } else {
    ESP_LOGI("custom", "Valve closing");
    PIN = valve.close_pin;
  }

  gpio_set_level(PIN, 0);

  vTaskDelay(pdMS_TO_TICKS(10000));

  gpio_set_level(PIN, 1);

  ESP_LOGI("custom", "Valve no longer running");

  valve.motor_running = false;

  vTaskDelete(NULL);
}

void switchValve() {
  if (valve.motor_running) {
    return;
  }

  valve.motor_running = true;

  valve.open = !valve.open;

  xTaskCreate(
      valve_task,
      "valve_task",
      2048,
      NULL,
      1,
      NULL
  );
}