///|
fn main {
  println("=== Biobase ExpressionSet Example ===")
  println("Inspired by Bioconductor Biobase package")
  println("")

  let assay_data = [
    [1.2, 2.3, 3.4, 4.5],
    [2.1, 3.2, 4.3, 5.4],
    [3.0, 4.1, 5.2, 6.3],
    [4.5, 5.6, 6.7, 7.8],
    [5.4, 6.5, 7.6, 8.7],
  ]

  let pheno_data : Map[String, Array[String]] = Map([], capacity=3)
  pheno_data["sample_name"] = ["sample1", "sample2", "sample3", "sample4"]
  pheno_data["group"] = ["control", "control", "treatment", "treatment"]
  pheno_data["sex"] = ["male", "female", "male", "female"]

  let feature_data : Map[String, Array[String]] = Map([], capacity=2)
  feature_data["feature_name"] = ["TP53", "BRCA1", "BRCA2", "ATM", "CDKN1A"]
  feature_data["chromosome"] = ["chr17", "chr17", "chr13", "chr11", "chr6"]

  let eset = @bio.ExpressionSet::new(
    assay_data,
    pheno_data,
    feature_data,
    "Homo sapiens",
    Map([]),
  )

  println("1. ExpressionSet Summary")
  println(@bio.expression_set_summary(eset))
  println("")

  println("2. Dimensions")
  println("   Rows (features): " + @bio.expression_set_nrow(eset).to_string())
  println("   Columns (samples): " + @bio.expression_set_ncol(eset).to_string())
  println("")

  println("3. Sample Names")
  let sample_names = @bio.expression_set_sample_names(eset)
  let mut i = 0
  while i < sample_names.length() {
    println("   - " + sample_names[i])
    i = i + 1
  }
  println("")

  println("4. Feature Names")
  let feature_names = @bio.expression_set_feature_names(eset)
  i = 0
  while i < feature_names.length() {
    println("   - " + feature_names[i])
    i = i + 1
  }
  println("")

  println("5. Subset (rows 0-1, columns 0-1)")
  let subset = @bio.expression_set_subset(eset, [0, 1], [0, 1])
  println("   Subset rows: " + @bio.expression_set_nrow(subset).to_string())
  println("   Subset cols: " + @bio.expression_set_ncol(subset).to_string())
  println("")

  println("6. Filter by row (max expression >= 5.0)")
  let filtered = @bio.expression_set_filter_by_row(eset, 5.0)
  println("   Filtered rows: " + @bio.expression_set_nrow(filtered).to_string())
  println("")

  println("7. Normalize (z-score)")
  let _normalized = @bio.expression_set_normalize(eset)
  println("   Normalized assay data computed")
  println("")

  println("8. Log2 Transform")
  let _log2_transformed = @bio.expression_set_log2(eset)
  println("   Log2 transformed assay data computed")
  println("")

  println("=== AnnotatedDataFrame Example ===")
  println("")

  let adf_data : Map[String, Array[String]] = Map([], capacity=3)
  adf_data["ID"] = ["1", "2", "3", "4"]
  adf_data["Group"] = ["A", "A", "B", "B"]
  adf_data["Treatment"] = ["Control", "Control", "Drug", "Drug"]

  let var_metadata : Map[String, String] = Map([], capacity=3)
  var_metadata["ID"] = "Sample identifier"
  var_metadata["Group"] = "Experimental group"
  var_metadata["Treatment"] = "Treatment type"

  let adf = @bio.AnnotatedDataFrame::new(adf_data, var_metadata)

  println("1. AnnotatedDataFrame Summary")
  println(@bio.annotated_data_frame_summary(adf))
  println("")

  println("2. Dimensions")
  println("   Rows: " + @bio.annotated_data_frame_nrow(adf).to_string())
  println("   Columns: " + @bio.annotated_data_frame_ncol(adf).to_string())
}