// A small sequence bench: FASTA and FASTQ read, GC content, the other strand, a protein, reading
// frames, qualities and k-mers, on sequences kept here so it runs anywhere.
//
//   quillo run fasta.qwe
//   then open http://localhost:8080/fasta, /sequence?s=ATGGCC, /fastq, /orfs, /kmers and /refused

use "fasta.qwer"

let sample = ">sp|P01308 insulin fragment
; a comment line
ATGGCCCTGTGGATGCGCCTCCTGCCCCTGCTG
GCGCTGCTGGCCCTCTGGGGACCTGACCCAGCC
>control
ACGTNNACGT
"

route GET /fasta {
    let records = fasta_parse(sample)?
    {
        records: records,
        back: fasta_write(records, 20)?,
    }
}

route GET /sequence ? { s: str = "ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG" } {
    {
        gc: fasta_gc(s),
        rc: fasta_reverse_complement(s)?,
        rna: fasta_transcribe(s),
        protein: fasta_translate(s, {})?,
        to_stop: fasta_translate(s, { to_stop: true })?,
        frame2: fasta_translate(s, { frame: 2 })?,
        minus: fasta_translate(s, { frame: -1 })?,
    }
}

// A stop in the standard code that codes tryptophan in mitochondria, and codons left open by N.
route GET /codes = {
    standard: fasta_translate("ATGTGAAGA", {})?,
    mitochondrial: fasta_translate("ATGTGAAGA", { table: 2 })?,
    open_codon: fasta_translate("GCNTTNATH", {})?,
    iupac: fasta_reverse_complement("ACGTRYSWKMBDHVNacgt")?,
    rna: fasta_reverse_complement("AUGGC")?,
}

let reads = "@read1 lane 1
GATTTGGGGTTCAAAGCAGT
+
!''*((((***+))%%%++)
@read2
ACGT
+read2
IIII
"

route GET /fastq {
    let f = fastq_parse(reads, {})?
    {
        encoding: f.encoding,
        reads: f.records,
        scores: fastq_scores("II5#", 33)?,
        back: fastq_write([{ id: "x", sequence: "ACGT", scores: [40, 30, 20, 2] }])?,
        trimmed: fastq_trim("ACGTACGTAC", "IIIIIII###", 20, 3)?,
    }
}

route GET /orfs = fasta_orfs("CCATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAGCC", 3, 1)?

route GET /kmers = {
    plain: fasta_kmers("ACGTACGTAC", 4, { limit: 3 })?,
    canonical: fasta_kmers("ACGTACGT", 3, { canonical: true })?,
    skipped: fasta_kmers("ACGNACG", 3, {})?.total,
}

route GET /refused = {
    headless: fasta_parse("ACGT\n").error,
    bad_base: fasta_parse(">x\nAC GT5\n").error,
    short_quality: fastq_parse("@r\nACGT\n+\nII\n", {}).error,
    no_plus: fastq_parse("@r\nACGT\n", {}).error,
    wrong_offset: fastq_parse("@r\nAC\n+\n!!\n", { encoding: "phred64" }).error,
    table: fasta_translate("ATG", { table: 99 }).error,
    k: fasta_kmers("ACGT", 0, {}).error,
    letter: fasta_reverse_complement("ACGX").error,
}
