///|
/// BCF (binary VCF) Demo.
///
/// Demonstrates the BCF2 parser: decoding the header name dictionaries and
/// the per-record typed INFO/FORMAT values of a real (htslib-generated) BCF
/// byte stream.

///|
fn main raise {
  let bcf = @src.parse_bcf(
    @src.base64_decode(
      "QkNGAgJLAgAAIyNmaWxlZm9ybWF0PVZDRnY0LjIKIyNGSUxURVI9PElEPVBBU1MsRGVzY3JpcHRpb249IkFsbCBmaWx0ZXJzIHBhc3NlZCIsSURYPTA+CiMjY29udGlnPTxJRD1jaHIxLGxlbmd0aD0xMDAwLElEWD0wPgojI2NvbnRpZz08SUQ9Y2hyMixsZW5ndGg9NTAwLElEWD0xPgojI0ZJTFRFUj08SUQ9cTEwLERlc2NyaXB0aW9uPSJRdWFsaXR5ID4gMTAiLElEWD0xPgojI0lORk89PElEPURQLE51bWJlcj0xLFR5cGU9SW50ZWdlcixEZXNjcmlwdGlvbj0iRGVwdGgiLElEWD0yPgojI0lORk89PElEPUFGLE51bWJlcj1BLFR5cGU9RmxvYXQsRGVzY3JpcHRpb249IkFsbGVsZSBmcmVxIixJRFg9Mz4KIyNJTkZPPTxJRD1GTEFHWCxOdW1iZXI9MCxUeXBlPUZsYWcsRGVzY3JpcHRpb249IkEgZmxhZyIsSURYPTQ+CiMjRk9STUFUPTxJRD1HVCxOdW1iZXI9MSxUeXBlPVN0cmluZyxEZXNjcmlwdGlvbj0iR2Vub3R5cGUiLElEWD01PgojI0ZPUk1BVD08SUQ9QUQsTnVtYmVyPVIsVHlwZT1JbnRlZ2VyLERlc2NyaXB0aW9uPSJBbGxlbGUgZGVwdGhzIixJRFg9Nj4KI0NIUk9NCVBPUwlJRAlSRUYJQUxUCVFVQUwJRklMVEVSCUlORk8JRk9STUFUCVMxCgAwAAAACgAAAAAAAABlAAAAAQAAAAAA9EEDAAIAAQAAAjdyczEXQRdDEQARAhEMEQMVAACAPhEEABEFIQIEEQYhCgIwAAAACwAAAAEAAADHAAAAAQAAAAEAgH8CAAMAAQAAAgcXRxdUF0ERARECEQURAyXNzMw9zcxMPhEFIQQGEQYxAAMC",
    ),
  )

  println("=== header ===")
  println(
    "contigs: \{bcf.header.contig_names[0]}, \{bcf.header.contig_names[1]}",
  )
  println(
    "filters: \{bcf.header.id_name(bcf.header.filter_ids[0])}, \{bcf.header.id_name(bcf.header.filter_ids[1])}",
  )
  println("samples: \{bcf.header.sample_names[0]}")

  println("\n=== records ===")
  for i = 0; i < bcf.records.length(); i = i + 1 {
    let r = bcf.records[i]
    println("\{r.chrom}:\{r.pos} \{r.ref_seq}>\{r.alt[0]} id=\{r.id}")
    for j = 0; j < r.info.length(); j = j + 1 {
      let inf = r.info[j]
      let name = bcf.header.id_name(inf.key_id)
      match inf.values[0] {
        BcfInt(v) => println("  INFO \{name} = \{v} (int)")
        BcfFloat(x) => println("  INFO \{name} = \{x} (float)")
        BcfFlag => println("  INFO \{name} (flag)")
        _ => println("  INFO \{name}")
      }
    }
    // decode GT from the first FORMAT field
    for j = 0; j < r.formats.length(); j = j + 1 {
      let fm = r.formats[j]
      let name = bcf.header.id_name(fm.key_id)
      if name == "GT" {
        match (fm.values[0], fm.values[1]) {
          (BcfInt(a), BcfInt(b)) =>
            println(
              "  FORMAT GT = \{Repr(@src.bcf_gt_allele(a))}/\{Repr(@src.bcf_gt_allele(b))}",
            )
          _ => println("  FORMAT GT = ?")
        }
      }
    }
  }
}