fn class_is_a(class: &str, superclass: &str) -> bool {
    if class==superclass {
        return true
    }
    let class_descriptor=rbx_reflection_database::get().classes.get(class);
    if let Some(descriptor) = &class_descriptor {
        if let Some(class_super) = &descriptor.superclass {
            return class_is_a(&class_super, superclass)
        }
    }
    return false
}

fn recursive_collect_scripts(scripts: &mut std::vec::Vec<String>,dom: &rbx_dom_weak::WeakDom, instance: &rbx_dom_weak::Instance){
    for &referent in instance.children() {
        let c = dom.get_by_ref(referent).unwrap();
        if class_is_a(c.class.as_str(), "LuaSourceContainer") {
            if let Some(rbx_dom_weak::types::Variant::String(s)) = c.properties.get("Source") {
                scripts.push(s.clone());
            }
        }
        recursive_collect_scripts(scripts,dom,c);
    }
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Using buffered I/O is recommended with rbx_binary
    let input = std::io::BufReader::new(std::fs::File::open("map.rbxm")?);

    let dom = rbx_binary::from_reader(input)?;

    //Construct allowed scripts
    let mut allowed = std::collections::HashSet::<String>::new();
    for entry in std::fs::read_dir("allowed")? {
        allowed.insert(std::fs::read_to_string(entry?.path())?);
    }

    let mut scripts = std::vec::Vec::<String>::new();
    recursive_collect_scripts(&mut scripts, &dom, dom.root());

    //check scribb
    let mut any_failed=false;
    for (i,script) in scripts.iter().enumerate() {
        if allowed.contains(script) {
            println!("pass");
        }else{
            println!("fail");
            any_failed=true;
            std::fs::write(format!("blocked/{}.lua",i),script)?;
        }
    }
    if any_failed {
        println!("One or more scripts are not allowed.");
        return Ok(())//everything is not ok but idk how to return an error LMAO
    }
    println!("All scripts passed!");
    // std::process::Command::new("rbxcompiler")
    // .arg("--compile=false")
    // .arg("--group=6980477")
    // .arg("--asset=5692139100")
    // .arg("--input=map.rbxm")
    // .spawn()?;
    Ok(())
}