///|
pub(all) enum NormalizationOutcome {
  Changed(VcfRecord)
  Unchanged(VcfRecord)
  Invalid(String)
} derive(Debug, Eq)

///|
pub fn normalize_record(record : VcfRecord) -> NormalizationOutcome {
  if record.ref_allele == "" || record.alt_alleles.length() != 1 {
    NormalizationOutcome::Invalid(
      "normalization requires exactly one alternate allele",
    )
  } else {
    let alt = record.alt_alleles[0]
    if alt == "" ||
      is_symbolic_allele(alt) ||
      is_symbolic_allele(record.ref_allele) {
      NormalizationOutcome::Unchanged(record)
    } else {
      let normalized = normalize_basic(record)
      if normalized == record {
        NormalizationOutcome::Unchanged(normalized)
      } else {
        NormalizationOutcome::Changed(normalized)
      }
    }
  }
}

///|
fn is_symbolic_allele(allele : String) -> Bool {
  allele.length() >= 2 && allele.has_prefix("<") && allele.has_suffix(">")
}