///|
fn sequence_region_ref(
  name : String,
  category : String,
  topology : String,
  description : String,
  typical_scope : String,
) -> SequenceRegionReference {
  { name, category, topology, description, typical_scope }
}

///|
pub fn sequence_region_references() -> Array[SequenceRegionReference] {
  [
    sequence_region_ref(
      "chromosome", "primary_assembly", "linear", "A chromosome-level assembled molecule",
      "complete eukaryotic assemblies",
    ),
    sequence_region_ref(
      "autosome", "primary_assembly", "linear", "A non-sex chromosome molecule",
      "diploid organism assemblies",
    ),
    sequence_region_ref(
      "sex_chromosome", "primary_assembly", "linear", "A chromosome involved in sex determination",
      "sex chromosome annotation",
    ),
    sequence_region_ref(
      "mitochondrion", "organelle", "circular", "A mitochondrial genome molecule",
      "mitochondrial annotation",
    ),
    sequence_region_ref(
      "chloroplast", "organelle", "circular", "A chloroplast genome molecule", "plant and algal annotation",
    ),
    sequence_region_ref(
      "plastid", "organelle", "circular", "A plastid genome molecule", "plant and algal annotation",
    ),
    sequence_region_ref(
      "apicoplast", "organelle", "circular", "An apicoplast genome molecule", "apicomplexan annotation",
    ),
    sequence_region_ref(
      "plasmid", "extra_chromosomal", "circular", "An extra-chromosomal plasmid sequence",
      "microbial annotation",
    ),
    sequence_region_ref(
      "viral_segment", "extra_chromosomal", "linear", "A viral genome segment", "viral annotation",
    ),
    sequence_region_ref(
      "contig", "assembly_unit", "linear", "A contiguous assembled sequence", "draft assemblies",
    ),
    sequence_region_ref(
      "scaffold", "assembly_unit", "linear", "A sequence scaffold built from ordered contigs",
      "draft assemblies",
    ),
    sequence_region_ref(
      "supercontig", "assembly_unit", "linear", "A higher-level assembly unit above contig level",
      "large draft assemblies",
    ),
    sequence_region_ref(
      "ultracontig", "assembly_unit", "linear", "A large contig-like assembly unit used by some providers",
      "provider-specific assemblies",
    ),
    sequence_region_ref(
      "linkage_group", "assembly_unit", "linear", "A chromosome-scale unit defined by genetic linkage",
      "genetic map assemblies",
    ),
    sequence_region_ref(
      "unplaced_scaffold", "assembly_exception", "linear", "A scaffold not assigned to a chromosome",
      "assembly reports",
    ),
    sequence_region_ref(
      "unlocalized_scaffold", "assembly_exception", "linear", "A scaffold assigned to a chromosome but not a precise location",
      "assembly reports",
    ),
    sequence_region_ref(
      "alternate_locus", "assembly_exception", "linear", "An alternate representation of a genomic locus",
      "complex loci",
    ),
    sequence_region_ref(
      "haplotype", "assembly_exception", "linear", "A haplotype-specific sequence representation",
      "diploid or pangenome assemblies",
    ),
    sequence_region_ref(
      "patch_fix", "assembly_patch", "linear", "A patch sequence that fixes a primary assembly issue",
      "reference assembly updates",
    ),
    sequence_region_ref(
      "patch_novel", "assembly_patch", "linear", "A patch sequence that adds alternate novel sequence",
      "reference assembly updates",
    ),
    sequence_region_ref(
      "novel_patch", "assembly_patch", "linear", "A synonym-like label for a novel assembly patch",
      "reference assembly updates",
    ),
    sequence_region_ref(
      "fix_patch", "assembly_patch", "linear", "A synonym-like label for a fixing assembly patch",
      "reference assembly updates",
    ),
    sequence_region_ref(
      "decoy", "auxiliary", "linear", "An auxiliary sequence used to absorb ambiguous alignments",
      "alignment-aware annotation",
    ),
    sequence_region_ref(
      "adapter", "auxiliary", "linear", "An adapter or technical sequence entry",
      "quality control",
    ),
    sequence_region_ref(
      "spike_in", "auxiliary", "linear", "A spike-in control sequence", "experimental control annotation",
    ),
    sequence_region_ref(
      "phage", "extra_chromosomal", "linear", "A bacteriophage sequence region",
      "microbial annotation",
    ),
    sequence_region_ref(
      "provirus", "extra_chromosomal", "linear", "A viral-derived region integrated in a host assembly",
      "host genome annotation",
    ),
    sequence_region_ref(
      "integrated_plasmid", "extra_chromosomal", "linear", "A plasmid-derived region integrated in a chromosome",
      "microbial annotation",
    ),
    sequence_region_ref(
      "centromeric_satellite", "repeat_context", "linear", "A sequence unit dominated by centromeric satellite repeats",
      "repeat-rich assemblies",
    ),
    sequence_region_ref(
      "telomeric_repeat_array", "repeat_context", "linear", "A sequence unit dominated by telomeric repeats",
      "telomere-to-telomere assemblies",
    ),
    sequence_region_ref(
      "rDNA_array", "repeat_context", "linear", "A ribosomal DNA repeat array sequence",
      "repeat-rich assemblies",
    ),
    sequence_region_ref(
      "segmental_duplication", "repeat_context", "linear", "A sequence region enriched for segmental duplication",
      "complex reference regions",
    ),
    sequence_region_ref(
      "pseudoautosomal_region", "sex_chromosome_region", "linear", "A homologous region shared between sex chromosomes",
      "sex chromosome annotation",
    ),
    sequence_region_ref(
      "male_specific_region", "sex_chromosome_region", "linear", "A sex-chromosome region specific to male haplotypes",
      "sex chromosome annotation",
    ),
    sequence_region_ref(
      "female_specific_region", "sex_chromosome_region", "linear", "A sex-chromosome region specific to female haplotypes",
      "sex chromosome annotation",
    ),
    sequence_region_ref(
      "immune_locus", "complex_locus", "linear", "A sequence region containing immune receptor loci",
      "immune gene annotation",
    ),
    sequence_region_ref(
      "olfactory_locus", "complex_locus", "linear", "A sequence region containing olfactory receptor genes",
      "gene family annotation",
    ),
    sequence_region_ref(
      "histocompatibility_locus", "complex_locus", "linear", "A sequence region containing histocompatibility genes",
      "immune gene annotation",
    ),
    sequence_region_ref(
      "gene_cluster", "complex_locus", "linear", "A sequence region described as a gene cluster",
      "cluster-level annotation",
    ),
    sequence_region_ref(
      "bacterial_chromosome", "primary_assembly", "circular", "A bacterial chromosome molecule",
      "microbial annotation",
    ),
    sequence_region_ref(
      "archaeal_chromosome", "primary_assembly", "circular", "An archaeal chromosome molecule",
      "microbial annotation",
    ),
    sequence_region_ref(
      "linear_plasmid", "extra_chromosomal", "linear", "A plasmid sequence represented as linear",
      "microbial annotation",
    ),
    sequence_region_ref(
      "circular_contig", "assembly_unit", "circular", "A circular contig assembly unit",
      "microbial annotation",
    ),
    sequence_region_ref(
      "metagenome_contig", "metagenome", "linear", "A contig assembled from metagenomic reads",
      "metagenome annotation",
    ),
    sequence_region_ref(
      "metagenome_bin", "metagenome", "linear", "A genome bin from metagenomic assembly",
      "metagenome annotation",
    ),
    sequence_region_ref(
      "MAG", "metagenome", "linear", "A metagenome-assembled genome sequence set",
      "metagenome annotation",
    ),
    sequence_region_ref(
      "SAG", "metagenome", "linear", "A single-cell amplified genome sequence set",
      "single-cell annotation",
    ),
    sequence_region_ref(
      "pangenome_path", "pangenome", "linear", "A path through a pangenome representation",
      "graph-aware annotation",
    ),
    sequence_region_ref(
      "reference_path", "pangenome", "linear", "A reference path through a pangenome",
      "graph-aware annotation",
    ),
    sequence_region_ref(
      "alternate_path", "pangenome", "linear", "An alternate path through a pangenome",
      "graph-aware annotation",
    ),
  ]
}

///|
pub fn find_sequence_region_reference(name : String) -> SequenceRegionReference {
  for item in sequence_region_references() {
    if item.name == name {
      return item
    }
  }
  sequence_region_ref(
    name, "custom", "unknown", "Project-specific sequence region label", "local annotation",
  )
}

///|
pub fn sequence_region_references_by_category(
  category : String,
) -> Array[SequenceRegionReference] {
  let result : Array[SequenceRegionReference] = []
  for item in sequence_region_references() {
    if item.category == category {
      result.push(item)
    }
  }
  result
}

///|
pub fn sequence_region_references_by_topology(
  topology : String,
) -> Array[SequenceRegionReference] {
  let result : Array[SequenceRegionReference] = []
  for item in sequence_region_references() {
    if item.topology == topology {
      result.push(item)
    }
  }
  result
}

///|
pub fn SequenceRegionReference::to_tsv_row(
  self : SequenceRegionReference,
) -> String {
  [
    self.name,
    self.category,
    self.topology,
    self.description,
    self.typical_scope,
  ].join("\t")
}