Documentation for this module may be created at Module:Sandbox/One Bar/doc

local p = {};
local item_data = mw.loadJsonData("Data:ItemData.json")
local heroes_data = mw.loadJsonData("Data:HeroData.json")
local soul_unlocks_data = mw.loadJsonData("Data:SoulUnlockData.json")

local function souls(frame, item)
	return frame:expandTemplate{ title = "Souls", args = {item}}
end

local function hero_icon(frame, hero)
	return frame:expandTemplate{ title = "HeroIcon", args = {hero}}
end

local key_to_name = {
	BulletDamage = "Bullet Damage",
	MaxHealth = "Health",
	TechPower = "Spirit Power",
	LightMeleeDamage = "Light Melee Damage",
	HeavyMeleeDamage = "Heavy Melee Damage"
}

local function filtered_heroes()
	local filtered = {}
	for _, hero in pairs(heroes_data) do
		if (not hero["IsDisabled"]) then
			table.insert(filtered, hero)
		end
	end
	return filtered
end

local function get_pi_list()
	local soul_pis = {}
	for _, v in ipairs(soul_unlocks_data) do
		if (v["PowerIncrease"]) then
			table.insert(soul_pis, v["RequiredSouls"])
		end
	end
	return soul_pis
end

p.pi_table = function(frame)
	local pi_souls_list = get_pi_list()
	local level_count = 0
	for _ in ipairs(pi_souls_list) do level_count = level_count + 1 end
	local property = frame.args[1] --frame:getParent().args[1]
	local name = key_to_name[property]
	local suffix = property == "BulletDamage" and " (Full Shot)" or ""
	
	local createTable = mw.html.create("table"):addClass("wikitable sortable"):done()
	local header1 = mw.html.create("tr")
	header1:tag("th"):attr("colspan", (level_count + 3)):wikitext("Base " .. name .. " based on PI"):done()
	createTable:node(header1)
	local header2 = mw.html.create("tr")
	header2
		:tag("th"):attr("rowspan", 2):wikitext("Hero"):done()
		:tag("th"):attr("rowspan", 2):wikitext("Base " .. name .. suffix):done()
		:tag("th"):attr("rowspan", 2):wikitext("PL Increase" .. suffix):done()
		:tag("th"):attr("colspan", level_count):wikitext("Souls Collected"):done()
	createTable:node(header2)
	local createTableHeader = mw.html.create("tr")
	for _, v in ipairs(pi_souls_list) do
		local souls_formatted = string.format("%.1fK", v / 1000)
		createTableHeader:tag("th"):wikitext(souls(frame, souls_formatted)):done()
	end
	createTable:node(createTableHeader)
	
	local filtered_heroes = filtered_heroes()
	for _, hero in ipairs(filtered_heroes) do
		local base = hero[property]
		local level = hero["LevelScaling"][property]
		local shots = hero["BulletsPerShot"]
		local tableData = mw.html.create("tr")
		tableData
			:tag("td"):wikitext(hero_icon(frame, hero["Name"])):done()
			:tag("td"):wikitext(base):done()
			:tag("td"):wikitext("+" .. level):done()
		
		for i, v in ipairs(pi_souls_list) do
			local total = (tonumber(base) ~= nil and base or 0) + (tonumber(level) ~= nil and level or 0)  * i
			tableData
				:tag("td"):wikitext(total):done()
		end
		
		createTable:node(tableData)
	end
	
	return tostring(createTable)
end

local function get_disabled_items_array()
	local disabledItems = {}
	for k, v in pairs(item_data) do
		if (v["IsDisabled"] == true and v["Name"] ~= nil) then
			disabledItems[k] = v
		end
	end
	return disabledItems
end

p.disabledItemsTable = function(frame)
	local requirements = {}
	local listofItems = ""
	local filteredData = {}
	filteredData = get_disabled_items_array()
	
	local createTable = mw.html.create('table')
			:addClass('wikitable sortable')
			:tag('caption'):wikitext("List of items"):done()
		
	local createTableHeader = mw.html.create('tr')
	createTableHeader
		:tag('th'):wikitext('Variable'):done()
		:tag('th'):wikitext('Name'):done()
		:tag('th'):wikitext('Category'):done()
		:tag('th'):wikitext('Description'):done()
		
	createTable:node(createTableHeader)
	
	-- query all the filtered items. itemName is the item table.
	for internalName, itemName in pairs(filteredData) do 
		local display = itemName["Name"]
		
		listofItems = listofItems .. itemName["Name"] .. "<br/>"
		
		
		local categoryDisplay = itemName["Slot"]
		
		local description = itemName["Description"]
		
		local tableData = mw.html.create('tr')
		tableData
			:tag('td'):wikitext(internalName):done()
			:tag('td'):wikitext(display):done()
			:tag('td'):wikitext(categoryDisplay):done()
			:tag('td'):wikitext(description):done()
			
		table.insert(requirements, tableData)
			
	end	
	
	for _, row in ipairs(requirements) do
		createTable:node(row)
	end
	
	return tostring(createTable)
end

return p