Quantcast
local addonname, addon = ...
local PJ = C_PetJournal

local filterflags = {
	[LE_PET_JOURNAL_FLAG_COLLECTED] = false,
	[LE_PET_JOURNAL_FLAG_FAVORITES] = false,
	[LE_PET_JOURNAL_FLAG_NOT_COLLECTED] = false
}

local filtertypes = {}
local filtersources = {}

local function EventHandler(self, event, ...)
	if type(self[event]) == "function" then
		self[event](self, ...)
	end
end

function addon:Initialize()
	self.modules = {}
	self.petidx = {}
	self.petown = {}
	self.frame = CreateFrame"Frame"
	self.frame:RegisterEvent"ADDON_LOADED"
	self.frame:RegisterEvent"PET_JOURNAL_LIST_UPDATE"
	self.frame:SetScript("OnEvent", function(f, ...) EventHandler(addon, ...) end)
end

function addon:CreateModule(name)
	local module = CreateFrame"Frame"
	module:SetScript("OnEvent", EventHandler)

	self.modules[name] = module

	return module
end

function addon:EnableModules()
	for name, module in pairs(self.modules) do
		if type(module.Enable) == "function" then
			module:Enable()
		end
	end
end

function addon:GetNumPets()
	return #self.petidx
end

function addon:GetNumUniquePets()
	local count = 0
	for species, owned in pairs(self.petown) do
		if owned then
			count = count + 1
		end
	end

	return count
end

function addon:GetPetInfo(idx)
	local species = self.petidx[idx]
	if species then
		return species, PJ.GetPetInfoBySpeciesID(species)
	end
end

function addon:GetPetInfoByName(name)
	for i = 1, self:GetNumPets() do
		local pname = select(2, self:GetPetInfo(i))
		if pname == name then
			return i, self:GetPetInfo(i)
		end
	end
end

function addon:GetPetInfoByGUID(guid)
	local first3 = tonumber("0x"..guid:sub(3, 5))
	local unittype = bit.band(first3, 0x00f)

	if unittype ~= 0x03 then return end

	local npcid = tonumber("0x"..guid:sub(7, 10))

	for i = 1, self:GetNumPets() do
		local petnpc = select(5, self:GetPetInfo(i))

		if petnpc == npcid then
			return i, self:GetPetInfo(i)
		end
	end
end


function addon:IsPetSpeciesOwned(species)
	return self.petown[species]
end

function addon:ClearPetJournalFilters()
	self.updating = true

	for key, val in pairs(filterflags) do
		filterflags[key] = not PJ.IsFlagFiltered(key)
	end

	for i = 1, PJ.GetNumPetTypes() do
		filtertypes[i] = not PJ.IsPetTypeFiltered(i)
		PJ.SetPetTypeFilter(i, true)
	end

	for i = 1, PJ.GetNumPetSources() do
		filtersources[i] = not PJ.IsPetSourceFiltered(i)
		PJ.SetPetSourceFilter(i, true)
	end

	PJ.SetFlagFilter(LE_PET_JOURNAL_FLAG_COLLECTED, true)
	PJ.SetFlagFilter(LE_PET_JOURNAL_FLAG_FAVORITES, false)
	PJ.SetFlagFilter(LE_PET_JOURNAL_FLAG_NOT_COLLECTED, true)
	PJ.SetSearchFilter("")

	self.updating = false
end

function addon:RestorePetJournalFilters()
	self.updating = true

	for key, val in pairs(filterflags) do
		PJ.SetFlagFilter(key, val)
	end

	for i, val in ipairs(filtertypes) do
		PJ.SetPetTypeFilter(i, val)
	end

	for i, val in ipairs(filtersources) do
		PJ.SetPetSourceFilter(i, val)
	end

	if IsAddOnLoaded("Blizzard_PetJournal") then
		PetJournal_OnSearchTextChanged(PetJournalSearchBox)
	end

	self.updating = false
end

function addon:PET_JOURNAL_LIST_UPDATE(...)
	if self.updating then return end

	wipe(self.petidx)
	wipe(self.petown)

	self:ClearPetJournalFilters()

	for i = 1, PJ.GetNumPets(false) do
		local petid, speciesid, isowned = PJ.GetPetInfoByIndex(i, false)
		if speciesid then
			table.insert(self.petidx, speciesid)
			self.petown[speciesid] = isowned
		end
	end

	self:RestorePetJournalFilters()
end

function addon:ADDON_LOADED(loaded)
	if loaded ~= addonname then return end

	self:EnableModules()
	self.frame:UnregisterEvent"ADDON_LOADED"
end

addon:Initialize()
PetJournalEx = addon