///|
/// Bioconductor SeqArray Demo - GDS-style variant data container.
///
/// Demonstrates the port of the Bioconductor `SeqArray` package
/// (Zheng et al.): VCF import via seqVCF2GDS, the hierarchical GDS
/// node tree, sample/variant filters (seqSetFilter semantics) and
/// dosage / allele-frequency / missing-rate summaries.

///|
/// A small multi-sample VCF with a haploid call, a multi-allelic site
/// and a missing genotype.
fn demo_vcf() -> String {
  "##fileformat=VCFv4.2\n" +
  "#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\tFORMAT\tS1\tS2\tS3\n" +
  "1\t100\trs1\tA\tG\t.\tPASS\t.\tGT\t0/0\t0/1\t1/1\n" +
  "1\t200\t.\tC\tA,T\t.\tPASS\t.\tGT\t0/1\t./.\t2/2\n" +
  "2\t150\trs3\tG\tC\t.\tPASS\t.\tGT\t1\t0/0\t0|1\n" +
  "2\t300\trs4\tT\tA\t.\tPASS\t.\tGT\t0/1\t1/1\t0/0\n"
}

///|
fn mean(values : Array[Double]) -> Double {
  let mut total = 0.0
  for v in values {
    total = total + v
  }
  total / values.length().to_double()
}

///|
fn mean_int(values : Array[Int32]) -> Double {
  let mut total = 0
  for v in values {
    total = total + v
  }
  total.to_double() / values.length().to_double()
}

///|
fn main raise {
  println("=== SeqArray: VCF -> GDS import (seqVCF2GDS) ===")
  let vcf = @src.parse_vcf(demo_vcf())
  let data = @src.seq_vcf2gds(vcf)
  println("samples  : \{Repr(data.sample_ids())}")
  println("variants : \{Repr(data.variant_ids())}")
  println("chroms   : \{Repr(data.chromosomes())}")
  println("positions: \{Repr(data.positions())}")
  println("alleles  : \{Repr(data.alleles())}")

  println("\n=== GDS node tree ===")
  let file = @src.gds_file_new()
  let _ = file.add_node(
    "",
    @src.GdsNode::leaf(
      "sample.id",
      "sample identifiers",
      @src.GdsValue::GdsStringArray(["S1", "S2", "S3"]),
    ),
  )
  let _ = file.add_node(
    "annotation/info/DP",
    @src.GdsNode::leaf(
      "DP",
      "read depth",
      @src.GdsValue::GdsIntArray([10, 20, 30]),
    ),
  )
  println("has annotation/info/DP : \{file.has_node("annotation/info/DP")}")
  println("has sample.id          : \{file.has_node("sample.id")}")
  println("has annotation/missing : \{file.has_node("annotation/missing")}")

  println("\n=== Genotype dosages (filtered view) ===")
  let dosages = data.genotype_dosages()
  for v in 0..