local me = ZygorGuidesViewer
local ZGV = me
if not ZGV then return end

me.skills = {}

local LS=ZygorGuidesViewer_L("Skills")

local skillSpells = {
	['Alchemy']=2259,
	['Blacksmithing']=2018,
	['Inscription']=45357,
	['Jewelcrafting']=25229,
	['Leatherworking']=2108,
	['Tailoring']=3908,
	['Enchanting']=7411,
	['Engineering']=4036,

	['Herbalism']=13614,
	['Mining']=2575,
	['Skinning']=8613,

	['Cooking']=2550,
	['First Aid']=3273,
	['Fishing']=7620,
}

tinsert(me.startups,function(self)
	self:AddEvent("SKILL_LINES_CHANGED","CacheSkills")
	self:AddEvent("TRADE_SKILL_UPDATE","CacheSkills")
	self:AddEvent("CHAT_MSG_SKILL","CacheSkills")
	self:AddEvent("CHAT_MSG_SYSTEM","Profession_CHAT_MSG_SYSTEM")
	self:AddEvent("TRADE_SKILL_SHOW","CacheRecipes")
	--self:AddEvent("CHAT_MSG_COMBAT_FACTION_CHANGE","CHAT_MSG_COMBAT_FACTION_CHANGE_Faction")

	self.skills[""]={
		active=false,
		level=0,
		max=0
	}

	if GetLocale()~="enUS" then
		ZGV.SkillsLocalized={}
		for skill,num in pairs(skillSpells) do
			ZGV.SkillsLocalized[skill]=GetSpellInfo(num)
		end
	end
end)

local ERR_LEARN_RECIPE_S_fmt = ERR_LEARN_RECIPE_S:gsub("%.","%%."):gsub("%%s","(.+)")
--local TRADESKILL_LOG_FIRSTPERSON_fmt = TRADESKILL_LOG_FIRSTPERSON:gsub("%%s","(.-)")

function me:Profession_CHAT_MSG_SYSTEM(event,text)
	local _,_,item = text:find(ERR_LEARN_RECIPE_S_fmt)
	if item then
		self.recentlyLearnedRecipes[item]=true
	end
end

function me:CacheSkills()
	if not TradeSkillFrame then
--TODO
	end

	if ZGV.Cata then
		local profs={GetProfessions()}
		for i,prof in pairs(profs) do
			local name,icon,rank,maxrank,numspells,spelloffset,skillline = GetProfessionInfo(prof)

			local pro = self.skills[name]
			if not pro then
				pro={}
				self.skills[name]=pro
			end
			pro.level=rank
			pro.max=maxrank
			pro.active=true
		end
	else
		for i=1,70 do
			local skillName, header, isExpanded, skillRank, numTempPoints, skillModifier, skillMaxRank, isAbandonable, stepCost, rankCost, minLevel, skillCostType, skillDescription = GetSkillLineInfo(i)

			if not header and not child and skillName then 
				local pro = self.skills[skillName]
				if not pro then
					pro={}
					self.skills[skillName]=pro
				end
				pro.level=skillRank
				pro.max=skillMaxRank
				pro.active=true
			end
		end
	end
end

function me:GetSkill(name)
	if self.SkillsLocalized and self.SkillsLocalized[name] then name=self.SkillsLocalized[name] end
	return self.skills[name] or self.skills[""]
end

function me:CacheRecipes()
	-- assume tradeskill window is open?
	local skill = GetTradeSkillLine()
	if skill=="UNKNOWN" then return end

	-- ah fuck this
	--[[
	-- clear filters
	if TradeSkillFrameAvailableFilterCheckButton:GetChecked() then
		TradeSkillOnlyShowMakeable(false)
		TradeSkillFrameAvailableFilterCheckButton:SetChecked(false)
	end
	--UIDropDownMenu_Initialize(TradeSkillInvSlotDropDown, TradeSkillInvSlotDropDown_Initialize)
	UIDropDownMenu_SetSelectedID(TradeSkillInvSlotDropDown,1)
	SetTradeSkillInvSlotFilter(0,1,1)
	--UIDropDownMenu_Initialize(TradeSkillSubClassDropDown, TradeSkillSubClassDropDown_Initialize)
	UIDropDownMenu_SetSelectedID(TradeSkillSubClassDropDown,1)
	SetTradeSkillSubClassFilter(0,1,1)

	--expand headers
	local openedheaders={}
	for i=GetNumTradeSkills(),1,-1 do
		local name,ttype,_,expanded = GetTradeSkillInfo(i)
		if ttype=="header" and not expanded then
			ExpandTradeSkillSubClass(i)
			openedheaders[name]=true
		end
	end
	--]]

	if IsTradeSkillLinked() then return end
	-- scan!
	local recipes = self.db.char.RecipesKnown

	local scanned=0
	for i = 1,500 do
		local tradeName,tradeType = GetTradeSkillInfo(i)

		if tradeName and tradeType~="header" then
			local link = GetTradeSkillRecipeLink(i)
			local spell = strmatch(link,"|H%w+:(%d+)")
			recipes[tonumber(spell)]=true
			scanned=scanned+1
		end
	end
	self:Debug(scanned.." "..skill.." recipes found")

	--[[
	--collapse headers
	for i=GetNumTradeSkills(),1,-1 do
		local name = GetTradeSkillInfo(i)
		if openedheaders[name] then CollapseTradeSkillSubClass(i) end
	end
	--]]
end

function me:PerformTradeSkill(id,count)
	if not count then count=1 end
	for i = 1,500 do
		local tradeName,tradeType = GetTradeSkillInfo(i)

		if tradeName and tradeType~="header" then
			local link = GetTradeSkillRecipeLink(i)
			local spell = tonumber(strmatch(link,"|H%w+:(%d+)"))
			if spell==id then
				DoTradeSkill(i,count)
			end
		end
	end
end