#' aktualisiere_grafiken.R
#' 
#' Enthält die Funktionen: 
#' 


#--- Grafikfunktionen ----
generiere_auszählungsbalken <- function(anz = gezaehlt,max_s = stimmbezirke_n,ts = ts) {
  fortschritt <- floor(anz/max_s*100)
  annotate_str <- paste0("Ausgezählt sind ",
                         # Container Fake-Balken
                         "<span style='height:24px;display: flex;justify-content: space-around;align-items: flex-end; width: 100%;'>",
                         # Vordere Pufferzelle 70px
                         "<span style='width:70px; text-align:center;'>",
                         anz,
                         "</span>",
                         # dunkelblauer Balken
                         "<span style='width:",
                         fortschritt,
                         "%; background:#002747; height:16px;'></span>",
                         # grauer Balken
                         "<span style='width:",
                         100-fortschritt,
                         "%; background:#CCC; height:16px;'></span>",
                         # Hintere Pufferzelle 5px
                         "<span style='width:5px;'></span>",
                         # Ende Fake-Balken
                         "</span>",
                         "<br>",
                         " von ",max_s,
                         " Stimmbezirken - ",
                         "<strong>Stand: ",
                         format.Date(ts, "%d.%m.%y, %H:%M Uhr"),
                         "</strong>"
  )
  
}

notes_text_auszaehlung <- function(anz = gezaehlt,max_s = stimmbezirke_n,ts = ts,...) {
  sd <- as_datetime(startdatum)
  if (ts >= sd) {
    return(paste0(...,generiere_auszählungsbalken(anz,max_s,ts)))
  } else {
    return(paste0(...,
                  "Auszählung beginnt am ",
                  format(sd,"%A, %d. %B %Y, %H:%M Uhr")))
  }
}

#---- Daten-Kopierfunktionen ----

# Kopiere Livedaten-Ordner in das Google Bucket
aktualisiere_bucket_alle <- function() {
  if (SERVER) {
    n <- now()
    system('gsutil -m -h "Cache-Control:no-cache, max_age=0" cp livedaten/* gs://d.data.gcp.cloud.hr.de/livedaten/')
    copy_time <- now()-n
    return(copy_time)
  } else return(NA)
}

# Kopiere nur die Direktkandidaten der Kreise
aktualisiere_bucket_kreise_direkt <- function() {
  if (SERVER) {
    n <- now()
    system('gsutil -m -h "Cache-Control:no-cache, max_age=0" cp livedaten/wk*_direkt.* gs://d.data.gcp.cloud.hr.de/livedaten/')
    copy_time <- now()-n
    return(copy_time)
  } else return(NA)
}


#---- Metadaten-Anpassungsfunktionen ----

#' metadaten_balken
#' 
#' Kopiert die Metadaten-Anpassungen aus der Parteien-Tabelle in die Balkengrafik, 
#' vor allem die Farben. 
#' 


#---- Grafiken einrichten ----

kreise_direkt_saeulen <- function() {
  for (wahlkreis in 1:55) {
    wk_str <- formatC(wahlkreis, width = 3,format="fg", flag="0")
    # Hole eine Grafik
    fname <- datawrapper_ids_df %>% filter(id == wk_str) %>% 
      pull(fname) %>% first()
    dw_id <- datawrapper_ids_df %>% filter(id == wk_str) %>% 
      pull(dw_id) %>% first()
    
    kand_df <- direktkandidaten_df %>% filter(wk == wahlkreis)
    farbliste <- setNames(as.list(kand_df$farbwert), 
                          kand_df$name)
    meta <- dw_retrieve_chart_metadata(dw_id)
    viz <- meta$content$metadata$visualize
    # Balkengrafik
    viz$`custom-colors` <- farbliste
    viz$`x-grid-format` <- "0.0%"
    viz$`custom-range`[[1]] <- "0"
    viz$`custom-range`[[2]] <- "50"
    
    # Visual-Metadaten hochladen
    dw_edit_chart(dw_id,visualize = viz)
    #
    title <- paste0("Wahlkreis ",wahlkreis," - ",
                    kand_df %>% pull(wk_name) %>% first,
                    ": Stimmen fürs Direktmandat")
    kand_str <- paste0(kand_df %>% tail(nrow(.)-5) %>% 
                         mutate(n = paste0(name,": 0,0%")) %>% pull(n),
                            collapse = ", ")
    # Metadaten anlegen
    forced_meta <- list()
    forced_meta[["title"]] <- title
    forced_meta[["describe"]][["intro"]] <- "Bisher gezählte Stimmanteile für das Direktmandat im Wahlkreis; fünf erste Kandidierende von der Liste"
    forced_meta[["describe"]][["byline"]] <- "Jan Eggers/Sandra Kiefer"
    forced_meta[["describe"]][["source-url"]] <- "Hessisches Statistisches Landesamt"
    forced_meta[["describe"]][["source-name"]] <- "https://wahlen.hessen.de/landtagswahlen"
    forced_meta[["annotate"]][["notes"]] <- paste0(ifelse(nchar(kand_str) > 0,
                                                   "Sonstige: ",
                                                   ""),
                                                   kand_str,"<br><br>",
    # hier später der Auszählungsbalken                                              
      "Auszählung beginnt am 8.10.2023, 18 Uhr")
    # Liste in JSON - der force-Parameter ist nötig, weil R sonst darauf
    # beharrt, dass es mit der S3-Klasse dw_chart nichts anfangen kann
    # (obwohl die eine ganz normale Liste ist)
    forced_meta_json <- toJSON(forced_meta,force=T)
    write(forced_meta_json,
          paste0("livedaten/",fname,".json"))
    
    # CSV anlegen
    # Im Prinzip: Eine leere Kandidatenliste für den Wahlkreis
    kand_list_df <- kand_df %>%
      mutate(prozent = 0.0) %>% 
      select(name,prozent) %>% 
      head(5)
    write_csv(kand_list_df,paste0("livedaten/",
                                  fname,
                                  ".csv"))
    
  }
  
}

  
#' gemeinde_direkt_tabelle()
#' 
#' Passt die Metadaten der Landesstimmen-Grafiken an:
#' - Farbtabelle für Barcharts in das Vorbild laden
#' - Vorbild-Visualize-Metadaten klonen
#' - Data-Daten klonen 
#' - Daten überschreiben
#' - Livedaten generieren
#' Die haben 3 Spalten (Partei, Veränderung, prozentplusminus)
gemeinde_direkt_tabelle <- function() {
  # Vorbild-Metadaten laden
  source_meta <- dw_retrieve_chart_metadata(dw_template4)
  viz <- source_meta$content$metadata$visualize
  # Farbliste mit allen Partei-IDs - ruhig die lange
  farbliste <- setNames(as.list(partei_idx_df$farbwert), 
                        parteien_idx_df$name)
  viz[["columns"]][["stimmen"]][["customColorBarBackground"]] <- farbliste
  viz[["columns"]][["stimmen"]][["customBarColorBy"]] <- "partei"
  gemeinden_v <- gemeinden_alle_df %>% 
    filter(!(AGS %in% staedte_v)) %>% 
             pull(AGS)
  for (g in gemeinden_v) {
    # Hole den "letzten" (also den zweiten) Eintrag zu dieser AGS
    fname <- datawrapper_ids_df %>% filter(id == g) %>% 
      pull(fname) %>% last()
    dw_id <- datawrapper_ids_df %>% filter(id == g) %>% 
      pull(dw_id) %>% last()
    gemeinde_name <- gemeinden_alle_df %>% filter(AGS == g) %>% pull(name)
    wk <- gemeinden_alle_df %>% filter(AGS == g) %>% pull(wk)
    wk_name <- gemeinden_alle_df %>% filter(AGS == g) %>% pull(wk_name)
    
    # Visual-Metadaten hochladen
    old_metadata <- dw_retrieve_chart_metadata(dw_id) 
    # Neuen Listeneintrag mit den visualize-Metadaten unter der id generieren
    dat <- old_metadata$content$metadata$data
    # Metadaten überschreiben
    # Livedaten, URL in den Data-Zweig kopieren
    dat[["upload-method"]]= "external-data"
    dat[["external-data"]] = paste0("https://d.data.gcp.cloud.hr.de/livedaten/",
                                    fname,
                                    ".csv")
    dat[["external-metadata"]] = paste0("https://d.data.gcp.cloud.hr.de/livedaten/",
                                        fname,
                                        ".json")
    dat[["use-datawrapper-cdn"]] = FALSE
    # 
    dw_edit_chart(dw_id, data = dat, visualize = viz)

    
    title <- paste0(gemeinde_name, ": Landesstimmen")
    intro <- paste0("Zweitstimmen in ",gemeinde_name,", alle Wahllisten, in der Reihenfolge vom Wahlzettel. ",
                    "Werte in Klammern geben die Differenz zur letzten Wahl 2018 an.")
    # Metadaten anlegen
    forced_meta <- list()
    forced_meta[["title"]] <- title
    forced_meta[["describe"]][["intro"]] <- intro
    forced_meta[["describe"]][["byline"]] <- "Jan Eggers/Sandra Kiefer"
    forced_meta[["describe"]][["source-url"]] <- "Hessisches Statistisches Landesamt"
    forced_meta[["describe"]][["source-name"]] <- "https://wahlen.hessen.de/landtagswahlen"
    forced_meta[["annotate"]][["notes"]] <- notes_text_auszaehlung(0,0,as_datetime(startdatum) - days(1))
      
    # Liste in JSON - der force-Parameter ist nötig, weil R sonst darauf
    # beharrt, dass es mit der S3-Klasse dw_chart nichts anfangen kann
    # (obwohl die eine ganz normale Liste ist)
    forced_meta_json <- toJSON(forced_meta,force=T)
    write(forced_meta_json,
          paste0("livedaten/",fname,".json"))
    
    # CSV anlegen
    # Im Prinzip: Eine leere Parteienliste für den Wahlkreis
    part_list_df <- parteien_listen_df %>%
      mutate(stimmen = 0) %>%
      mutate(prozent = "0,0% (+0)") %>% 
      mutate(wk = wk) %>% 
      select(partei,stimmen,prozent,wk) 
    write_csv(kand_list_df,paste0("livedaten/",
                                  fname,
                                  ".csv"))
    #---------- Letzte Aktion: Neu publizieren ----
    dw_publish_chart(dw_id)
  }
}


# Lies s


#

#' copy_visuals 
#' 
#' @description 
#' Kopiert die visual-Metadaten von einer Vorlage-Grafik auf alle anderen in der Liste.
#' Sichert die überschriebenen Visuals in einer Liste - und gibt die zurück.
copy_visuals <- function(dw_source,dw_id_v) {
  # Vorbild-Grafik auslesen
  source_meta <- dw_retrieve_chart_metadata(dw_source)
  meta_backup <- list()
  # visualize-Zweig extrahieren
  vis <- source_meta$content$metadata$visualize
  for (id in dw_id_v) {
    old_metadata <- dw_retrieve_chart_metadata(id) 
    # Neuen Listeneintrag mit den visualize-Metadaten unter der id generieren
    meta_backup[[id]] <- old_metadata$content$metadata$visualize
    # Metadaten überschreiben
    dw_edit_chart(id, visualize = vis)
  }
  return(meta_backup)
}

#' copy_fix_data 
#' 
#' @description 
#' Holt sich die Dateinamen für die externen Quellen und überschreibt die Einstellungen
#' so, dass das externe CSV / Metadaten-JSON gezogen wird. 
fix_data <- function(dw_id_v) {
  for (did in dw_id_v) {
    old_metadata <- dw_retrieve_chart_metadata(did) 
    # Neuen Listeneintrag mit den visualize-Metadaten unter der id generieren
    dat <- old_metadata$content$metadata$data
    # fname aus Tabelle holen
    fname <- datawrapper_ids_df %>% filter(dw_id == did) %>% pull(fname)
    # Metadaten überschreiben
    # Livedaten, URL in den Data-Zweig kopieren
    dat[["upload-method"]]= "external-data"
    dat[["external-data"]] = paste0("https://d.data.gcp.cloud.hr.de/livedaten/",
                                    fname,
                                    ".csv")
    dat[["external-metadata"]] = paste0("https://d.data.gcp.cloud.hr.de/livedaten/",
                                              fname,
                                              ".json")
    dat[["use-datawrapper-cdn"]] = FALSE
    # 
    dw_edit_chart(did, data = dat)
    dw_publish_chart(did)
  }
  return(TRUE)
}



write_meta_json <- function(fname,title,intro,notes) {
  # Metadaten anlegen
  forced_meta <- list()
  forced_meta[["title"]] <- new_dw$content$title
  forced_meta[["describe"]][["intro"]] <- new_dw$content$metadata$describe$intro
  forced_meta[["describe"]][["byline"]] <- "Jan Eggers/Sandra Kiefer"
  forced_meta[["describe"]][["source-url"]] <- "Hessisches Statistisches Landesamt"
  forced_meta[["describe"]][["source-name"]] <- "https://wahlen.hessen.de/landtagswahlen"
  forced_meta[["annotate"]][["notes"]] <- "Auszählung beginnt am 8.10.2023, 18 Uhr"
  # Liste in JSON - der force-Parameter ist nötig, weil R sonst darauf
  # beharrt, dass es mit der S3-Klasse dw_chart nichts anfangen kann
  # (obwohl die eine ganz normale Liste ist)
  forced_meta_json <- toJSON(forced_meta,force=T)
  write(forced_meta_json,
        paste0("livedaten/",fname,".json"))
}

write_data_csv <- function(fname,data)
#---- Hauptfunktionen ----


#' aktualisiere_kreise_direkt
#' 
#' Erwartet ein langes Dataframe mit den Ergebnissen nach Partei
#' und kopiert 
aktualisiere_kreise_direkt <- function(live_long_df, wk_v = c(1:55)) {
  # Gehe durch die Wahlkreis-IDs und suche die passenden Wahlkreisdaten
  for (i in wk_v) {
    wahlkreis_df <- live_long_df %>% filter()
  }
}

aktualisiere_kreise_landesstimmen <- function(live_df) {
  
}

aktualisiere_gemeinden_direkt <- function(live_df) {
  
}

aktualisiere_gemeinden_landesstimmen <- function(live_df) {
  
}

aktualisiere_staedte_landesstimmen <- function(live_df){
  
}

aktualisiere_hessen_landesstimmen <- function(live_df){
  
}