use tailspin::config::KeywordConfig;
use tailspin::style::{Color, Style};

pub fn get_builtin_keywords(disable_builtin_keywords: bool) -> Vec<KeywordConfig> {
    if disable_builtin_keywords {
        vec![]
    } else {
        builtin_keywords()
    }
}

fn builtin_keywords() -> Vec<KeywordConfig> {
    let severity_levels = vec![
        KeywordConfig {
            words: vec!["ERROR".to_string()],
            style: Style::new().fg(Color::Red),
        },
        KeywordConfig {
            words: vec!["WARN".to_string(), "WARNING".to_string()],
            style: Style::new().fg(Color::Yellow),
        },
        KeywordConfig {
            words: vec!["INFO".to_string()],
            style: Style::new().fg(Color::White),
        },
        KeywordConfig {
            words: vec!["SUCCESS".to_string(), "DEBUG".to_string()],
            style: Style::new().fg(Color::Green),
        },
        KeywordConfig {
            words: vec!["TRACE".to_string()],
            style: Style::new().faint(),
        },
    ];

    let rest_keywords = vec![
        KeywordConfig {
            words: vec!["GET".to_string()],
            style: Style::new().fg(Color::Black).on(Color::Green),
        },
        KeywordConfig {
            words: vec!["POST".to_string()],
            style: Style::new().fg(Color::Black).on(Color::Yellow),
        },
        KeywordConfig {
            words: vec!["PUT".to_string(), "PATCH".to_string()],
            style: Style::new().fg(Color::Black).on(Color::Magenta),
        },
        KeywordConfig {
            words: vec!["DELETE".to_string()],
            style: Style::new().fg(Color::Black).on(Color::Red),
        },
        KeywordConfig {
            words: vec!["HEAD".to_string(), "CONNECT".to_string(), "OPTIONS".to_string()],
            style: Style::new().fg(Color::Black).on(Color::Blue),
        },
    ];

    let booleans = [
        KeywordConfig {
            words: vec![
                "null".to_string(),
                "NULL".to_string(),
                "nil".to_string(),
                "NIL".to_string(),
                "NaN".to_string(),
                "undefined".to_string(),
                "false".to_string(),
                "FALSE".to_string(),
            ],
            style: Style::new().fg(Color::Red).italic(),
        },
        KeywordConfig {
            words: vec!["true".to_string(), "TRUE".to_string()],
            style: Style::new().fg(Color::Green).italic(),
        },
    ];

    vec![]
        .into_iter()
        .chain(severity_levels)
        .chain(rest_keywords)
        .chain(booleans)
        .collect()
}
