use rbx_dom_weak::types::Ref;

use crate::context::Context;

#[derive(Debug)]
pub enum Error{
	NoScript,
	NoSource,
}

fn get_full_name(dom:&rbx_dom_weak::WeakDom,instance:&rbx_dom_weak::Instance)->String{
	let mut full_name=instance.name.clone();
	let mut pref=instance.parent();
	while let Some(parent)=dom.get_by_ref(pref){
		full_name.insert(0,'.');
		full_name.insert_str(0,parent.name.as_str());
		pref=parent.parent();
	}
	full_name
}

pub struct Script{
	pub(crate)script:Ref,
}
impl Script{
	pub const fn new(script:Ref)->Self{
		Self{script}
	}
	pub fn name_source(&self,context:&Context)->Result<(String,String),Error>{
		let instance=context.dom.get_by_ref(self.script).ok_or(Error::NoScript)?;
		let source=match instance.properties.get("Source").ok_or(Error::NoSource)?{
			rbx_dom_weak::types::Variant::String(s)=>s.clone(),
			_=>Err(Error::NoSource)?,
		};
		Ok((get_full_name(&context.dom,instance),source))
	}
}