class JSONWrapper:
	def __init__(self, baseFileName:str, dataPath:str, key:str|int, value) -> None:
		self.baseFileName = baseFileName
		self.dataPath = dataPath
		self.key = key
		self.value = value

	def __iter__(self):
		self.__index = 0
		if type(self.value) is list:
			self.__iterData = [ JSONWrapper(self.baseFileName, f"{self.dataPath}[{i}]", i, item) for i, item in enumerate(self.value)]
		elif type(self.value) is dict:
			#self.__iterData = [ MetaData.Entry(self.metaData, f"{self.dataPath}/{key}", item) for key, item in self.value.items()]
			self.__iterData = list(self.value.keys())
		else:
			raise Exception(f"Can't iterate over ")
		return self

	def __next__(self):
		if self.__index < len(self.__iterData):
			self.__index += 1
			return self.__iterData[self.__index - 1]
		else:
			raise StopIteration
	
	def EntryCount(self) -> int:
		if type(self.value) is dict:
			return len(self.value)
		elif type(self.value) is list:
			return len(self.value)
		return 0

	def HasEntry(self, key) -> bool:
		if type(self.value) is dict:
			return key in self.value
		elif type(self.value) is list:
			if type(key) is int:
				return key >= 0 and key < len(self.value)
		return False

	def SetEntry(self, key, value):
		if type(self.value) is dict:
			self.value[key] = value
		elif type(self.value) is list:
			if type(key) is int:
				if key >= 0 and key < len(self.value):
					self.value[key] = value
				else:
					self.value.append(value)
			else:
				raise Exception(f"Invalid list index for entry '{self.dataPath}[{key}]' in meta data '{self.baseFileName}'")
		else:
			raise Exception(f"Can't set entry '{self.dataPath}/{key}' to entry of type '{type(self.value)}' in meta data '{self.baseFileName}'")

	def GetEntry(self, key) -> "JSONWrapper":
		if type(self.value) is dict:
			if key in self.value:
				return JSONWrapper(self.baseFileName, f"{self.dataPath}/{key}", key, self.value[key])
			else:
				raise Exception(f"Missing entry '{self.dataPath}/{key}' in meta data '{self.baseFileName}'")
		elif type(self.value) is list:
			if type(key) is int:
				if key >= 0 and key < len(self.value):
					return JSONWrapper(self.baseFileName, f"{self.dataPath}[{key}]", key, self.value[key])
				else:
					raise Exception(f"List index out of range for entry '{self.dataPath}[{key}]' in meta data '{self.baseFileName}'")
			else:
				raise Exception(f"Invalid list index for entry '{self.dataPath}[{key}]' in meta data '{self.baseFileName}'")
		else:
			raise Exception(f"Can't get entry '{self.dataPath}/{key}' from entry of type '{type(self.value)}' in meta data '{self.baseFileName}'")

	def AsInt(self) -> int:
		if type(self.value) is int:
			return self.value
		else:
			raise Exception(f"Value '{self.dataPath}' must have type 'int' but found type '{type(self.value)}' in meta data '{self.baseFileName}'")

	def AsFloat(self) -> float:
		if type(self.value) is float:
			return self.value
		elif type(self.value) is int:
			return float(self.value)
		else:
			raise Exception(f"Value '{self.dataPath}' must have type 'float' but found type '{type(self.value)}' in meta data '{self.baseFileName}'")

	def AsString(self) -> str:
		if type(self.value) is str:
			return self.value
		else:
			raise Exception(f"Value '{self.dataPath}' must have type 'string' but found type '{type(self.value)}' in meta data '{self.baseFileName}'")

	def AsBool(self) -> bool:
		if type(self.value) is bool:
			return self.value
		else:
			raise Exception(f"Value '{self.dataPath}' must have type 'bool' but found type '{type(self.value)}' in meta data '{self.baseFileName}'")

	def AsList(self) -> list:
		if type(self.value) is list:
			return self.value
		else:
			raise Exception(f"Value '{self.dataPath}' must have type 'list' but found type '{type(self.value)}' in meta data '{self.baseFileName}'")

	def AsDict(self) -> dict:
		if type(self.value) is dict:
			return self.value
		else:
			raise Exception(f"Value '{self.dataPath}' must have type 'dict' but found type '{type(self.value)}' in meta data '{self.baseFileName}'")

	def AsParameter(self) -> float | int | str | bool:
		if type(self.value) in [float, int, str, bool]:
			return self.value
		else:
			raise Exception(f"Value '{self.dataPath}' must have type 'float' or 'int' or 'str' or 'bool' but found type '{type(self.value)}' in meta data '{self.baseFileName}'")