///|
/// CSI index demo: parse a CSI index and show its binning parameters.

///|
let demo_csi_base64 = "Q1NJAQ4AAAAGAAAAJgAAAAIAAAABAAAAAgAAAAAAAAAjAAAAAAAAAAoAAABjaHIxAGNocjIAAgAAAAIAAABJkgAAeQAAAAAAAAABAAAAeQAAAAAAAACjAAAAAAAAAEqSBAAAAAAAAAAAAAIAAAB5AAAAAAAAAKMAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAIAAABJkgAAowAAAAAAAAABAAAAowAAAAAAAAAAAJ4AAAAAAEqSBAAAAAAAAAAAAAIAAACjAAAAAAAAAAAAngAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"

///|
fn main raise {
  let idx = @src.parse_csi(@src.base64_decode(demo_csi_base64))
  println(
    "CSI: min_shift=\{idx.min_shift} n_lvls=\{idx.n_lvls} n_ref=\{idx.references.length()} n_no_coor=\{idx.n_no_coor}",
  )
  for i = 0; i < idx.references.length(); i = i + 1 {
    let r = idx.references[i]
    println("  ref \{i}: \{r.bins.length()} bins")
    for b in r.bins {
      println(
        "    bin=\{b.bin} loffset=\{b.loffset} chunks=\{b.chunks.length()}",
      )
    }
  }
  println(
    "reg2bins(100, 20000, 14, 6) = \{Repr(@src.csi_reg2bins(100, 20000, 14, 6))}",
  )
  let q = @src.csi_query(idx, 0, 0, 1000)
  println(
    "query chr1 [0,1000): min_off=\{q.min_off} chunks=\{q.chunks.length()}",
  )
}