#setup ----
  library(tidyverse)
  library(influxdbclient)
  library(rmarkdown)

if(Sys.info()[4] == "pseudotsuga") {
  setwd("~/Documents/dataProjects/laundry_status")
} else {
  setwd("/laundry_status")
}
Sys.setenv(TZ='America/Chicago')
# parameters needed to make connection to Database
token <- substr(read_file("data/api_key"), 1, 88)
org = "home_assistant"
bucket = "home_assistant"
## make connection to the influxDB bucket
home_assistant <- InfluxDBClient$new(url = "https://influxdb.dendroalsia.net",
                                     token = token,
                                     org = org)
update_interval <- 5
cronjob_interval <- 60
# ---- set variables
entities <- data.frame(name = c("washing machine", "dryer"), entity_id = c("lamp_a_power", "lamp_b_power"))

update_data <- function(){
  
  values <- home_assistant$query('from(bucket: "home_assistant") |> range(start: -7d) |> filter(fn: (r) => r["entity_id"] == "lamp_b_power" or r["entity_id"] == "lamp_a_power") |> filter(fn: (r) => r["_field"] == "value") |> filter(fn: (r) => r["_measurement"] == "W")',
                                 POSIXctCol = NULL)
  values <- bind_rows(values)
  values <- values %>%
    rename(value = "_value",
           time = "_time")
  values <- values %>%
    mutate(
      time = as.POSIXct(time, tz = "America/Chicago"),
      status = ifelse(value > 1, "on", "off")) %>%
    mutate(end_time = time + minutes(1))
  
  washer_last_on <- values %>% filter(entity_id == entities$entity_id[1], value > 5) %>% tail(1) %>% pull(time)
  washer_last_off <- values %>% filter(entity_id == entities$entity_id[1], value < 5) %>% tail(1) %>% pull(time)
  
  dryer_last_on <- values %>% filter(entity_id == entities$entity_id[2], value > 5) %>% tail(1) %>% pull(time)
  dryer_last_off <- values %>% filter(entity_id == entities$entity_id[2], value < 5) %>% tail(1) %>% pull(time)
  # ---- generate html
  current_status <- as.list(NULL)
  for (entity in entities$entity_id){
    current_status[[entity]] <- ifelse(values %>% filter(entity_id %in% entity) %>% tail(1) %>% pull(value) > 5, "on", "off")
  }
  
  plot_1week <- ggplot(data = values) +
    geom_rect(aes(xmin = end_time,
                  xmax = time,
                  ymin = ifelse(entity_id == "lamp_a_power", 0, 2) + 0.5,
                  ymax = ifelse(entity_id == "lamp_a_power", 0, 2) + 1.5,
                  fill = status)) +
    scale_y_continuous()  +
    scale_x_datetime(date_breaks = "24 hours", date_labels = '%A', date_minor_breaks = "6 hours") +
    theme(axis.text.x = element_text(angle = 30, vjust = 0.5)) +
    labs(title = "Last week")
  
  plot_1day <- ggplot(data = values %>% filter(time >= max(values$time) - hours(24))) +
    geom_rect(aes(xmin = end_time,
                  xmax = time,
                  ymin = ifelse(entity_id == "lamp_a_power", 0, 2) + 0.5,
                  ymax = ifelse(entity_id == "lamp_a_power", 0, 2) + 1.5,
                  fill = status)) +
    scale_y_continuous()  +
    scale_x_datetime(breaks = seq(round_date(max(values$time), "4 hours") - hours(24), round_date(max(values$time), "4 hours"), by = "4 hours"), date_labels = '%I:%M %p', date_minor_breaks = "1 hours") +
    theme(axis.text.x = element_text(angle = 30, vjust = 0.5)) +
    labs(title = "Last 24 hours")
  
  render("laundry_status.Rmd",
         output_dir = "html",
         output_file = "index.html")

}

for(i in 1:(cronjob_interval/update_interval)){
  message(Sys.time())
  update_data()
  Sys.sleep(60*update_interval)
}