# ---- MODEL PARAMETERS (for calculation and dynamic content if needed)
sigma_base <- 0.025                # Low-density larval death (σ)
E_base     <- 1/19                 # Maturation rate (E)
delta_base <- 0.1                  # Adult death rate (Δ)
gamma_base <- 4                    # Fecundity (Γ, used for fitting to R0m if required)
xi_base    <- 8                    # Extrinsic incubation rate (ξ)
K_s        <- 0.3                  # Seasonal carrying capacity amplitude
alpha      <- 1.5                  # Adult wild-type density per person (α)
N          <- 1000                 # Human population (arbitrary)
kappa_base <- 0.6                  # Biting rate (κ)
beta_mh    <- 1.0                  # Prob. mosquito → human (Bmh)
eta        <- 4                    # Human infectious period (η)
R0         <- 2.69                 # Reproduction number (R0m for mosquito only, in this model)
days       <- seq(0, 730, by = 0.1)
T_seasonal <- 25 + 4 * cos(2 * pi * days / 365)  # Example seasonal temperature

# ---- Print and check parameters dynamically (optional)
cat("Model parameters (from paper):\n")
## Model parameters (from paper):
cat(sprintf("σ = %.3f, E = %.5f, Δ = %.3f, Γ = %.1f, ξ = %.5f, K_s = %.2f, α = %.1f, N = %d, κ = %.1f, Bmh = %.1f, η = %.1f, R0 = %.2f\n",
            sigma_base, E_base, delta_base, gamma_base, xi_base, K_s, alpha, N, kappa_base, beta_mh, eta, R0))
## σ = 0.025, E = 0.05263, Δ = 0.100, Γ = 4.0, ξ = 8.00000, K_s = 0.30, α = 1.5, N = 1000, κ = 0.6, Bmh = 1.0, η = 4.0, R0 = 2.69
# ---- Eq. 37: Mean carrying capacity (K_bar)
diagnostic_block <- function(mean_delta, mean_sigma, gamma_val, E_base, xi_constant, alpha) {
  term <- ((E_base * gamma_val - mean_delta) / (mean_delta * mean_sigma) - 1)
  if (term <= 0) stop(sprintf("K_bar inner term negative: %.6f", term))
  K_bar <- (alpha * mean_delta / E_base) * (term)^(-1/xi_constant)
  if (!is.finite(K_bar) || K_bar <= 0) stop(sprintf("K_bar not positive: %.6g", K_bar))
  return(K_bar)
}
# ---- Eq. 39: Probability of transmission from human to mosquito (Bhm)
beta_hm_calc <- function(R0, beta_mh, kappa, alpha, eta, delta) {
  denom <- (beta_mh / (kappa^2 * alpha * eta)) * ((1 + delta * xi_base) / delta)
  beta_hm <- R0 / denom
  return(beta_hm)
}
# ---- ODIN ODE Model: as per equations
mosquito_model_universal <- odin::odin({
  pi <- 3.141592653589793
  delta <- interpolate(time, delta_vals, "linear")
  sigma <- interpolate(time, sigma_vals, "linear")
  E <- interpolate(time, E_vals, "linear")
  gamma <- interpolate(time, gamma_vals, "linear")
  kappa <- interpolate(time, kappa_vals, "linear")
  xi <- interpolate(time, xi_vals, "linear")
  time_interpolated <- interpolate(time, time, "linear")
  K <- K_bar * (1 + K_s * cos(2 * pi * time_interpolated / 365))
  mu_density <- sigma * (1 + L / (K * N))
  lambda <- beta_hm * kappa * MI / N
  output(lambda) <- TRUE
  deriv(L)  <- gamma * MS - (E + mu_density) * L
  deriv(MS) <- E * L - (delta + lambda) * MS
  deriv(ME) <- lambda * MS - (xi + delta) * ME
  deriv(MI) <- xi * ME - delta * MI
  initial(L)  <- L0
  initial(MS) <- MS0
  initial(ME) <- ME0
  initial(MI) <- MI0
  time[]          <- user()
  T[]             <- user()
  delta_vals[]    <- user()
  sigma_vals[]    <- user()
  E_vals[]        <- user()
  gamma_vals[]    <- user()
  kappa_vals[]    <- user()
  xi_vals[]       <- user()
  dim(time) <- user()
  dim(T)    <- user()
  dim(delta_vals) <- user()
  dim(sigma_vals) <- user()
  dim(E_vals) <- user()
  dim(gamma_vals) <- user()
  dim(kappa_vals) <- user()
  dim(xi_vals) <- user()
  beta_hm <- user()
  K_bar   <- user()
  K_s     <- user()
  N       <- user()
  L0  <- user()
  MS0 <- user()
  ME0 <- user()
  MI0 <- user()
})
# ---- Helper for post-processing model output for plotting
scenario_output <- function(out, days, scenario, curve_type, compartment_names) {
  plot_indices <- seq(1, length(days), by = 10)
  if (ncol(out) < 5) stop("ODE output does not have expected columns! Actual columns: ", paste(colnames(out), collapse=", "))
  pop_data <- as.data.frame(out[plot_indices, 2:5])
  colnames(pop_data) <- compartment_names
  pop_data$Day <- days[plot_indices]
  pop_data$Scenario <- scenario
  pop_data$CurveType <- curve_type
  pop_long <- pop_data %>%
    pivot_longer(cols = compartment_names, names_to = "Compartment", values_to = "Population")
  pop_long
}
# ---- Baseline (temp-independent) parameter set for the model
mean_delta <- delta_base
mean_sigma <- sigma_base
gamma_constant <- gamma_base
K_bar_val <- diagnostic_block(mean_delta, mean_sigma, gamma_constant, E_base, xi_base, alpha)
beta_hm_val <- beta_hm_calc(R0, beta_mh, kappa_base, alpha, eta, mean_delta)

baseline_params <- list(
  time = days,
  T = T_seasonal,
  delta_vals = rep(mean_delta, length(days)),
  sigma_vals = rep(mean_sigma, length(days)),
  E_vals = rep(E_base, length(days)),
  gamma_vals = rep(gamma_constant, length(days)),
  kappa_vals = rep(kappa_base, length(days)),
  xi_vals = rep(xi_base, length(days)),
  beta_hm = beta_hm_val,
  K_bar = K_bar_val,
  K_s = K_s,
  N = N,
  L0  = K_bar_val * 10,
  MS0 = K_bar_val * 10,
  ME0 = K_bar_val * 0.25,
  MI0 = 0
)
cat(sprintf("K_bar (Eq. 37) = %.6g\n", K_bar_val))
## K_bar (Eq. 37) = 1.7799