--all Buildings
local ref_low
--medium (construction)
local ref_medium

--header
function widget:GetInfo()
   return {
      name         = "Selection Priority",
      desc         = "Sorts Units by Priority (atackunit>builder/commander>buildings)",
      author       = "Sheppy",
      date         = "2015",
      license      = "GPL",
      layer        = 0,
      enabled      = true
   }
end

function widget:CommandNotify(cmdID, cmdParams, cmdOptions)
	local selected = Spring.GetSelectedUnits()
	local low = {}
	local medium = {}
	local high = {}
	local deselect = 0
	--do nothing if CTRL is pressed
	local a,b,c,d = Spring.GetModKeyState() --alt ctrl ? shift , discard all but alt
	--Spring.Echo(Spring.GetModKeyState())

	if b then return end
	--iterate Selection
	for i=1,200 do
		if selected[i] == nil then break end
		--get name to match
		defID = UnitDefs[Spring.GetUnitDefID(selected[i])].name
		--Check what we got in out selection		
		if inTable(ref_low,defID) then
			table.insert(low,selected[i])
		elseif inTable(ref_medium,defID) then
			table.insert(medium,selected[i])
			if deselect == 0 then deselect = 1 end
		else 
			table.insert(high,selected[i])
			if deselect < 2 then deselect = 2 end
		end
	end
	--discard selections	
	if deselect == 1 then
		Spring.SelectUnitArray(medium,false)
		Spring.SelectUnitArray(high,true)
	elseif deselect == 2 then
		Spring.SelectUnitArray(high,false)
	end
end

function inTable(tbl,item)
	for key, value in pairs(tbl) do
		if value == item then return true end
	end
	return false
end

--for debugging purpose only
function debug()
	for key, value in pairs(medium) do
		Spring.Echo("val_med: " .. value)
	end
	for key, value in pairs(low) do
		Spring.Echo("val_low: " .. value)
	end
	for key, value in pairs(low) do
		Spring.Echo("val_high: " .. value)
	end 
end

--loading unit-names to match against
function widget:Initialize()
	ref_medium = {
		--arm
		"armcom",
		"armaca",
		"armca",
		"armacv",
		"armcv",
		"armack",
		"armck",
		"armcs",
		"armacs",
		"armacsub",
		"armch",
		"corch",
		--core
		"coracs",
		"corcom",
		"coraca",
		"coracv",
		"corack",
		"corca",
		"corck",
		"corcv",
		"corcs",
		"coracsub"
	}
	ref_low = {
		--arm
		"armaap",
		"armalab",
		"armap",
		"armadvsol",
		"armavp",
		"armarad",
		"armalab",
		"armbrtha",
		"armckfus",
		"armclaw",
		"armestor",
		"armfmkr",
		"armfus",
		"armlab",
		"armjam",
		"armmakr",
		"armmex",
		"armmoho",
		"armnanotc",
		"armrad",
		"armsolar",
		"armtide",
		"armvp",
		"armwin",
		"aafus",
		"amgeo",
		"armuwfus",
		"armeyes",
		"armason",
		"armasy",
		"armch",
		"armhp",
		"armmmkr",
		"armsy",
		"armgeo",
		"armuwadves",
		"armshltx",
		"armuwmex",
		"armuwmme",
		"armuwmmm",
		"cmgeo",
		"asubpen",
		--core
		"coraap",
		"coralab",
		"corap",
		"coradvsol",
		"coravp",
		"corarad",
		"coralab",
		"corbrtha",
		"corckfus",
		"corclaw",
		"corestor",
		"corfmkr",
		"corfus",
		"corlab",
		"corjam",
		"cormakr",
		"cormex",
		"cormoho",
		"cornanotc",
		"corrad",
		"corsolar",
		"cortide",
		"corvp",
		"corwin",
		"aafus",
		"amgeo",
		"coruwfus",
		"coreyes",
		"corason",
		"corasy",
		"corch",
		"corhp",
		"cormmkr",
		"corsy",
		"corgeo",
		"coruwadves",
		"corshltx",
		"coruwmex",
		"coruwmme",
		"coruwmmm",
		"cmgeo",
		"asubpen",
		"armhp",
		"armllt",
		"armhlt",
		"armjamt",
		"corhp",
		"corllt",
		"corhlt",
		"corjamt"
	}
	Spring.Echo("Namelist init done.")
end
