Documentation
use rust_htslib::bam::{self, Record};

use crate::utils::generate_tmp_filename;
use crate::fastx_reader::{fasta_reader, fastq_reader};

pub fn fasta2bam(fa_filename: &str, delim: &str, channel_idx: usize) -> String {

    let fasta_reader = fasta_reader::FastaFileReader::new(fa_filename.to_string());

    let mut header = bam::Header::new();
    let mut hd = bam::header::HeaderRecord::new(b"HD");
    hd.push_tag(b"VN", "1.5");
    hd.push_tag(b"SO", "unknown");
    header.push_record(&hd);

    let mut hd = bam::header::HeaderRecord::new(b"SQ");
    hd.push_tag(b"SN", "chr1");
    hd.push_tag(b"LN", "1234");
    header.push_record(&hd);


    let o_filepath = format!("{}.bam", fa_filename.rsplit_once(".").unwrap().0);
    let o_filepath = generate_tmp_filename(&o_filepath);
    let mut bam_writer = bam::Writer::from_path(&o_filepath, &header, bam::Format::Bam).unwrap();
    bam_writer.set_threads(4).unwrap();

    for read_info in fasta_reader {
        let qname = read_info.name;
        let seq = read_info.seq;
        let items = qname.split(delim).skip(channel_idx).collect::<Vec<_>>();
        let ch = items[0].parse::<usize>().unwrap();

        let mut bam_record = Record::new();
        bam_record.set(qname.as_bytes(), None, seq.as_bytes(), &vec![255; seq.len()]);
        bam_record.push_aux(b"ch", bam::record::Aux::U32(ch as u32)).unwrap();
        bam_record.set_tid(0);
        bam_writer.write(&bam_record).unwrap();
    }

    o_filepath
}


pub fn fastq2bam(fq_filename: &str, delim: &str, channel_idx: usize) -> String {

    let fq_reader = fastq_reader::FastqReader::new(fq_filename.to_string());

    let mut header = bam::Header::new();
    let mut hd = bam::header::HeaderRecord::new(b"HD");
    hd.push_tag(b"VN", "1.5");
    hd.push_tag(b"SO", "unknown");
    header.push_record(&hd);

    let mut hd = bam::header::HeaderRecord::new(b"SQ");
    hd.push_tag(b"SN", "chr1");
    hd.push_tag(b"LN", "1234");
    header.push_record(&hd);


    let o_filepath = format!("{}.bam", fq_filename.rsplit_once(".").unwrap().0);
    let o_filepath = generate_tmp_filename(&o_filepath);
    let mut bam_writer = bam::Writer::from_path(&o_filepath, &header, bam::Format::Bam).unwrap();
    bam_writer.set_threads(4).unwrap();

    for read_info in fq_reader {
        let qname = read_info.name;
        let seq = read_info.seq;
        let qual = read_info.qual.unwrap();

        let items = qname.split(delim).skip(channel_idx).collect::<Vec<_>>();
        let ch = items[0].parse::<usize>().unwrap();

        let mut bam_record = Record::new();

        bam_record.set_tid(0);

        bam_record.set(qname.as_bytes(), None, seq.as_bytes(), &qual);
        bam_record.push_aux(b"ch", bam::record::Aux::U32(ch as u32)).unwrap();
        bam_writer.write(&bam_record).unwrap();
    }

    o_filepath
}