///|
/// Advanced Motifs Demo - JASPAR, TRANSFAC, alignment, and clustering.
///
/// Run: moon run examples/motifs_advanced_demo/main.mbt
fn main {
  println("=== Advanced Motifs Analysis Demo ===\n")

  // 1. JASPAR PFM parsing
  println("1. JASPAR PFM parsing:")
  let jaspar_pfm = ">MA0001.1 E2F1\n" +
    "A  [ 45   0 100   0   0   0   0   0  10   0  10  35  90 ]\n" +
    "C  [  1   0   0   0   0   0   0  90  80  10   0  10   0 ]\n" +
    "G  [  0  50   0   0 100 100  10   0  10  80  90  45  10 ]\n" +
    "T  [ 50   0   0 100   0   0  90   0   0  10   0  10   0 ]\n"
  let jaspar_motifs = @bio.parse_jaspar_pfm(jaspar_pfm)
  println("   Number of motifs: \{jaspar_motifs.length()}")
  if jaspar_motifs.length() > 0 {
    let jaspar_motif = jaspar_motifs[0]
    println("   Motif name: \{jaspar_motif.name}")
    println("   Motif width: \{jaspar_motif.pwm.length()}")
  }

  // 2. TRANSFAC parsing
  println("\n2. TRANSFAC format parsing:")
  let transfac = "ID  MA0002.1\n" +
    "NA  E2F1\n" +
    "PO    A   C   G   T\n" +
    "01  45   1   0  50\n" +
    "02   0   0  50   0\n" +
    "03 100   0   0   0\n" +
    "04   0   0   0 100\n" +
    "05   0   0 100   0\n" +
    "06   0   0 100   0\n" +
    "07   0   0  10  90\n" +
    "08   0  90   0   0\n" +
    "09  10  80  10   0\n" +
    "10   0  10  80  10\n" +
    "11  10   0  90   0\n" +
    "12  35  10  45  10\n" +
    "13  90   0  10   0\n" +
    "XX\n" +
    "//\n"
  let transfac_motifs = @bio.parse_transfac(transfac)
  println("   Number of motifs: \{transfac_motifs.length()}")
  if transfac_motifs.length() > 0 {
    let transfac_motif = transfac_motifs[0]
    println("   Motif name: \{transfac_motif.name}")
    println("   Motif width: \{transfac_motif.pwm.length()}")
  }

  // 3. Motif alignment
  println("\n3. Optimal motif alignment:")
  let pwm1 = [
    [0.9, 0.1, 0.0, 0.0],
    [0.1, 0.0, 0.0, 0.9],
    [0.0, 0.9, 0.1, 0.0],
    [0.8, 0.1, 0.1, 0.0],
  ]
  let pwm2 = [
    [0.85, 0.1, 0.05, 0.0],
    [0.1, 0.0, 0.0, 0.9],
    [0.0, 0.85, 0.15, 0.0],
  ]
  let alignment = @bio.optimal_motif_alignment(pwm1, pwm2)
  println("   Best score: \{alignment.score}")
  println("   Offset: \{alignment.offset}")
  println("   Strand: \{alignment.strand}")
  println("   Aligned length: \{alignment.aligned_length}")

  // 4. Motif comparison
  println("\n4. Motif comparison (KL divergence):")
  let kl_div = @bio.motif_kl_divergence(pwm1, pwm2)
  println("   KL divergence: \{kl_div}")

  println("\n5. Motif comparison (JS divergence):")
  let js_div = @bio.motif_js_divergence(pwm1, pwm2)
  println("   JS divergence: \{js_div}")

  // 6. Motif clustering
  println("\n6. Motif clustering:")
  let motif_names : Array[String] = ["motif1", "motif2"]
  let motif_pwms = [pwm1, pwm2]
  let clusters = @bio.cluster_motifs(motif_names, motif_pwms, 0.5)
  println("   Number of clusters: \{clusters.length()}")
  for i = 0; i < clusters.length(); i = i + 1 {
    let cluster = clusters[i]
    println(
      "   Cluster \{cluster.cluster_id}: \{cluster.motifs.length()} motifs",
    )
    println("     Representative: \{cluster.representative}")
    println("     Avg similarity: \{cluster.avg_similarity}")
  }

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