use crate::namespace::{typedef::TypeDef, GlobalNamespace};

pub const TYPE_INTEGER: &str = "int";
pub const TYPE_FLOAT: &str = "float";
pub const TYPE_STRING: &str = "string";

pub const TRAIT_NUMERIC: &str = "Num";

pub const CMD_ADD: &str = "add";

#[allow(
    clippy::unwrap_used,
    reason = "Errs can only be returned in case of duplicate names in the same namespace, which will not happen here"
)]
#[allow(clippy::missing_panics_doc, reason = "will not panic")]
pub fn initialise_globals() -> GlobalNamespace {
    let ns = GlobalNamespace::init();

    let numeric = ns.register_trait(TRAIT_NUMERIC).unwrap();

    ns.register_type(TYPE_INTEGER).unwrap().add_trait(&numeric);
    ns.register_type(TYPE_FLOAT).unwrap().add_trait(&numeric);

    ns.register_type(TYPE_STRING).unwrap();

    // def math add [ Numeric Numeric ] -> Numeric
    ns.register_command(
        CMD_ADD,
        Some(TypeDef::List(vec![
            TypeDef::Trait(numeric),
            TypeDef::Trait(numeric),
        ])),
        Some(TypeDef::Trait(numeric)),
    )
    .unwrap();

    ns
}