library(tidyverse)
library(readxl)
library(writexl)
library(haven)
library(XML)
library(zoo)

# Abschnitt 0: Daten laden ----

# Daten laden aus der Datenbank Bürgerbegehren (Bergische Universität Wuppertal)
# (Auszug vom 17.10.2024, Scientific Use File)

data_orig<-read_xlsx("data/db_auszug-17-10-24.xlsx", skip = 2)

# Hinweis zu Pfaden: Alle Pfade sind relativ zum Projektverzeichnis angegeben ("data/").

# Abschnitt 1: Datenaufbereitung ----

## Abschnitt 1.1: Identifikation und Klassifizierung relevanter Energiewendevorhaben ----

data_sub<-data_orig%>%
  rename(ThemaBeschreibung=`Thema-Bürgerbegehren`)%>%
  mutate(ThemaBeschreibung = gsub('^ | $', "", ThemaBeschreibung))%>% #Leerzeichen am Anfang und Ende entfernen
  # Umbenennung von Gemeinden, deren Namen sich geändert haben usw.
  mutate(Ort = case_when(
    Ort == "Arnstedt (Ortsteil von Arnstein, ehem. selbstständig)" ~ "Arnstein",
    Ort == "Böcke (Ortsteil von Wenzlow, ehem. selbstständig)" ~ "Wenzlow",
    Ort == "Gröbzig (Ortsteil von Südliches Anhalt, ehem. selbstständig)" ~ "Südliches Anhalt",
    Ort == "Kühren-Burkartshain (OT von Wurzen bei Leipzig, ehem. selbstständig)" ~ "Wurzen bei Leipzig",
    Ort == "Feldberg (ehemals selbstständig)" ~ "Feldberg",
    Ort == "Friedersdorf, Oderbruch (Ortsteil von Vierlinden, ehem. selbstständig)" ~ "Vierlinden",
    Ort == "Günthersleben-Wechmar (Ortsteil von Drei Gleichen, ehem. selbstständig)" ~ "Drei Gleichen",
    Ort == "Testorf (ehem. selbstständig)" ~ "Testorf",
    Ort == "Cobbelsdorf (Ortsteil von Coswig (Anhalt), ehem. selbstständig)" ~ "Coswig (Anhalt)",
    Ort == "Köselitz (Ortsteil von Coswig/Anhalt, ehem. selbstständig)" ~ "Coswig (Anhalt)",
    Ort == "Senst (Ortsteil von Coswig/Anhalt, ehem. selbstständig)" ~ "Coswig (Anhalt)",
    TRUE ~ Ort  ))%>% 
  mutate(AGS=case_when(Ort=="Arnstein"~"15087031",
                       Ort=="Hamburg-Bergedorf"~"02000000",
                       Ort=="Südliches Anhalt"~"15082377",
                       Ort=="Wenzlow"~"12069648",
                       Ort=="Wurzen bei Leipzig"~"14729410",
                       Ort=="Feldberg"~"13071033",
                       Ort=="Vierlinden"~"12064482",
                       Ort=="Bad Camberg-Dombach"~"06533003",
                       Ort=="Drei Gleichen"~"16067089",
                       Ort=="Testorf"~"13074077",
                       Ort=="Coswig (Anhalt)"~"15091060",
                       T~as.character(AGS)))%>%
  #Identifikation von Energiewendevorhaben
  subset(!ThemaBeschreibung%in%c("Für  kostendeckende Vergütung für Strom aus Solaranlagen","Für kostendeckende Einspeisevergütung von Solarstrom","Gegen den geplanten Bau von vier Mastställen für insgesamt 160 000 Hühnchen bei der örtlichen Biogasanlage", "Gegen den Neubau des Wasserkraftwerks Kühberg" ))%>%
  mutate(tech=case_when(ThemaBeschreibung=="Gegen den Bau eines Wind- und eines Solarparks"~"Wind und PV",
                        str_detect(ThemaBeschreibung, "(?i)Windkraft|Windpark|Windräder|Windrad|Windenergi|Windeignungsraum|Windvorrangfläche|Windeignungsfläche|Windanlage")~"Wind",
                        str_detect(ThemaBeschreibung, "(?i)PV|Solar|Photovoltaik|Energieparks Kleinzössen")~"PV",
                        str_detect(ThemaBeschreibung, "(?i)Wasserkraft")~"Wasserkraft",
                        str_detect(ThemaBeschreibung, "(?i)geothermi")~"Geothermal_energy",
                        str_detect(ThemaBeschreibung, "(?i)Biomasse|Bio-energi|Biogas|Bioenergie|Bioethanol|Bio-Vergärung|Biovergärung|Verwertung biogener Reststoffe|Bioabfallvergärung|Bioerdgas|Biomüllvergasung|Biomüllvergärung")~"Bioenergy",
                        str_detect(ThemaBeschreibung, "(?i)Ladesäule")~"Ladesäulen",
                        str_detect(ThemaBeschreibung, "(?i)Erneuerbare Energien|alternatives Energiekonzept|Erneuerbare\\w Energien|Für eine klimaschonende, umweltverträgliche Energieversorgung|Ökostrom|Bürgerenergiegenossenschaft")~"Renewable_energy",
                        str_detect(ThemaBeschreibung, "(?i)Naturstromspeicher|Pumpspeicherkraftwerk")~"Stromspeicher",
                        str_detect(ThemaBeschreibung, "(?i)Hochspannungsnetz")~"Stromnetzausbau",
                        ThemaBeschreibung=="Für Verzicht von Erdgas bei der Fernwärmeerzeugung (\"Augsburg erdgasfrei\")"~"Renewable_energy",
                        ThemaBeschreibung=="Für Ausweisung eines klimaneutralen Gewerbegebiets (Schraienwiesen)"~"Allgemeine Klimaschutz",
                        str_detect(ThemaBeschreibung, "(?i)Fossilfreiheit der Stadtwerke")~"Renewable_energy",
                        T~NA
                        ))%>%
  subset(!is.na(tech))


## Abschnitt 1.2: Klassifizierung, ob die Beschreibungen der Energiewendevorhaben pro/anti Energiewende sind, sowie Klassifizierung des Ergebnisses ----

data_sub1<-data_sub%>%
  mutate(position=case_when(ThemaBeschreibung%in%c("Kein gemeindliches Einvernehmen mit Biogasanlage","Gegen den Grundsatzbeschluss zur Nutzung erneuerbarer Energien durch die Stadtwerke Havelberg GmbH",
                                                   "Änderung Flächennutzungsplan (Windkraftanlagen)","Abstimmung über den Bau einer Windkraftanlage","Bau neuer Windräder", 
                                                   "„Runter vom Acker, rauf aufs Dach“ - Für den Bau einer Freiflächen-Photovoltaikanlage auf Erkheimer Flur","Änderung Flächennutzungsplan (Windkraftanlagen)",
                                                   "Standortplanung Windkraftanlagen","Für neuen Standort für Windkraftanlage","Für den Standort des Biomasseheizwerkes an der Zinneberger Straße",
                                                   "Standortplanung Windkraftanlagen","Abstimmung über den Bau einer Windkraftanlage","Gegen Bebauungsplan für Windkraftanlagen ohne Bürgerbefragung")~"Unklar",
                            ThemaBeschreibung%in%c("Bürgerbegehren  „Weil Strom nicht satt macht – Stoppt Solarparks auf Äckern in Brüx und Mittelwasungen !","Nein zu Windräder",
                                                   "Stopp des Biomasseheizkraftwerks","Biomassekraftwerk in Au","Zum geplanten Geothermiekraftwerk",
                                                   "„Runter vom Acker, rauf aufs Dach“ - Für den Bau einer Freiflächen-Photovoltaikanlage auf Erkheimer Flur",
                                                   "Errichtung von Windkraftanlagen","Über die Verpachtung einer kommunalen Fläche zur Windenergieerzeugung",
                                                   "„Solaranlage Niederraunau“","Für eine Ausweisung von Windkraftstandorten durch Gailingen (und nicht im Verbund mit Büsingen und Gottmadingen)",
                                                   "Für Änderungen bei Abstandsregelung beim geplanten Bau von Windkraftanlagen","Stoppt Windräder in Landschaftsschutzgebieten und in der Nähe von Wohnhäusern (gegen Bürgerwindpark)",
                                                   "Für Austritt der Gemeinde aus der Energiegenossenschaft Reinhardswald (gegen Windpark)")~"Bürgerbegehren gegen das Energiewendeprojekt",
                            ThemaBeschreibung%in%c("Gegen zu hohes Windrad", "Gegen drei 175 m hohe Windkraftanlagen",
                                                   "Gegen Ermöglichung von zwei Windkraftanlagen als Bürgerwindpark (für Abstandsregelung 10H)",
                                                   "Für einen temporären Planungsstop beim Bau der Windräder")~"Bürgerbegehren für eine Einschränkung des Energiewendeprojekts",     
                            ThemaBeschreibung%in%c("BB: Für dezentrale Biogasanlagen im Landkreis","Bau neuer Windräder","Für Verzicht von Erdgas bei der Fernwärmeerzeugung (\"Augsburg erdgasfrei\")",
                                                   "Gegen das geplante Gas-Großkraftwerk, für alternatives Energiekonzept in Augsburg", "Über Windrad in Pellheim")~"Bürgerbegehren für das Energiewendeprojekt",
                            str_detect(ThemaBeschreibung, "(?i)Gegen")&str_detect(ThemaBeschreibung, "(?i)standort|neubau")~"Bürgerbegehren für eine Einschränkung des Energiewendeprojekts",
                            str_detect(ThemaBeschreibung, "(?i)Gegen|^Kein")~"Bürgerbegehren gegen das Energiewendeprojekt",
                            str_detect(ThemaBeschreibung, "Für")&str_detect(ThemaBeschreibung, "(?i)gegen|stop")~"Bürgerbegehren gegen das Energiewendeprojekt",
                            str_detect(ThemaBeschreibung, "Für")&str_detect(ThemaBeschreibung, "(?i)begrenz|abstand")~"Bürgerbegehren für eine Einschränkung des Energiewendeprojekts",
                            str_detect(ThemaBeschreibung, "(?i)Für")&str_detect(ThemaBeschreibung, "(?i)Maximalhöhe")~"Bürgerbegehren für eine Einschränkung des Energiewendeprojekts",
                            str_detect(ThemaBeschreibung, "Für größere Abstände|Für Mindestabstand|Für kleineren Windpark")~"Bürgerbegehren für eine Einschränkung des Energiewendeprojekts",
                            str_detect(ThemaBeschreibung, "^Für|für|Bau von Wind|^Windkraftan")~"Bürgerbegehren für das Energiewendeprojekt",
                            T~NA))%>%
  #Klassifizierung des Ergebnisses
  mutate(Ergebnis_EWP=case_when(Ergebnis%in%c("Kompromiss", "Nicht ermittelbar", "nur angekündigt", "Offen", "Unbekannt", "Unzulässig", "Versandet",
                                              "BB erreicht zu wenig Unterschriften", "BB nicht eingereicht", "BB nur öffentlich diskutiert", "BB zurückgezogen") & position!="Unklar"~"Weder erfolgreich noch gescheitert",
                                Ergebnis%in%c("BE im Sinne des Begehrens", "BE in Stichentscheid angenommen","Positiv erledigt durch neuen Gemeinderatsbeschluss" ) 
                                & position=="Bürgerbegehren für das Energiewendeprojekt" ~ "Erfolgreich",
                                Ergebnis%in%c("BE in Stichentscheid gescheitert/eingeschränkt", "BE nicht im Sinne des Begehrens", "BE unecht gescheitert/eingeschränkt") 
                                & position%in%c("Bürgerbegehren gegen das Energiewendeprojekt","Bürgerbegehren für eine Einschränkung des Energiewendeprojekts") ~ "Erfolgreich",
                                Ergebnis%in%c("BE in Stichentscheid gescheitert/eingeschränkt", "BE nicht im Sinne des Begehrens", "BE unecht gescheitert/eingeschränkt") 
                                & position=="Bürgerbegehren für das Energiewendeprojekt" ~ "Gescheitert/eingeschränkt",
                                Ergebnis%in%c("BE im Sinne des Begehrens", "BE in Stichentscheid angenommen",  "Positiv erledigt durch neuen Gemeinderatsbeschluss") 
                                & position%in%c("Bürgerbegehren gegen das Energiewendeprojekt") ~ "Gescheitert/eingeschränkt",
                                Ergebnis%in%c("BE im Sinne des Begehrens", "BE in Stichentscheid angenommen",  "Positiv erledigt durch neuen Gemeinderatsbeschluss") 
                                & position%in%c("Bürgerbegehren für eine Einschränkung des Energiewendeprojekts") ~ "Gescheitert/eingeschränkt",
                                T~"Nicht klassifizierbar"))#%>%
  #subset(position!="Unklar")


# Abschnitt 2: Verknüpfung zusätzlicher Dateien ----

# Funktion zum Einlesen und Transformieren jeder Datei
process_file <- function(file) {
  data <- read_excel(file)
  # Jahr in die erste Zeile setzen
  for (i in 4:ncol(data)){
    names(data)[i]  <- data[1,i] 
  }
  
  # In Langformat transformieren
  data_long <- data %>%
    pivot_longer(cols = -c(1:3),
                 names_to = "Jahr",
                 values_to = var)%>%
    drop_na(Kennziffer)
  
  return(data_long)
}

#Laden öffentlich zugänglicher statistischer Daten auf kommunaler/regionaler Ebene (relevanteste sind unten definiert)

    #Um Konsistenz und Datenqualität zu gewährleisten, haben wir uns bei den statistischen Daten, 
    #wie auch bei den Bürgerentscheiden auf den Zeitraum 2000 bis 2022 fokussiert.

    #Daten von Inkar (inklusive Beschreibung der finalen Codierung):
          #Grünenwähler:	Stimmenanteil von Bündnis 90/Die Grünen (in %) bei der vorangegangenen Bundestagswahl, 
              #die dem Bürgerentscheid am nächsten lag.
          #Frauen: Anteil der weiblichen Einwohnerinnen (in %).
          #Medianalter: Medianalter der Einwohner (in Jahren).
          #Medianeinkommen: Median des monatlichen Bruttoeinkommens von sozialversicherungspflichtigen
              #Vollzeitbeschäftigten (am Arbeitsort).
          #Geringer Bildungsstand: Anteil der Personen (in %) in diesem Kreis, die die Schule ohne 
              #Sekundarschulabschluss verlassen haben.
          #Hohe Einwohnerzahl:  Dummy-Variable = 1, wenn die Einwohnerzahl der Verwaltungseinheit über 
              #dem Medianwert der Einwohnerzahl aller in die Studie einbezogenen
              #Verwaltungseinheiten für das jeweilige Jahr liegt, andernfalls 0.
    #Quelle:
          #Bundesinstitut für Bau-, Stadt- und Raumforschung (2024a): INKAR - Indikatoren und Karten zur 
          #Raum- und Stadtentwicklung. Available online at https://www.inkar.de/, checked on 7/1/2025.
    
    #Daten vom BBSR (inklusive Beschreibung der finalen Codierung):
          #Ländlich (Urbanisierungsgrad): Dummy-Variable = 1, wenn die Verwaltungseinheit von der Europäischen Kommission 
              #als ländlich eingestuft wird, und 0 in allen anderen Fällen 
              #(d.h. in Gebieten mittlerer oder hoher Bevölkerungsdichte).
      #Quelle:
          #Bundesinstitut für Bau-, Stadt- und Raumforschung (BBSR) (2024b): Referenztabellen zu 
          #Raumgliederungen des BBSR. Gebietsstand 31.12.2022. Available online at 
          #https://www.bbsr.bund.de/BBSR/DE/forschung/raumbeobachtung/Raumabgrenzungen/downloads/download-referenzen.html.
    
    #Daten zu den Merkmalen der Gemeinde (Bundesland, Gemeindefläche, Kreis bzw. kreisfrei) wurden vom statistischen Bundesamt bezogen.

    #Daten vom Marktstammdatenregister (inklusive Beschreibung der finalen Codierung)
          #Mittlere installierte Leistung: Dummy-Variable = 1, wenn die Bruttoinstallationsleistung zwischen dem
              #ersten und dritten Quartil liegt, d.h. in den mittleren 50% der Leistungsverteilung für PV-, Wind-
              #und andere Projekte im Bereich erneuerbarer Energien in Deutschland im Jahr 2020, und andernfalls 0.
              #Die Bruttoinstallierte Leistung wird in kW/km² pro Jahr in der jeweiligen Verwaltungseinheit für
              #die Technologie geschätzt, auf die sich das vorgeschlagene Energiewendevorhaben bezieht, wobei zwischen 
              #PV, Windenergie und anderen Technologien für erneuerbare Energien (Bioenergie, Geothermie und nicht 
              #näher bezeichnete erneuerbare Energien) unterschieden wird.
              #Bei vorgeschlagenen Energiewendevorhaben, die sich auf nicht näher bezeichnete erneuerbare Energien 
              #beziehen, haben wir die Summe der installierten Leistung von PV, Windenergie, Bioenergie und 
              #Geothermie pro Jahr in dieser Verwaltungseinheit herangezogen.
    #Quelle: https://www.marktstammdatenregister.de/MaStR

## Abschnitt 2.1 Einlesen und Aufbereiten der Gemeindedaten ----

combined_data_gem<-NULL
# Funktion auf jede Variable anwenden
for (var in c("Gemeindefläche",
              "Durchschnittsalter",
              "Bevölkerung_weiblich",
              "Bevölkerung_männlich"
              )) {
  
  files <- list.files(path = "data/external_data", pattern = paste0("^",var,".*\\.xls$"), full.names = TRUE)

  data <- files %>%
    map_dfr(process_file)%>%
    dplyr::select(-Aggregat) 
  
  if (is.null(combined_data_gem)) {
    combined_data_gem <- data
  } else {
    combined_data_gem <- full_join(combined_data_gem, data, by = c("Kennziffer", "Raumeinheit",  "Jahr"))
  }
  
}

vars_gem<-c("Durchschnittsalter",
            "Gemeindefläche",
            "Bevölkerung_weiblich",
            "Bevölkerung_männlich")

# Daten aus Vorjahren
combined_data_gem1<-combined_data_gem%>%
  arrange(as.numeric(Jahr)) %>%  # Daten nach Jahr sortieren
  group_by(Kennziffer) %>%  
  mutate(across(all_of(c(vars_gem)), ~ zoo::na.locf(., na.rm = FALSE)))%>%
  mutate(across(all_of(c(vars_gem)), ~ zoo::na.locf(.,fromLast = TRUE, na.rm = FALSE)))%>%
  ungroup() %>%
  mutate_at(vars(Jahr), as.character)%>%
  rename(Fläche=Gemeindefläche)%>%
  unique()


saveRDS(combined_data_gem1, "data/combined_data_gem.rds")


## Abschnitt 2.2 Einlesen und Aufbereiten der Kreisdaten ----
combined_data_kreis<-NULL
# Funktion auf jede Variable anwenden
for (var in c("Median_einkommen",
              "ohne_Schulabschluss",
              "Wahlergebnisse_Grüne"
)) {
  
  files <- list.files(path = "data/external_data", pattern = paste0("^",var,".*\\.xls$"), full.names = TRUE)
  
  data <- files %>%
    map_dfr(process_file)#%>%
   #dplyr::select(-Aggregat)
  
  if (is.null(combined_data_kreis)) {
    combined_data_kreis <- data
  } else {
    combined_data_kreis <- full_join(combined_data_kreis, data, by = c("Kennziffer", "Raumeinheit", "Jahr"))
  }
  
}


vars_kreis<-c("Median_einkommen",
              "ohne_Schulabschluss",
              "Wahlergebnisse_Grüne")

# Daten aus Vorjahren
combined_data_kreis1<-combined_data_kreis%>%
  rename(Kennziffer_kreis=Kennziffer)%>%
  arrange(as.numeric(Jahr)) %>%  # Daten nach Jahr sortieren
  group_by(Kennziffer_kreis) %>%  
  mutate(across(all_of(c(vars_kreis)), ~ zoo::na.locf(., na.rm = FALSE)))%>%
  mutate(across(all_of(c(vars_kreis)), ~ zoo::na.locf(.,fromLast = TRUE, na.rm = FALSE)))%>%
  ungroup() %>%
  mutate_at(vars(Jahr), as.character)


saveRDS(combined_data_kreis1, "data/combined_data_kreis.rds")



data_sub2<-read_xlsx("data/clean_BB_data.xlsx")


## Abschnitt 2.3 Verknüpfung von Gemeinde- und Kreisdaten ----

# Daten vor der Verknüpfung aufbereiten
data_sub2<-data_sub2%>%
  mutate(Kennziffer_kreis = substr(AGS, 1, 5)) %>%
  rename(Kennziffer=AGS) %>%
  mutate_at(vars(Jahr,Kennziffer), as.character)

combined_data_gem<-combined_data_gem %>%
  mutate_at(vars(Jahr,Kennziffer), as.character)

# Daten verknüpfen
data_sub3<-left_join(data_sub2,unique(combined_data_kreis1), by = c("Kennziffer_kreis", "Jahr"))
data_sub4<-left_join(data_sub3,unique(combined_data_gem1), by = c("Kennziffer", "Jahr"))

# Variable Bevölkerung (Einwohnerzahl) erstellen
data_sub4<-data_sub4%>%
  mutate_at(vars(Bevölkerung_weiblich, Bevölkerung_männlich), as.numeric)%>%
  mutate(Bevölkerung=Bevölkerung_weiblich+Bevölkerung_männlich)%>%
  dplyr::select(-first, -last)


## Abschnitt 2.4: Einlesen und Aufbereiten der installierten Leistungsdaten ----

file_paths <- c("data/external_data/Solar_data_orig.RDS", 
                "data/external_data/Wind_data_orig.RDS", 
                "data/external_data/Bio_data_orig.RDS",
                "data/external_data/Geothermie_data_orig.RDS")


for (file_path in file_paths) {
  
  if (!file.exists(file_path)) {
    if (file_path=="data/external_data/Solar_data_orig.RDS") {
      
      solar_data_list <- list()
      solar_files <- list.files(path = "data/external_data", pattern = "^EinheitenSolar.*\\.xml$", full.names = TRUE) # Da es mehrere Datensätze für Solar gibt
      #solar_files_RDS <- list.files(path = "data/external_data", pattern = "^EinheitenSolar.*\\.RDS$", full.names = TRUE) 
      
      for (file in solar_files) {
          solar_data_list[[length(solar_data_list) + 1]] <- xmlToDataFrame(file)
      }
      
      Solar_data_orig <- do.call(rbind, solar_data_list)
      
      saveRDS(Solar_data_orig, file = "data/external_data/Solar_data_orig.RDS")
    } else {
      
      if (file_path=="data/external_data/Wind_data_orig.RDS") {
        file_path_XML<-"data/external_data/EinheitenWind.xml"
      } else {
        if (file_path=="data/external_data/Bio_data_orig.RDS") {
          file_path_XML<-"data/external_data/EinheitenBiomass.xml"
        } else {
          if (file_path=="data/external_data/Geothermie_data_orig.RDS") {
            file_path_XML<-"data/external_data/EinheitenGeothermieGrubengasDruckentspannung.xml"
        
          }
        }
      }
    
      data_file <- xmlToDataFrame(file_path_XML)
      saveRDS(data_file, file = file_path)
    }
  } else {
    #Datei laden
    
    file_name<-gsub(".*data/external_data/(.*)\\.RDS", "\\1", file_path)
    assign(file_name, readRDS(file_path))
    
  }
}



# Funktion zur Verarbeitung der Rohdaten für eine gegebene Technologie
process_tech_data <- function(data, tech_name) {
  # Schritt 1: Rohdaten aufbereiten
  processed_data <- data %>%
    filter(!is.na(Inbetriebnahmedatum)) %>%                             
    mutate(Jahr = substr(Inbetriebnahmedatum, 1, 4)) %>%                  
    mutate(Jahr = as.numeric(Jahr)) %>%
    filter(Jahr > 1979) %>%   #Jahre nach 1979 behalten, da einige unglaubwürdige Werte in den Daten vorhanden sind (Solarleistung vor 1920 usw.)
    mutate(end_year = substr(DatumEndgueltigeStilllegung, 1, 4)) %>%       
    rename(Kennziffer = Gemeindeschluessel) %>%                           
    mutate_at(vars(Jahr, Kennziffer), as.character) %>%                  
    mutate_at(vars(Bruttoleistung), as.numeric) %>%                       
    mutate(tech = tech_name)   #Technologie-Label setzen
  
  # Schritt 2: Akkumulierte Leistung nach Gemeinde (Kennziffer) und Jahr aggregieren
  Bruttoleistung_gem <- processed_data %>%
    group_by(Kennziffer, Jahr) %>%
    summarise(Bruttoleistung_gem = sum(Bruttoleistung, na.rm = TRUE), .groups = "drop")
  
  # Schritt 3: Stillgelegte Leistung unter Verwendung des end_year als Verknüpfungsjahr aggregieren
  rem_Bruttoleistung_gem <- processed_data %>%
    group_by(Kennziffer, end_year) %>%
    summarise(remove = sum(Bruttoleistung, na.rm = TRUE), .groups = "drop") %>%
    rename(Jahr = end_year)
  
  # Schritt 4: Die aggregierten Leistungen mit den aufbereiteten Daten verknüpfen
  processed_data <- processed_data %>%
    left_join(Bruttoleistung_gem, by = c("Kennziffer", "Jahr")) %>%
    left_join(rem_Bruttoleistung_gem, by = c("Kennziffer", "Jahr"))
  
  # Schritt 5: Nettoleistung und kumulierte Leistung über die Jahre pro Gemeinde berechnen
  processed_data <- processed_data %>%
    mutate(remove = ifelse(is.na(remove), 0, remove)) %>%
    dplyr::select(Kennziffer, remove, Jahr, Bruttoleistung_gem, tech) %>%  
    unique() %>%
    group_by(Kennziffer) %>%
    mutate_at(vars(Bruttoleistung_gem, remove), as.numeric) %>%
    mutate(Bruttoleistung_min_rem = Bruttoleistung_gem - remove) %>%   # Leistung nach Abzug der stillgelegten Leistung
    arrange(Jahr, .by_group = TRUE) %>%
    mutate(Bruttoleistung_kumuliert = cumsum(Bruttoleistung_min_rem)) %>%  # Kumulierte Leistung über die Zeit
    ungroup() %>%
    mutate(Kennziffer = ifelse(nchar(Kennziffer) == 7, paste0("0", Kennziffer), Kennziffer)) %>%  # Kennziffer-Format sicherstellen
    dplyr::select(-remove, -Bruttoleistung_gem, -Bruttoleistung_min_rem)      # Spalten entfernen
  
  return(processed_data)
}


# Liste mit Rohdatensätzen für jede Technologie.
tech_datasets <- list(
  Geothermal_energy = Geothermie_data_orig,
  PV      = Solar_data_orig,
  Wind       = Wind_data_orig,
  Bioenergy    = Bio_data_orig
)

# Jede Technologie verarbeiten
processed_list <- lapply(names(tech_datasets), function(tech_name) {
  process_tech_data(tech_datasets[[tech_name]], tech_name)
})
names(processed_list) <- names(tech_datasets)

# Alle verarbeiteten Daten in einen Data Frame kombinieren
tech_data <- bind_rows(processed_list)
tech_data <- unique(tech_data)



#Erweitern der Technologiedaten, sodass alle Jahre einen Wert haben
year_range <- tibble(Jahr = as.character(1980:2022)) 

# Kennziffer/tech-Kombinationen abrufen
unique_kz <- tech_data %>%
  distinct(Kennziffer)

# Ein vollständiges Raster aller Kombinationen von Kennziffer und Jahr erstellen
full_data <- expand_grid(unique_kz, year_range, tech=c("Bioenergy","PV", "Wind", "Geothermal_energy"))


# Mit den ursprünglichen Daten zusammenführen, fehlende Werte mit NA auffüllen
techdata_complete <- dplyr::full_join( full_data,tech_data, by = c("Kennziffer", "tech", "Jahr"))

# Leistung aus Vorjahren nach Technologie
techdata_complete1 <- techdata_complete %>%
  mutate(Jahr = as.numeric(Jahr)) %>%
  arrange(tech,Kennziffer, Jahr) %>%  # Daten nach Jahr sortieren
  group_by(tech, Kennziffer) %>%  
  mutate(Bruttoleistung= zoo::na.locf(Bruttoleistung_kumuliert, na.rm = FALSE))%>%  
  mutate(first_non_na_year = ifelse(any(!is.na(Bruttoleistung_kumuliert)), 
                                    min(Jahr[!is.na(Bruttoleistung_kumuliert)], na.rm = TRUE), 
                                    NA)) %>%
  mutate(all_na = ifelse(sum(!is.na(Bruttoleistung_kumuliert)) == 0,
                         1, 
                         0)) %>%
  ungroup() %>%
  mutate(Bruttoleistung = case_when(is.na(Bruttoleistung) & Jahr < first_non_na_year~ 0, 
                                    all_na==1~0,
                                    T~Bruttoleistung)) %>%
  dplyr::select(-first_non_na_year, -all_na, -Bruttoleistung_kumuliert) %>%
  mutate(Jahr = as.character(Jahr))

# Alle erneuerbaren Energiequellen kombinieren
EE_data <-techdata_complete1 %>%
  rename(Bruttoleistung_tech=Bruttoleistung)%>%
  group_by(Jahr, Kennziffer)%>%
  mutate(Bruttoleistung= sum(Bruttoleistung_tech ))%>%
  dplyr::select(-Bruttoleistung_tech, -tech)%>%
  unique()%>%
  mutate(tech="Renewable_energy")

# Gesamte Erneuerbare verknüpfen
techdata_complete2<-rbind(EE_data,techdata_complete1)


saveRDS(file="data/external_data/full_tech_capacity.RDS",techdata_complete2)


clean_data0<-left_join(data_sub4, unique(techdata_complete2), by = c("Kennziffer", "Jahr", "tech"))


## Abschnitt 2.5: Einlesen und Aufbereiten des Urbanisierungsgrads (Ländlich) ----

data_urban_orig<-read_xlsx("data/external_data/raumgliederungen-referenzen-2022.xlsx",sheet="Gemeindereferenz (inkl. Kreise)")
data_urban<-data_urban_orig[-1,]

data_urban<-data_urban%>%
  mutate(Kennziffer = ifelse(nchar(GEM2022) == 7, str_pad(GEM2022, 8, pad = "0"), GEM2022)) %>% 
  dplyr::select(Kennziffer, DUG2022)

clean_data0<-clean_data0%>%
  left_join( data_urban, by="Kennziffer")



## Abschnitt 2.6: Umgang mit fehlenden Werten ----

## Wenn Daten auf Gemeindeebene, aber Bürgerentscheid auf Kreisebene: Mittelwert aller Gemeindeebenen verwenden ----
# Gemeindedaten
columns_to_replace <- c( "Durchschnittsalter", "Bevölkerung_weiblich", "Fläche",
                        "Bevölkerung_männlich")

# Sicherstellen, dass Spalten numerisch sind
clean_data0[columns_to_replace] <- lapply(clean_data0[columns_to_replace], as.numeric)
combined_data_gem1[columns_to_replace] <- lapply(combined_data_gem1[columns_to_replace], as.numeric)

techdata_complete2["Bruttoleistung"] <- lapply(techdata_complete2["Bruttoleistung"], as.numeric)

data_urban["DUG2022"] <- lapply(data_urban["DUG2022"], as.numeric)

# Durchschnittswerte nach 'Kennziffer_kreis' und 'Jahr'
average_values <- combined_data_gem1 %>%
  mutate(Kennziffer_kreis = substr(Kennziffer, 1, 5)) %>%
  group_by(Kennziffer_kreis, Jahr) %>%  # Nach Kreis und Jahr gruppieren
  summarise(across(all_of(columns_to_replace), ~ mean(.x, na.rm = TRUE)), .groups = "drop")

average_values1 <- techdata_complete2 %>%
  mutate(Kennziffer_kreis = substr(Kennziffer, 1, 5)) %>%
  group_by(Kennziffer_kreis, Jahr, tech) %>%  # Nach Kreis und Jahr gruppieren
  summarise(across(all_of("Bruttoleistung"), ~ mean(.x, na.rm = TRUE)), .groups = "drop")

average_values2 <- data_urban %>%
  mutate(Kennziffer_kreis = substr(Kennziffer, 1, 5)) %>%
  group_by(Kennziffer_kreis) %>%  # Nach Kreis und Jahr gruppieren
  summarise(across(all_of("DUG2022"), ~ mean(.x, na.rm = TRUE)), .groups = "drop")


# Anzahl der Fälle, in denen Daten ersetzt werden
clean_data0 %>%
    subset(Jahr>1999)%>%
    subset(Jahr<2023)%>%
  mutate(Kennziffer_kreis = substr(Kennziffer, 1, 5)) %>%
  left_join(unique(average_values), by = c("Kennziffer_kreis", "Jahr"), suffix = c("", "_avg")) %>%
  mutate(across(all_of(columns_to_replace), 
                ~ ifelse(is.na(.), "replace", .)))%>%
  filter(if_any(all_of(columns_to_replace), ~ .x == "replace"))%>%
  dplyr::select(Kennziffer, Gebietskategorie, Ort, Durchschnittsalter, 
           Fläche,
          Bevölkerung_weiblich, 
         Bevölkerung_männlich)



# Mit clean_data0 zusammenführen und fehlende Werte nur auffüllen, wenn es sich um dasselbe Jahr handelt
clean_data0 <- clean_data0 %>%
  mutate(Kennziffer_kreis = substr(Kennziffer, 1, 5)) %>%
  left_join(unique(average_values), by = c("Kennziffer_kreis", "Jahr"), suffix = c("", "_avg")) %>%
  mutate(across(all_of(columns_to_replace), 
                ~ ifelse(is.na(.), get(paste0(cur_column(), "_avg")), .))) %>%
  dplyr::select(-ends_with("_avg")) %>%
  left_join(unique(average_values1), by = c("Kennziffer_kreis", "Jahr", "tech"), suffix = c("", "_avg")) %>%
  mutate(across(all_of("Bruttoleistung"), 
                ~ ifelse(is.na(.), get(paste0(cur_column(), "_avg")), .))) %>%
  dplyr::select(-ends_with("_avg")) %>%
  mutate(Bevölkerung = Bevölkerung_weiblich + Bevölkerung_männlich) %>%
  left_join(unique(average_values2), by = c("Kennziffer_kreis"), suffix = c("", "_avg")) %>%
  mutate(across(all_of("DUG2022"), 
                ~ ifelse(is.na(.), get(paste0(cur_column(), "_avg")), .))) %>%
  mutate(DUG2022=round(as.numeric(DUG2022), digits=0))%>%
  dplyr::select(-ends_with("_avg")) 



## Abschnitt 2.7: Hinzufügen der Gesamtzahl der Bürgerentscheide ----

data_orig<-read_xlsx("data/db_auszug-17-10-24.xlsx", skip = 2)

data_numb_in<-data_orig%>%
  mutate(Ort = case_when(
    Ort == "Arnstedt (Ortsteil von Arnstein, ehem. selbstständig)" ~ "Arnstein",
    Ort == "Böcke (Ortsteil von Wenzlow, ehem. selbstständig)" ~ "Wenzlow",
    Ort == "Gröbzig (Ortsteil von Südliches Anhalt, ehem. selbstständig)" ~ "Südliches Anhalt",
    Ort == "Kühren-Burkartshain (OT von Wurzen bei Leipzig, ehem. selbstständig)" ~ "Wurzen bei Leipzig",
    Ort == "Feldberg (ehemals selbstständig)" ~ "Feldberg",
    Ort == "Friedersdorf, Oderbruch (Ortsteil von Vierlinden, ehem. selbstständig)" ~ "Vierlinden",
    Ort == "Günthersleben-Wechmar (Ortsteil von Drei Gleichen, ehem. selbstständig)" ~ "Drei Gleichen",
    Ort == "Testorf (ehem. selbstständig)" ~ "Testorf",
    Ort == "Cobbelsdorf (Ortsteil von Coswig (Anhalt), ehem. selbstständig)" ~ "Coswig (Anhalt)",
    Ort == "Köselitz (Ortsteil von Coswig/Anhalt, ehem. selbstständig)" ~ "Coswig (Anhalt)",
    Ort == "Senst (Ortsteil von Coswig/Anhalt, ehem. selbstständig)" ~ "Coswig (Anhalt)",
    TRUE ~ Ort  ))%>% # Ort bereinigen
  mutate(AGS=case_when(Ort=="Arnstein"~"15087031",
                       Ort=="Hamburg-Bergedorf"~"02000000",
                       Ort=="Südliches Anhalt"~"15082377",
                       Ort=="Wenzlow"~"12069648",
                       Ort=="Wurzen bei Leipzig"~"14729410",
                       Ort=="Feldberg"~"13071033",
                       Ort=="Vierlinden"~"12064482",
                       Ort=="Bad Camberg-Dombach"~"06533003",
                       Ort=="Drei Gleichen"~"16067089",
                       Ort=="Testorf"~"13074077",
                       Ort=="Coswig (Anhalt)"~"15091060",
                       T~as.character(AGS)))%>%
  rename(Kennziffer=AGS) %>%
  mutate_at(vars(Jahr,Kennziffer), as.character)%>%
  group_by(Jahr, Kennziffer)%>%
  mutate(number_BE=n())%>%
  ungroup()%>%
  dplyr::select(Jahr, Kennziffer,number_BE)%>%
  unique()


clean_data1<-left_join(clean_data0, unique(data_numb_in), by=c("Jahr", "Kennziffer"))


saveRDS(clean_data1, "data/data_clean_full.rds")


# Abschnitt 3: Datenbereinigung ----

clean_data1<-readRDS("data/data_clean_full.rds")


table(clean_data1$Jahr<2000)
table(clean_data1$Jahr>2022)

clean_data2<-clean_data1%>%
  #Für die Analyse relevante Jahre
  subset(Jahr>1999)%>%
  subset(Jahr<2023)%>%
  mutate(year=as.numeric(Jahr)-2000)%>%
  dplyr::select(-starts_with("Aggregat"))%>%
  mutate_at(vars(Median_einkommen, ohne_Schulabschluss,
                 Wahlergebnisse_Grüne, Durchschnittsalter,
                 Fläche), as.numeric)%>%
  #Grad der Urbanisierung (Ländlich)
  mutate(urban_nominal=case_when(DUG2022==1~"urban",
                                 DUG2022==2~"town/suburban",
                                 DUG2022==3~"rural"))%>%
  mutate(rural=ifelse(DUG2022==3,1,0))%>%
  mutate(urban=case_when(DUG2022==1~1,
                         DUG2022==2~0,
                         DUG2022==3~0))%>%
  mutate(area=Fläche/1000,
         residents=Bevölkerung/1000,
         capacity=Bruttoleistung/Fläche)%>%
  mutate(population_density=Bevölkerung/Fläche)%>%
  mutate(female=Bevölkerung_weiblich/Bevölkerung*100)%>%
  #Technologien
  mutate(bioenergy=ifelse(tech=="Bioenergy",1,0),
         PV=ifelse(tech=="PV",1,0),
         wind=ifelse(tech=="Wind",1,0),
         other_tech=ifelse(tech%in%c ("Renewable_energy","Geothermal_energy", "Bioenergy"),1,0))%>%
  mutate(Baden_Württemberg=ifelse(Bundesland=="Baden-Württemberg",1,0),
         Bavaria=ifelse(Bundesland=="Bayern",1,0),
         Hesse=ifelse(Bundesland=="Hessen",1,0),
         Rhineland_Palatinate=ifelse(Bundesland=="Rheinland-Pfalz",1,0),
         Schleswig_Holstein=ifelse(Bundesland=="Schleswig-Holstein",1,0),
         Other_Eastern_states=ifelse(Bundesland%in%c("Brandenburg", "Mecklenburg-Vorpommern", "Sachsen-Anhalt", "Sachsen", "Thüringen"),1,0),
         Other_Western_states=ifelse(Bundesland%in%c("Hamburg", "Niedersachsen", "Nordrhein-Westfalen","Saarland"),1,0))%>%
  mutate(citizen_initiative=ifelse(Verfahrenstyp%in%c("1. a (genauer:) Initiativbegehren","1. b (genauer:) Korrekturbegehren","1. Bürgerbegehren", "1. c (genauer) Korrekturbegehren mit Alternativvorschlag"),1,0),
         council_referendum=ifelse(Verfahrenstyp%in%c("2. a (genauer:) Ratsreferendum: auf Eigeninitiative des Rats","2. b (genauer:) Ratsreferendum: aufgegriffenes Bürgerbegehren", "2. c (genauer:) Ratsreferendum: Gegenvorschlag zu Bürgerbegehren","2. Ratsreferendum"),1,0),
         citizen_proposal=ifelse(Verfahrenstyp%in%c("3. a Bürgerbefragung","3. b Petition/Unterschriftensammlung als BB bezeichnet","3. Bürgerantrag"),1,0))%>%
  rename(median_income=Median_einkommen,
         low_educ=ohne_Schulabschluss,
         green_voters=Wahlergebnisse_Grüne,
         median_age=Durchschnittsalter,
         number_initiatives=number_BE,
         share_votes=`BE-Ja-Stimmenanteil`,
         BE_Beteiligung=`BE-Beteiligung`,
         Begehren_ID=`Begehren ID`,
         BE_Datum=`BE-Datum`)%>%
  mutate(share_votes=ifelse(is.na(BE_Datum),NA,share_votes))%>%#derzeit 0, wenn keine Abstimmung stattfand
  dplyr::select(-`BL-Abkürzung`, -`BE-Nein-Stimmenanteil`, -ends_with(".x"), -ends_with(".y"))%>%
  mutate(pro_energy_transition=ifelse(position=="Bürgerbegehren für das Energiewendeprojekt",1,0))%>%
  group_by(Kennziffer, tech) %>%
  arrange(Kennziffer, year) %>%
  mutate(first_initiative=ifelse(row_number() == 1|n() == 1 ,1,0))%>%
  ungroup()%>%
  subset(tech%in%c ("Renewable_energy","Geothermal_energy", "Bioenergy", "PV", "Wind"))%>%
  mutate(citizen_driven=case_when(Verfahrenstyp%in%c("1. Bürgerbegehren","1. a (genauer:) Initiativbegehren","3. Bürgerantrag","3. a Bürgerbefragung","3. b Petition/Unterschriftensammlung als BB bezeichnet")~1,
                                  Verfahrenstyp=="4. unbekannt"~NA,
                                  T~0))%>%
  mutate(council_driven=case_when(Verfahrenstyp%in%c( "2. Ratsreferendum","2. a (genauer:) Ratsreferendum: auf Eigeninitiative des Rats")~1,
                                  Verfahrenstyp=="4. unbekannt"~NA,
                                  T~0))%>%
  mutate(unclear_driven=case_when(Verfahrenstyp%in%c("1. b (genauer:) Korrekturbegehren", "1. c (genauer) Korrekturbegehren mit Alternativvorschlag",
                                                     "2. b (genauer:) Ratsreferendum: aufgegriffenes Bürgerbegehren", "2. c (genauer:) Ratsreferendum: Gegenvorschlag zu Bürgerbegehren")~1,
                                  Verfahrenstyp=="4. unbekannt"~NA,
                                  T~0))%>%
  mutate(driven_by=case_when(citizen_driven==1~"citizen",
                             council_driven==1~"council",
                             unclear_driven==1~"unclear"))%>%
  mutate(across(all_of(c("residents","area")),
                ~ if_else(. > median(., na.rm = TRUE), 1, 0),
                .names = "{.col}_dummy"))

saveRDS(clean_data2, "data/data_clean_paper.rds")

