///|
fn main {
  println("=== Biopython Shared-reference Alignment Demo ===")

  println("\n1. Adapt an existing pairwise alignment")
  let pairwise = @src.pairaligner_align("ACGT", "ACT")
  let pairwise_input = @src.shared_reference_input_from_pairwise(
    pairwise,
    reference_name="reference",
    reference_description="shared DNA template",
    query_name="pairwise_read",
    query_description="one deletion",
  ) catch {
    _ => abort("failed to adapt pairwise alignment")
  }
  println("  reference: " + pairwise_input.aligned_reference)
  println("  query:     " + pairwise_input.queries[0].aligned_sequence)

  println("\n2. Build a multi-query alignment with an insertion")
  let inserted = @src.shared_reference_sequence(
    "inserted_read",
    "ACGGT",
    description="one insertion",
  ) catch {
    _ => abort("failed to build inserted query")
  }
  let deleted = @src.shared_reference_sequence(
    "deleted_read",
    "A---T",
    description="three deletions",
  ) catch {
    _ => abort("failed to build deleted query")
  }
  let multiple_input = @src.shared_reference_input(
    "ACGT",
    "ACG-T",
    [inserted, deleted],
    reference_name="reference",
    reference_description="shared DNA template",
  ) catch {
    _ => abort("failed to build multi-query input")
  }

  println("\n3. Synchronize reference-boundary insertion slots")
  let alignment = @src.alignments_with_same_reference([
    pairwise_input, multiple_input,
  ]) catch {
    _ => abort("failed to merge shared-reference alignments")
  }
  println("  " + alignment.summary())
  println("  insertion widths: " + repr(alignment.insertion_widths))
  for index in 0.. reference: " +
    repr(alignment.query_to_reference(1, 3)),
  )
  println(
    "  inserted_read query position 4 -> reference: " +
    repr(alignment.query_to_reference(1, 4)),
  )
  println(
    "  reference position 3 -> inserted_read query: " +
    repr(alignment.reference_to_query(1, 3)),
  )

  println("\n5. Inspect alignment statistics")
  for index in 0.. abort("failed to convert merged alignment")
  }
  println(
    "  MSA dimensions: " +
    msa.num_records().to_string() +
    " x " +
    msa.get_alignment_length().to_string(),
  )
  println(alignment.to_fasta())

  println("=== Demo Complete ===")
}