use genepred::genepred::Extras;
use genepred::{Bed12, BedFormat, GenePred, Strand as GpStrand};
use crate::model::psl::{PslRecord, Strand};
use crate::ops::region::reference_block_interval;
#[allow(clippy::unnecessary_cast)]
pub fn to_genepred<P: PslRecord>(p: &P) -> GenePred {
let chrom = p.reference_name().to_vec();
let start = p.reference_start() as u64;
let end = p.reference_end() as u64;
let mut gene = GenePred::from_coords(chrom, start, end, Extras::new());
gene.set_name(Some(p.query_name().to_vec()));
gene.set_strand(Some(match p.strands().query {
Strand::Forward => GpStrand::Forward,
Strand::Reverse => GpStrand::Reverse,
}));
let mut intervals: Vec<(u64, u64)> = (0..p.block_count())
.map(|i| {
let r = reference_block_interval(p, i);
(r.start as u64, r.end as u64)
})
.collect();
intervals.sort_unstable_by_key(|&(s, _)| s);
gene.set_block_count(Some(intervals.len() as u32));
gene.set_block_starts(Some(intervals.iter().map(|&(s, _)| s).collect()));
gene.set_block_ends(Some(intervals.iter().map(|&(_, e)| e).collect()));
gene
}
pub fn to_bed<P: PslRecord, K: BedFormat>(p: &P) -> Vec<u8> {
to_genepred(p).to_bed::<K>()
}
pub fn to_bed12<P: PslRecord>(p: &P) -> Vec<u8> {
to_bed::<P, Bed12>(p)
}