use wasm_bindgen::prelude::*;

use super::*;

#[wasm_bindgen]
#[derive(Debug)]
pub struct TableOfContents(docx_rs::TableOfContents);

#[wasm_bindgen(js_name = createTableOfContents)]
pub fn create_table_of_contents() -> TableOfContents {
    TableOfContents(docx_rs::TableOfContents::new())
}

impl TableOfContents {
    pub fn take(self) -> docx_rs::TableOfContents {
        self.0
    }
}

#[wasm_bindgen]
impl TableOfContents {
    pub fn heading_styles_range(mut self, start: usize, end: usize) -> Self {
        self.0.instr = self.0.instr.heading_styles_range(start, end);
        self
    }

    pub fn add_style_with_level(mut self, style: &str, level: usize) -> Self {
        self.0.instr = self
            .0
            .instr
            .add_style_with_level(docx_rs::StyleWithLevel::new(style, level));
        self
    }

    pub fn hyperlink(mut self) -> Self {
        self.0.instr = self.0.instr.hyperlink();
        self
    }

    pub fn alias(mut self, a: &str) -> Self {
        self.0.alias = Some(a.into());
        self
    }

    pub fn page_ref_placeholder(mut self, a: &str) -> Self {
        self.0.page_ref_placeholder = Some(a.into());
        self
    }

    pub fn add_item(mut self, t: TableOfContentsItem) -> Self {
        self.0.items.push(t.take());
        self
    }

    pub fn auto(mut self) -> Self {
        self.0.auto = true;
        self
    }

    pub fn dirty(mut self) -> Self {
        self.0.dirty = true;
        self
    }
}
