///|
fn main {
  println("=== tximport Transcript Quantification Import Example ===")
  println("Inspired by Bioconductor tximport package")
  println("")

  let quant_sf_content1 = "# Name\tLength\tEffectiveLength\tTPM\tNumReads\n" +
    "ENST00000357654.5\t1500\t1480\t10.5\t150\n" +
    "ENST00000357655.3\t1200\t1180\t8.3\t120\n" +
    "ENST00000357656.2\t900\t880\t6.7\t95\n"

  let quant_sf_content2 = "# Name\tLength\tEffectiveLength\tTPM\tNumReads\n" +
    "ENST00000357654.5\t1500\t1480\t15.2\t220\n" +
    "ENST00000357655.3\t1200\t1180\t12.1\t175\n" +
    "ENST00000357656.2\t900\t880\t9.8\t140\n"

  let tx2gene = [
    @bio.tx2gene_new("ENST00000357654", "ENSG00000130203", "TP53"),
    @bio.tx2gene_new("ENST00000357655", "ENSG00000012048", "BRCA1"),
    @bio.tx2gene_new("ENST00000357656", "ENSG00000139618", "BRCA2"),
  ]

  println("1. Parse quant.sf File")
  let (tx_names, _abundance, _counts, _length) = @bio.parse_quant_sf(
    quant_sf_content1,
  )
  println("   Transcripts: " + tx_names.length().to_string())
  println("")

  println("2. tx_import (multi-sample)")
  let txi = @bio.tx_import(
    [quant_sf_content1, quant_sf_content2],
    tx2gene,
    true,
  )
  println(@bio.tx_import_data_summary(txi))
  println("")

  println("3. Transcript-level Abundance")
  let mut i = 0
  while i < txi.tx_names.length() && i < 3 {
    println("   - " + txi.tx_names[i] + " -> " + txi.gene_names[i])
    i = i + 1
  }
  println("")

  println("4. Summarize to Gene Level")
  let gene_level = @bio.summarize_to_gene(txi, tx2gene, true)
  println(
    "   Gene-level data: " +
    gene_level.gene_names.length().to_string() +
    " genes",
  )
  println("")

  println("5. Gene Names")
  i = 0
  while i < gene_level.gene_names.length() {
    println("   - " + gene_level.gene_names[i])
    i = i + 1
  }
  println("")

  println("6. Convert to ExpressionSet")
  let eset_counts = @bio.tx_import_data_to_expression_set(gene_level, "counts")
  println("   Counts ExpressionSet:")
  println("     Features: " + @bio.expression_set_nrow(eset_counts).to_string())
  println("     Samples: " + @bio.expression_set_ncol(eset_counts).to_string())
  println("")

  let eset_tpm = @bio.tx_import_data_to_expression_set(gene_level, "abundance")
  println("   TPM ExpressionSet:")
  println("     Features: " + @bio.expression_set_nrow(eset_tpm).to_string())
  println("     Samples: " + @bio.expression_set_ncol(eset_tpm).to_string())
  println("")

  println("7. Filter Low Expression (min 100 counts)")
  let filtered = @bio.tx_import_filter_low_expression(txi, 100.0)
  println(
    "   After filtering: " +
    filtered.tx_names.length().to_string() +
    " transcripts",
  )
  println("")

  println("8. Sample Names")
  i = 0
  while i < txi.sample_names.length() {
    println("   - " + txi.sample_names[i])
    i = i + 1
  }
}