# %%
library(profoc)
library(ggplot2)
library(tidyr)
library(dplyr)
library(readr)

# Creating faceted plots for different knot values and mu values
# Create a function to generate the data for a given number of knots and mu value
generate_basis_data <- function(num_knots, mu_value, sig_value, nonc_value, tailw_value, deg_value) {
  grid <- seq(from = 0, to = 1, length.out = 26)
  # Use provided degree
  B <- profoc:::make_basis_matrix(grid,
    profoc::make_knots(
      n = num_knots,
      mu = mu_value,
      sig = sig_value,
      nonc = nonc_value,
      tailw = tailw_value,
      deg = deg_value
    ),
    deg = deg_value
  )
  B_mat <- round(as.matrix(B), 5)
  df <- as.data.frame(B_mat)
  df$x <- grid
  df_long <- pivot_longer(df,
    cols = -x,
    names_to = "b",
    values_to = "y"
  )
  df_long$knots <- num_knots
  df_long$mu <- mu_value
  df_long$sig <- sig_value
  df_long$nonc <- nonc_value
  df_long$tailw <- tailw_value
  df_long$deg <- deg_value
  return(df_long)
}

# Generate data for each combination of knot, mu, sig, nonc, tailw, and deg
mu_values <- seq(0.1, 0.9, by = 0.2)
sig_values <- 2^(-2:2)
nonc_values <- c(-4, -2, 0, 2, 4)
tailw_values <- 2^(-2:2)

# Create an empty list to store all combinations
all_data <- list()
counter <- 1

# Nested loops to cover all parameter combinations
for (m in mu_values) {
  print(paste("Processing mu:", m))
  for (s in sig_values) {
    for (nc in nonc_values) {
      for (tw in tailw_values) {
        all_data[[counter]] <- generate_basis_data(5, m, s, nc, tw, 2)
        counter <- counter + 1
      }
    }
  }
}

# Combine all data frames
all_data <- bind_rows(all_data)

write_csv(all_data, "25_07_phd_defense/assets/mcrps_learning/basis_functions.csv")

# %%
all_data %>%
  filter(mu == 0.1) %>%
  filter(sig == 0.25) %>%
  filter(nonc == -4) %>%
  filter(tailw == 0.25) %>%
  ggplot(aes(x = x, y = y, col = b)) +
  geom_line(size = 2) +
  labs(
    title = "Basis Functions for Different Knot Values",
    x = "x",
    y = "y"
  ) +
  theme_minimal()
