#!/usr/bin/env Rscript
# MPPR 2026 — R package installer & verifier
# Usage (from this folder, or after downloading the prep packet):
#   Rscript setup_env.R
# Or inside R / RStudio:
#   source("setup_env.R")
#   verify_installation()

options(repos = c(CRAN = "https://cloud.r-project.org"))

required_packages <- c(
  "tidyverse",
  "deSolve",
  "ggplot2",
  "dplyr",
  "tidyr",
  "readr",
  "stringr",
  "purrr",
  "tibble",
  "broom",
  "here",
  "remotes"
)

# Optional but useful for later labs / maps (install if possible).
optional_packages <- c(
  "lme4",
  "sf",
  "viridis",
  "patchwork"
)

install_missing <- function(pkgs) {
  missing <- pkgs[!vapply(pkgs, requireNamespace, quietly = TRUE, FUN.VALUE = logical(1))]
  if (length(missing) == 0) {
    message("All requested packages already installed.")
    return(invisible(TRUE))
  }
  message("Installing: ", paste(missing, collapse = ", "))
  install.packages(missing, dependencies = TRUE)
  invisible(TRUE)
}

verify_installation <- function(include_optional = TRUE) {
  pkgs <- required_packages
  if (isTRUE(include_optional)) {
    pkgs <- unique(c(pkgs, optional_packages))
  }

  ok <- TRUE
  results <- lapply(pkgs, function(pkg) {
    loaded <- requireNamespace(pkg, quietly = TRUE)
    status <- if (loaded) "OK" else "MISSING"
    if (!loaded) {
      ok <<- FALSE
    }
    data.frame(package = pkg, status = status, stringsAsFactors = FALSE)
  })

  table <- do.call(rbind, results)
  print(table, row.names = FALSE)

  r_ok <- getRversion() >= "4.3.1"
  message("")
  message("R version: ", as.character(getRversion()),
          if (r_ok) " (meets 4.3.1+)" else " (please upgrade to 4.3.1+)")

  if (ok && r_ok) {
    message("verify_installation(): PASSED — you are ready for MPPR labs.")
  } else {
    message("verify_installation(): FAILED — install missing packages / upgrade R, then re-run.")
  }
  invisible(ok && r_ok)
}

message("=== MPPR 2026 R environment setup ===")
install_missing(required_packages)

opt_ok <- TRUE
tryCatch(
  install_missing(optional_packages),
  error = function(e) {
    opt_ok <<- FALSE
    message("Optional packages skipped (not required for Day 1): ", conditionMessage(e))
  }
)

verify_installation(include_optional = opt_ok)
