local roblox = require("@lune/roblox")

local db = roblox.getReflectionDatabase()

-- Make sure database classes exist + fields / properties are correct types

for _, className in db:GetClassNames() do
	local class = db:GetClass(className)
	assert(class ~= nil, "Missing " .. className .. " class in database")
	assert(type(class.Name) == "string", "Name property must be a string")
	assert(
		class.Superclass == nil or type(class.Superclass) == "string",
		"Superclass property must be nil or a string"
	)
	assert(type(class.Properties) == "table", "Properties property must be a table")
	assert(type(class.DefaultProperties) == "table", "DefaultProperties property must be a table")
	assert(type(class.Tags) == "table", "Tags property must be a table")
end

-- Any property present in default properties must also
-- be in properties *or* the properties of a superclass

for _, className in db:GetClassNames() do
	local class = db:GetClass(className)
	assert(class ~= nil)
	for name, value in class.DefaultProperties do
		local found = false
		local current: roblox.DatabaseClass? = class
		while current ~= nil do
			if current.Properties[name] ~= nil then
				found = true
				break
			elseif current.Superclass ~= nil then
				current = db:GetClass(current.Superclass)
			else
				break
			end
		end
		assert(found, "Missing default property " .. name .. " in properties table")
	end
end