use super::ListItem;
use super::Group;
use crate::graphics::CharAttribute;

pub struct Item<T>
where
    T: ListItem,
{
    data: T,
    checked: bool,
    attr: Option<CharAttribute>,
    group_id: u16,
    icon: [char;2],
}

impl<T> Item<T> where T: ListItem {
    pub fn new(data: T, checked: bool, attr: Option<CharAttribute>, icon_chars: [char;2], group: Group) -> Self {
        Self {
            data,
            checked,
            attr,
            group_id: group.index(),
            icon: icon_chars,
        }
    }
    pub fn with_group(data: T, group: Group) -> Self {
        Self {
            data,
            checked: false,
            attr: None,
            group_id: group.index(),
            icon: [0u8 as char, 0u8 as char],
        }
    }
    #[inline(always)]
    pub fn value(&self) -> &T {
        &self.data
    }
    #[inline(always)]
    pub fn value_mut(&mut self) -> &mut T {
        &mut self.data
    }
    #[inline(always)]
    pub fn is_checked(&self) -> bool {
        self.checked
    }
    #[inline(always)]
    pub(super) fn set_checked(&mut self, value: bool) {
        self.checked = value;
    }
    #[inline(always)]
    pub(super) fn icon_first_character(&self) -> char {
        self.icon[0]
    }
    #[inline(always)]
    pub(super) fn icon_second_character(&self) -> char {
        self.icon[1]
    }
    #[inline(always)]
    pub(super) fn group_id(&self) -> u16 {
        self.group_id
    }
    #[inline(always)]
    pub(super) fn render_attr(&self) -> Option<CharAttribute> {
        self.attr
    }
}
impl<T> From<T> for Item<T> where T: ListItem {
    fn from(value: T) -> Self {
        Self {
            data: value,
            checked: false,
            attr: None,
            group_id: 0,
            icon: [0u8 as char, 0u8 as char],
        }
    }
}