use super::Lexeme;
use super::Token;

#[derive(Clone, Debug)]
pub struct Formatter {
    lexemes: Vec<Lexeme>,
}

impl Formatter {
    pub fn new(lexemes: Vec<Lexeme>) -> Formatter {
        Formatter { lexemes }
    }

    pub fn to_string(&self) -> String {
        let tokens = self
            .lexemes
            .iter()
            .map(|lexeme| {
                let t = lexeme.token();
                match t {
                    Token::String(string) => format!("{string:?} "),
                    Token::Label(_) => format!("\n{t:?}\n    "),
                    Token::NewLine => format!("{t:?}\n    "),
                    Token::Clear => format!("{t:?}\n    "),
                    Token::ScrollOut(_, _) => format!("{t:?}\n    "),
                    Token::Save(_) => format!("{t:?}\n    "),
                    Token::SeekIfRand(_, _) => format!("{t:?}\n    "),
                    Token::SeekIfOwned(_, _) => format!("{t:?}\n    "),
                    Token::SeekIfUnowned(_, _) => format!("{t:?}\n    "),
                    Token::SetTrue(_) => format!("{t:?}\n    "),
                    Token::SetFalse(_) => format!("{t:?}\n    "),
                    Token::SeekIfTrue(_, _) => format!("{t:?}\n    "),
                    Token::SeekIfFalse(_, _) => format!("{t:?}\n    "),
                    Token::Seek(_) => format!("{t:?}\n"),
                    Token::End => format!("{t:?}\n    "),
                    t => format!("{t:?} "),
                }
            })
            .collect::<String>();

        format!("script![\n    {tokens}]")
    }
}
