///|
/// SMART domain database format parser demo.
///
/// Demonstrates the SMART protein domain analysis module for:
///   - Parsing SMART domain annotations
///   - Querying domains by name and evalue
///   - Domain classification (SMART, Pfam, signal peptide, transmembrane)
///   - Summary generation
///
/// Inspired by Biopython's Bio.Smart module.
/// Run: moon run examples/smart_demo
fn main {
  println("=== SMART Domain Parser Demo ===")
  println("Protein domain annotation analysis")
  println("Reference: Biopython Bio.Smart")
  println("")

  // ------------------------------------------------------------------
  // 1. Parse SMART sample data
  // ------------------------------------------------------------------
  println("=== 1. Parsing SMART Sample Data ===")
  let content = @bio.smart_sample()
  println("Input content (first 100 chars):")
  println(content[0:100].to_owned())
  println("")

  let result = @bio.smart_parse(content)
  println("Parsed results:")
  println("  Sequence ID: " + result.sequence_id)
  println("  Sequence Length: " + result.sequence_length.to_string())
  println("  Total Domains: " + @bio.smart_total_domains(result).to_string())
  println("  SMART Domains: " + result.domains.length().to_string())
  println("  Pfam Domains: " + result.pfam_domains.length().to_string())
  println("  Signal Peptides: " + result.signal_peptides.length().to_string())
  println("  Transmembrane: " + result.transmembrane.length().to_string())
  println("")

  // ------------------------------------------------------------------
  // 2. List all domains
  // ------------------------------------------------------------------
  println("=== 2. Domain Details ===")
  let mut i = 0
  while i < result.domains.length() {
    let d = result.domains[i]
    println("  Domain " + (i + 1).to_string() + ": " + d.domain_name)
    println("    Type: " + d.domain_type)
    println("    Location: " + d.start.to_string() + " - " + d.end.to_string())
    println("    E-value: " + d.evalue.to_string())
    println("    Description: " + d.description)
    println("")
    i = i + 1
  }

  // ------------------------------------------------------------------
  // 3. Query domains by name
  // ------------------------------------------------------------------
  println("=== 3. Query: Find 'ABC' domains ===")
  let abc_domains = @bio.smart_find_domains(result, "ABC")
  println(
    "Found " + abc_domains.length().to_string() + " domains matching 'ABC':",
  )
  let mut q = 0
  while q < abc_domains.length() {
    println(
      "  - " +
      abc_domains[q].domain_name +
      " (evalue: " +
      abc_domains[q].evalue.to_string() +
      ")",
    )
    q = q + 1
  }
  println("")

  // ------------------------------------------------------------------
  // 4. Filter by evalue
  // ------------------------------------------------------------------
  println("=== 4. Filter by E-value (<= 1e-10) ===")
  let significant = @bio.smart_filter_evalue(result, 1.0e-10)
  println("Found " + significant.length().to_string() + " significant domains:")
  let mut s = 0
  while s < significant.length() {
    println(
      "  - " +
      significant[s].domain_name +
      " (evalue: " +
      significant[s].evalue.to_string() +
      ")",
    )
    s = s + 1
  }
  println("")

  // ------------------------------------------------------------------
  // 5. Best domain hit
  // ------------------------------------------------------------------
  println("=== 5. Best Domain Hit ===")
  match @bio.smart_best_domain(result) {
    Some(best) => {
      println("Best domain: " + best.domain_name)
      println("  E-value: " + best.evalue.to_string())
      println(
        "  Location: " + best.start.to_string() + " - " + best.end.to_string(),
      )
    }
    None => println("  No domains found")
  }
  println("")

  // ------------------------------------------------------------------
  // 6. Summary report
  // ------------------------------------------------------------------
  println("=== 6. Summary Report ===")
  let summary = @bio.smart_summary(result)
  println(summary)

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