Documentation
use std::fmt::Display;

#[derive(Debug, Default)]
pub struct ChannelReporter {
    pub inp_num: usize,
    pub filter_by_input_filter: usize,
    pub filter_by_no_align: usize,
    pub filter_by_cs2ref_align_fail: usize,

    pub out_num: usize,
}

impl Display for ChannelReporter {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(
            f,
            "\
    inp_num                    :{},
    filter_by_input_filter     :{},
    filter_by_no_align         :{},
    filter_by_cs2ref_align_fail:{},
    oup_num                    :{:.4}% ({})
        ",
            self.inp_num,
            self.filter_by_input_filter,
            self.filter_by_no_align,
            self.filter_by_cs2ref_align_fail,
            (self.out_num as f32 / (self.inp_num as f32 + 1e-4)) * 100.,
            self.out_num,
        )
    }
}

#[derive(Debug, Default)]
pub struct SbrReporter {
    pub inp_num: usize,
    pub used_num: usize,
    pub filter_by_length: usize,
    pub filter_by_alignment: usize,
    pub fallback_num: usize,
    pub fallback_resuced_num: usize
}

impl Display for SbrReporter {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(
            f,
            "\
    inp_num:{},
    filter_by_length:{:.4}% ({})
    filter_by_alignment:{:.4}% ({})
    fallback_num:{:.4}% ({})
    fallback_rescued_num:{:.4}% ({})
        ",
            self.inp_num,
            (self.filter_by_length as f32 / (self.inp_num as f32 + 1e-4)) * 100.,
            self.filter_by_length,
            (self.filter_by_alignment as f32 / (self.inp_num as f32 + 1e-4)) * 100.,
            self.filter_by_alignment,
            (self.fallback_num as f32 / (self.inp_num as f32 + 1e-4)) * 100.,
            self.fallback_num,
            (self.fallback_resuced_num as f32 / (self.inp_num as f32 + 1e-4)) * 100.,
            self.fallback_resuced_num,

        )
    }
}

#[derive(Debug, Default)]
pub struct Reporter {
    pub channel_reporter: ChannelReporter,
    pub sbr_reporter: SbrReporter,
}

impl Display for Reporter {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(
            f,
            "\
ChannelYield:
    {}

SubreadsYield:
    {}
        ",
            self.channel_reporter, self.sbr_reporter
        )
    }
}


#[cfg(test)]
mod test {
    use super::Reporter;


    #[test]
    fn test_reporter() {

        let reporter = Reporter::default();
        println!("{}", reporter);

    }
}