if (!require("tidyverse"))
  install.packages("tidyverse")
if (!require("tidycensus"))
  install.packages("tidycensus")
if (!require("sf"))
  install.packages("sf")
if (!require("mapview"))
  install.packages("mapview")
if (!require("DataEditR"))
  install.packages("DataEditR")
if (!require("leaflet"))
  install.packages("leaflet")
if (!require("leaflet.extras2"))
  install.packages("leaflet.extras2")
if (!require("plotly"))
  install.packages("plotly")

library(tidyverse)
library(tidycensus)
library(sf)
library(mapview)
library(DataEditR)
library(leaflet)
library(leafpop)
library(plotly)

####################
# Run this code first, but only once.
# Running this code again will reset the data file
# to its pre-election contents

# Downloading initial data files

# NOTE: You must replace PasteYourAPIKeyBetweenTheseQuoteMarks
# with your Census API key

census_api_key("PasteYourAPIKeyBetweenTheseQuoteMarks")

TNSenateMap <- get_acs(
  geography = "state legislative district (upper chamber)",
  state = "TN",
  variables = "DP02_0154P",
  year = 2022,
  survey = "acs5",
  output = "wide",
  geometry = TRUE)

TNSenateMap <- TNSenateMap %>% 
  select(GEOID, NAME, geometry)

st_write(TNSenateMap,"TNSenateMap.shp", append = FALSE)

TNSenateData <- read_csv("https://raw.githubusercontent.com/drkblake/Data/refs/heads/main/TNSenateRaceData.csv")
write_csv(TNSenateData,"TNSenateRaceData.csv")

####################
# Run this code each time you want 
# to update and republish the map

# Reading files from local computer project folder

TNSenateMap <- st_read("TNSenateMap.shp")
TNSenateData <- read_csv("TNSenateRaceData.csv")

# Edit / update election data

TNSenateData <- data_edit(TNSenateData)
write_csv(TNSenateData,"TNSenateRaceData.csv")

# Merge election and map data

TNSenateWinners <- merge(TNSenateMap,TNSenateData)

# Make the election map

mypalette = colorRampPalette(c("gray","#384B70","#B8001F"))

# Use this palette if an independent wins
# mypalette = colorRampPalette(c("gray","#384B70","#B8001F","#FFD35A"))

TNSenateElectionMap <-
  mapview(
  TNSenateWinners,
  zcol = "Party",
  col.regions = mypalette,
  layer.name = "Party",
  popup = popupTable(
    TNSenateWinners,
    feature.id = FALSE,
    row.numbers = FALSE,
    zcol = c(
      "District",
      "Party",
      "Dem",
      "Rep",
      "Ind"
    )
  )
)

# Show the map

TNSenateElectionMap