///|
/// factoextra_demo - Example demonstrating PCA/factor analysis
/// Inspired by Bioconductor factoextra package.

///|
fn main {
  println("=== factoextra Demo ===")
  println("PCA/factor analysis utilities")
  println("")

  // Create a sample gene expression data matrix
  // 4 samples x 6 genes
  let expression_data = [
    [2.5, 3.1, 4.2, 1.8, 5.3, 2.9],
    [3.8, 2.4, 5.1, 2.7, 4.6, 3.2],
    [1.9, 4.3, 3.5, 2.1, 6.0, 2.1],
    [4.1, 3.7, 4.8, 3.2, 5.8, 3.6],
  ]

  // Perform PCA
  println("Performing PCA on expression data...")
  let pca_result = @src.facto_pca(expression_data)
  println("")

  // Get eigenvalues
  let eigenvalues = @src.facto_get_eigenvalue(pca_result)
  println("Eigenvalues:")
  for ev in eigenvalues {
    println(
      "  Dim \{ev.dimension}: eigenvalue=\{ev.eigenvalue}, variance=\{ev.variance_explained}%, cumulative=\{ev.cumulative_variance}%",
    )
  }

  // Get PCA summary
  let summary = @src.facto_summary(pca_result)
  println("")
  println("PCA Summary:")
  println("  Individuals: \{summary.n_individuals}")
  println("  Variables: \{summary.n_variables}")
  println("  Dimensions: \{summary.n_dimensions}")
  println("  Total inertia: \{summary.total_inertia}")
  println("  First dimension variance: \{summary.first_dim_variance}%")

  // Get individual coordinates
  let ind = @src.facto_get_pca_ind(pca_result)
  println("")
  println("Individual coordinates (Dim1, Dim2):")
  let mut i = 0
  while i < ind.coord.length() {
    println("  Sample \{i + 1}: (\{ind.coord[i][0]}, \{ind.coord[i][1]})")
    i = i + 1
  }

  // Get variable coordinates
  let pca_var = @src.facto_get_pca_var(pca_result)
  println("")
  println("Variable loadings (Dim1, Dim2):")
  let mut j = 0
  while j < pca_var.coord.length() {
    println("  Gene \{j + 1}: (\{pca_var.coord[j][0]}, \{pca_var.coord[j][1]})")
    j = j + 1
  }

  // Get contributions to dimension 1
  println("")
  println("Top variable contributions to Dim 1:")
  let contribs = @src.facto_var_contrib_dim(pca_result, 1)
  let mut k = 0
  while k < 3 {
    println("  \{contribs[k].0}: \{contribs[k].1}%")
    k = k + 1
  }

  // Number of dimensions for 80% variance
  let nb_dim = @src.facto_nb_dim(pca_result, 80.0)
  println("")
  println("Dimensions needed for 80% variance: \{nb_dim}")

  // Print full summary
  println("")
  println(@src.facto_print_summary(pca_result))

  println("=== factoextra Demo Complete ===")
}