# Load necessary libraries
library(dplyr)
library(lubridate)
library(tidyr)
library(ggplot2)
library(sf)
library(leaflet)
library(rworldmap)
library(htmlwidgets)
library(prophet)

# Example of how to load your data
# Replace this section with actual data loading step
data <- data.frame(
  date = as.Date('2020-01-01') + 0:29,  # Example dates
  state = sample(c("State1", "State2"), 30, replace = TRUE),  # Example states
  confirmed = sample(100:1000, 30, replace = TRUE),  # Example confirmed cases
  recovered = sample(50:500, 30, replace = TRUE),  # Example recovered cases
  death = sample(1:50, 30, replace = TRUE),  # Example death cases
  lat = runif(30, -90, 90),  # Example latitudes
  lon = runif(30, -180, 180)  # Example longitudes
)

# Clean data
data <- data %>% 
  mutate(
    state = replace_na(state, "Unknown"),
    date = as.Date(date),
    lat = as.numeric(lat),
    lon = as.numeric(lon)
  ) %>% 
  filter(
    lat >= -90 & lat <= 90 & 
    lon >= -180 & lon <= 180 & 
    !(confirmed == 0 & recovered == 0 & death == 0)
  )

# Inspect data
head(data)
str(data)
summary(data)

# Aggregate data by country
agg_data <- data %>%
  group_by(country) %>%
  summarise(
    total_confirmed = sum(confirmed),
    total_recovered = sum(recovered),
    total_deaths = sum(death)
  ) %>%
  ungroup()

# Visualizations
# Top countries by confirmed cases
top_countries_confirmed <- agg_data %>% 
  arrange(desc(total_confirmed)) %>% 
  head(10)
ggplot(top_countries_confirmed, aes(x=reorder(country, total_confirmed), y=total_confirmed)) +
  geom_bar(stat="identity", fill="steelblue") +
  coord_flip() +
  labs(title="Top 10 Countries by Confirmed Cases", x="Country", y="Total Confirmed Cases")

# Top countries by deaths
top_countries_deaths <- agg_data %>% 
  arrange(desc(total_deaths)) %>% 
  head(10)
ggplot(top_countries_deaths, aes(x=reorder(country, total_deaths), y=total_deaths)) +
  geom_bar(stat="identity", fill="red") +
  coord_flip() +
  labs(title="Top 10 Countries by Deaths", x="Country", y="Total Deaths")

# Top countries by recovered cases
top_countries_recovered <- agg_data %>% 
  arrange(desc(total_recovered)) %>% 
  head(10)
ggplot(top_countries_recovered, aes(x=reorder(country, total_recovered), y=total_recovered)) +
  geom_bar(stat="identity", fill="green") +
  coord_flip() +
  labs(title="Top 10 Countries by Recovered Cases", x="Country", y="Total Recovered Cases")

# Geospatial Analysis Using Leaflet
# Convert to spatial object
data_sf <- st_as_sf(data, coords = c("lon", "lat"), crs = 4326)

# Interactive Map of Confirmed Cases
m_confirmed <- leaflet(data_sf) %>%
  addTiles() %>%
  addCircleMarkers(
    radius = ~log1p(confirmed + 1),
    color = "blue",
    popup = ~paste0("<strong>Country: </strong>", country, "<br>",
                    "<strong>Confirmed Cases: </strong>", confirmed, "<br>",
                    "<strong>Recovered: </strong>", recovered, "<br>",
                    "<strong>Deaths: </strong>", death)
  ) %>%
  addLegend("bottomright", 
            colors = c("blue"),
            labels = c("Confirmed Cases"),
            opacity = 0.5,
            title = "COVID-19 Cases")
saveWidget(m_confirmed, "Confirmed_Cases_Map.html")

# Time Series Forecasting with Prophet
# Aggregate data by date
time_series_data <- data %>%
  group_by(date) %>%
  summarise(total_confirmed = sum(confirmed)) %>%
  ungroup()

# Handle NA values
time_series_data <- na.omit(time_series_data)

# Rename columns for Prophet
prophet_data <- time_series_data %>%
  rename(ds = date, y = total_confirmed)
if (nrow(prophet_data) < 2) {
    stop("Error: Not enough data points to fit the model")
} else {
    model <- prophet(prophet_data)
    print("Model fitted successfully")
}

# Create future dataframe
future <- make_future_dataframe(model, periods = 30)
forecast <- predict(model, future)


# Visualize the forecast
plot(model, forecast)
prophet_plot_components(model, forecast)

# Summary Statistics
summary_stats <- agg_data %>%
  summarise(
    total_confirmed = sum(total_confirmed),
    total_recovered = sum(total_recovered),
    total_deaths = sum(total_deaths),
    mean_confirmed = mean(total_confirmed),
    mean_recovered = mean(total_recovered),
    mean_deaths = mean(total_deaths)
)
print(summary_stats)

# Heatmap
ggplot(data, aes(x = lon, y = lat)) +
  geom_hex(bins = 30) +
  scale_fill_gradient(low = "blue", high = "red") +
  labs(title="Heatmap of COVID-19 Cases",
       x="Longitude", y="Latitude")

# World Map Visualization
map_data <- joinCountryData2Map(agg_data, joinCode = "NAME", nameJoinColumn = "country")
par(mar = c(0, 0, 2, 0))
mapCountryData(map_data, nameColumnToPlot = 'total_confirmed', 
               mapTitle = 'Global Distribution of COVID-19 Confirmed Cases', 
               colourPalette = 'heat')

but there's no country coloum how come groupby
head(data)
        date  state confirmed recovered death       lat        lon
1 2020-01-01 State1       757       390    39 -11.01250  108.05332
2 2020-01-02 State1       969       341    14 -77.81465  165.17575
3 2020-01-03 State1       728       467    14  75.09412   19.02770
4 2020-01-04 State2       780       327    21  60.58436   38.67635
5 2020-01-05 State1       792       231     8  44.63188   75.00615
6 2020-01-06 State1       356       382    13  14.42180 -119.28318