use std::mem;

use bytestring::ByteString;
use tui_tree_widget::TreeItem;

#[derive(Debug, Default)]
pub struct TreeText {
    _raw: ByteString,
    items: Vec<TreeItem<'static, ByteString>>,
}

impl TreeText {
    pub fn new(raw: String) -> Self {
        let raw: ByteString = raw.into();

        let mut items = vec![];

        for line in raw.lines() {
            let span = line.trim_end();
            match span.strip_prefix("  ") {
                None => {
                    let bookmark = TreeItem::new(raw.slice_ref(span), line.trim_end(), vec![])
                        .expect("must be valid");
                    items.push(bookmark);
                }
                Some(remote) => {
                    let remote = TreeItem::new_leaf(
                        raw.slice_ref(remote.trim_start_matches('@').trim_end_matches('*')),
                        remote,
                    );
                    items
                        .last_mut()
                        .expect("must be parent node")
                        .add_child(remote)
                        .expect("must be valid");
                }
            }
        }

        let items =
            unsafe { mem::transmute::<Vec<TreeItem<'_, _>>, Vec<TreeItem<'static, _>>>(items) };

        Self { _raw: raw, items }
    }

    pub fn get(&self) -> &[TreeItem<'static, ByteString>] {
        &self.items
    }
}