library(readr)
library(lubridate)
library(tidyr)
library(stringr)
library(dplyr)
library(DatawRappr)

rm(list=ls())


source("R/messaging.R")
source("R/lies_aktuellen_stand.R")
source("R/aktualisiere_karten.R")
source("R/generiere_balken.R")  


#----aktualisiere_fom() ----
# fom ist das "Feldmann-o-meter", die zentrale Grafik mit dem Stand der Auszählung.

aktualisiere_fom <- function(wl_url = wahllokale_url) {
  
  # Einlesen: Feldmann-o-meter-Daten so far. 
  # Wenn die Daten noch nicht existieren, generiere ein leeres df. 
  if(file.exists("daten/fom_df.rds")) {
    fom_df <- readRDS("daten/fom_df.rds")
  } else {
    # Leeres df mit einer Zeile
    fom_df <- tibble(zeitstempel = as_datetime(startdatum),
                           meldungen_anz = 999,
                           meldungen_max = 575,
                           # Ergebniszellen
                           wahlberechtigt = 0,
                           # Mehr zum Wahlschein hier: https://www.bundeswahlleiter.de/service/glossar/w/wahlscheinvermerk.html
                           waehler_regulaer = 0,
                           waehler_wahlschein = 0,
                           waehler_nv = 0,
                           stimmen = 0,
                           stimmen_wahlschein = 0, 
                           ungueltig = 0,
                           gueltig = 0,
                           ja = 0,
                           nein = 0)
    # SAVE kann man sich schenken; df ist schneller neu erzeugt
    # save(feldmann_df,"daten/feldmann_df.rda")
  }
  # Daten zur Sicherheit sortieren, dann die letzte  Zeile rausziehen
  letzte_fom_df <- fom_df %>% 
    arrange(zeitstempel) %>% 
    tail(1)
  # Neue Daten holen (mit Fehlerbehandlung)
  wahllokale_df <- lies_gebiet(wl_url) 
  neue_fom_df <- wahllokale_df %>% 
    # Namen raus
    select(-name,-nr) %>% 
    # Daten aufsummieren
    summarize(zeitstempel = last(zeitstempel),
      across(2:ncol(.), ~ sum(.,na.rm=T)))
  # Alte und neue Daten identisch? Dann brich ab. 
  if (vergleiche_stand(letzte_fom_df,neue_fom_df)) {
    return(FALSE)
  } else {
    # Archiviere die Rohdaten 
    archiviere(wahllokale_df,"daten/wahllokale/")
    # Ergänze das fom_df um die neuen Daten und sichere es
    fom_df <- fom_df %>% bind_rows(neue_fom_df)
    saveRDS(fom_df,"daten/fom_df.rds")
    # Bilde das Dataframe
    # Sende die Daten an Datawrapper und aktualisiere
    fom_dw_df <- fom_df %>% 
      mutate(ausgezählt = wahlberechtigt / ffm_waehler *100) %>% 
      mutate(prozent30 = wahlberechtigt * 0.3) %>% 
      mutate(quorum = ja / wahlberechtigt * 100) %>% 
      select(ausgezählt, wahlberechtigt, ungueltig, ja, nein, quorum, prozent30) %>% 
      # Noch den Endpunkt der 30-Prozent-Linie
      bind_rows(tibble(ausgezählt = 100, prozent30 = ffm_waehler * 0.3))
    dw_data_to_chart(fom_dw_df,fom_id)
    # Parameter setzen
    alles_ausgezählt <- (neue_fom_df$meldungen_max == neue_fom_df$meldungen_anz)
    if (neue_fom_df$meldungen_anz == 0) {
      quorum = 0
      feldmann_str <- "Es liegen noch keine Auszählungsdaten des Bürgerentscheids vor."
    } else {
      quorum <- (neue_fom_df$ja / neue_fom_df$wahlberechtigt * 100)
      if (quorum >= 30) {
        if (alles_ausgezählt ) {
          feldmann_str <- "Peter Feldmann ist als OB abgewählt."
        } else {
          feldmann_str <- "Nach dem derzeitigen Auszählungsstand wäre Peter Feldmann als OB abgewählt."
        }
      } else {
        if (alles_ausgezählt ) {
          feldmann_str <- "Peter Feldmann bleibt OB von Frankfurt."
        } else {
          feldmann_str <- "Nach dem derzeitigen Auszählungsstand wäre Peter Feldmann als OB abgewählt."
        }
      }
    }
    
    # Breite des Balkens: Wenn das Quorum erreicht ist, hat er die volle Breite,
    # wenn nicht, einen Anteil von 30%, um die Entfernung von der Markierung zu zeigen
    
    # Jetzt die Beschreibungstexte mit den Fake-Balkengrafiken generieren
    beschreibung_str <- paste0(
      "Die Abwahl ist beschlossen, wenn mindestens 30 Prozent aller Wahlberechtigten mit &quot;Ja&quot; stimmen.<br/><br>",
      "<b style='font-weight:700;font-size:120%;'>",
      # Erste dynamisch angepasste Textstelle: Bleibt Feldmann?
      feldmann_str,
      "</b><br/><br>",
      generiere_balken(wb = neue_fom_df$wahlberechtigt,
                       ja = neue_fom_df$ja,
                       nein = neue_fom_df$nein,
                       auszählung_beendet = alles_ausgezählt))
    annotate_str <- generiere_auszählungsbalken(
      ausgezählt = floor(neue_fom_df$wahlberechtigt / ffm_waehler * 100),
      anz = neue_fom_df$meldungen_anz,
      max = neue_fom_df$meldungen_max,
      ts = neue_fom_df$zeitstempel
    )
    dw_edit_chart(fom_id,intro = beschreibung_str,annotate = annotate_str)
    dw_publish_chart(fom_id)
    return(TRUE)
  }
}


#---- MAIN ----
# Ruft aktualisiere_fom() auf
# (die dann wieder aktualisiere_karten() aufruft)
check = tryCatch(
  { 
    neue_daten <- aktualisiere_fom(wahllokale_url)
  },
  warning = function(w) {teams_warning(w,title="Feldmann: fom")},
  error = function(e) {teams_warning(e,title="Feldmann: fom")})
# Neue Daten? Dann aktualisiere die Karten
if (neue_daten) {
  check = tryCatch(
    { 
      neue_daten <- aktualisiere_karten(wahllokale_url)
    },
    warning = function(w) {teams_warning(w,title="Feldmann: Karten")},
    error = function(e) {teams_warning(e,title="Feldmann: Karten")})
  if (neue_daten) {
    # Alles OK, letzte Daten nochmal holen und ausgeben
    fom_df <- readRDS("daten/fom_df.rds") %>% 
      arrange(zeitstempel) %>% 
      tail(1)
    if(fom_df$meldungen_anz > 0) {
      fom_update_str <- paste0(
        "<strong>Update OK</strong><br/><br/>",
        fom_df$meldungen_anz," von ",fom_df$meldungen_max," Wahllokale ausgezählt ",
        "<ul><li><strong>Quorum zur Abwahl ist derzeit",
        ifelse(fom_df$ja / fom_df$wahlberechtigt < 0.3, " nicht ", " "),
        "erreicht</strong></li>",
        "<li><strong>Anteil der Ja-Stimmen an den Wahlberechtigten: ",
        format(fom_df$ja / fom_df$wahlberechtigt * 100,decimal.mark=",",big.mark=".",nsmall=1, digits=3),
        "</li><li>Ja-Stimmen: ",
        format(fom_df$ja,decimal.mark=",",big.mark=".",nsmall=1, digits=3),
        "</li><li>Nein-Stimmen: ",
        format(fom_df$nein,decimal.mark=",",big.mark=".",nsmall=1, digits=3),
        "</li><li>Verhältnis Ja:Nein: ",
        format(fom_df$ja / (fom_df$ja + fom_df$nein),decimal.mark=",",big.mark=".",nsmall=1, digits=3),"% : ",
        format(fom_df$nein / (fom_df$ja + fom_df$nein),decimal.mark=",",big.mark=".",nsmall=1, digits=3),"%</li></ul>",
        format(fom_df$ja / fom_df$wahlberechtigt,decimal.mark=",",big.mark=".",nsmall=1, digits=3),
      )
      teams_meldung(fom_update_str,title="Feldmann-Referendum")

    }
  } else {
    teams_warning("Neue Wahllokal-Daten, aber keine neuen Ortsdaten?")
  }
} 
# Auch hier TRUE zurückbekommen;; alles OK?