///|
/// primersearch demo - EMBOSS primer matching and PCR product prediction.
/// Inspired by Biopython Bio.Emboss.PrimerSearch.
fn main {
  println("=== primersearch Demo: Primer Matching & PCR ===")
  println("")

  // Step 1: Define primer pairs
  println("--- Step 1: Primer Pairs ---")
  let pairs = [
    @src.PrimerPair::new("GeneA", "ATGAAACGTT", "TTACAGCTAA"),
    @src.PrimerPair::new("GeneB", "GGCCTTAACC", "GGAATTCCGG"),
  ]
  let mut i = 0
  while i < pairs.length() {
    println(pairs[i].name + ": " + pairs[i].forward + " / " + pairs[i].reverse)
    i = i + 1
  }
  println("")

  // Step 2: Target sequences
  println("--- Step 2: Target Sequences ---")
  let seqs : Array[(String, String)] = [
    ("chr1", "GGGATGAAACGTTCCCTTTACAGCTAAAGGG"),
    ("chr2", "TTTGGCCGGCCTTAACCCGGGGAATTCCGGTTT"),
  ]
  let mut j = 0
  while j < seqs.length() {
    println(seqs[j].0 + ": " + seqs[j].1)
    j = j + 1
  }
  println("")

  // Step 3: Run primersearch
  println("--- Step 3: Primersearch Results ---")
  let result = @src.primersearch_run(pairs, seqs)
  println(@src.primersearch_to_string(result))
  println("")

  // Step 4: Filter by size
  println("--- Step 4: Filter by Amplicon Size ---")
  if result.products.length() > 0 {
    let size = result.products[0].product_size
    let filtered = @src.primersearch_filter_by_size(result, size - 5, size + 5)
    println(
      "Products within " +
      (size - 5).to_string() +
      "-" +
      (size + 5).to_string() +
      " bp: " +
      filtered.length().to_string(),
    )
  }
  println("")

  // Step 5: Mismatch-tolerant search
  println("--- Step 5: Mismatch-Tolerant Search ---")
  let seq = "GGGATGAAACGTTCCCTTTACAGCTAAAGGG"
  let hits0 = @src.primersearch_find_hits(seq, "ATGAAACGTA", max_mismatches=0)
  let hits1 = @src.primersearch_find_hits(seq, "ATGAAACGTA", max_mismatches=1)
  println("Primer 'ATGAAACGTA' (1 mismatch):")
  println("  0 mismatches: " + hits0.length().to_string() + " hits")
  println("  1 mismatch:   " + hits1.length().to_string() + " hits")
  println("")

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