local _, addon = ...
local API = addon.API;
local L = addon.L;
local LandingPageUtil = addon.LandingPageUtil;


local ipairs = ipairs;
local IsEncounterComplete = C_RaidLocks.IsEncounterComplete;
local DifficultyUtil = DifficultyUtil;


local PLAYER_CLASS_ID;


local EncounterData = {
	--[journalEncounterID] = { achv = {Mythic, Special} }

	--https://wago.tools/db2/JournalEncounter?page=1
	--/dump GetMouseFoci()[1].icon:GetTexture()

	[2795] = {icon = 7448202, achv = {61487, 61488, 61489, 61454}},      --Chimaerus

	[2733] = {icon = 7448209, achv = {61372, 62106}},      --Imperator Averzian
	[2734] = {icon = 7448210, achv = {61373, 62058}},      --Vorasius
	[2736] = {icon = 7448212, achv = {61374, 61514}},      --Fallen-King Salhadaar
	[2735] = {icon = 7448207, achv = {61375, 61911}},      --Vaelgor & Ezzorak
	[2737] = {icon = 7448211, achv = {61376, 61936}},      --Lightblinded Vanguard
	[2738] = {icon = 7448205, achv = {61637, 61377, 61346}},      --Crown of the Cosmos

	[2739] = {icon = 7448203, achv = {61378, 61381}},      --Belo'ren
	[2740] = {icon = 7448204, achv = {61379, 62406}},      --Midnight Falls


	--Manaforge Omega
	[2684] = {icon = 6922080, achv = {41604, 42118}},      --Plexus Sentinel
	[2686] = {icon = 6922087, achv = {41605, 41613}},      --Loom'ithar
	[2685] = {icon = 6922081, achv = {41606, 41614}},      --Soulbinder Naazindhri
	[2687] = {icon = 6922084, achv = {41607, 41615}},      --Forgeweaver Araz
	[2688] = {icon = 6922082, achv = {41608, 41616}},      --The Soul Hunters
	[2747] = {icon = 6922085, achv = {41609, 41617}},      --Fractillus
	[2690] = {icon = 6922086, achv = {41610, 41618}},      --Nexus-King Salhadaar
	[2691] = {icon = 6922083, achv = {41611, 41619}},      --Dimensius, the All-Devouring

	--Liberation of Undermine
	[2639] = {icon = 6392628, achv = {41229, 41208}},      --Vexie and the Geargrinders
	[2640] = {icon = 6253176, achv = {41230, 41554, 41694, 41695}},      --Cauldron of Carnage
	[2641] = {icon = 6392625, achv = {41231, 41338}},      --Rik Reverb
	[2642] = {icon = 6392627, achv = {41232, 41596}},      --Stix Bunkjunker
	[2653] = {icon = 6392626, achv = {41233, 41711}},      --Sprocketmonger Lockenstock (Should be 2643, right Blizzard?)
	[2644] = {icon = 6392624, achv = {41234, 41119, 41120, 41121, 41122}},      --The One-Armed Bandit
	[2645] = {icon = 6392623, achv = {41235, 41337, 41211}},      --Mug'Zee, Heads of Security
	[2646] = {icon = 6392621, achv = {41228, 41236, 41347}},      --Chrome King Gallywix

	--Nerub-ar Palace
	[2599] = {icon = 5779389, achv = {40238, 40255}},      --Sikran, Captain of the Sureki
	[2601] = {icon = 5779388, achv = {40241, 40264}},      --Nexus-Princess Ky'veza
	[2602] = {icon = 5779391, achv = {40243, 40266}},      --Queen Ansurek
	[2607] = {icon = 5779390, achv = {40236, 40261}},      --Ulgrax the Devourer
	[2608] = {icon = 5779387, achv = {40242, 40730}},      --The Silken Court
	[2609] = {icon = 5661707, achv = {40239, 40262}},      --Rasha'nan
	[2611] = {icon = 5779386, achv = {40237, 40260}},      --The Bloodbound Horror
	[2612] = {icon = 5688871, achv = {40240, 40263}},      --Broodtwister Ovi'nax


	--Classic
	[679] = {icon = 625905, achv = {6719, 6823}},   --The Stone Guard
	[689] = {icon = 625906, achv = {6720, 6674}},   --Feng the Accursed
	[682] = {icon = 625907, achv = {6721, 7056}},   --Gara'jal the Spiritbinder
	[687] = {icon = 625908, achv = {6722, 6687}},   --The Spirit Kings (Four Kings)
	[726] = {icon = 625909, achv = {6723, 6686, 7933}},       --Elegon
	[677] = {icon = 625910, achv = {6724, 6455}},   --Will of the Emperor

	[745] = {icon = 624007, achv = {6725, 6937}},   --Imperial Vizier Zor'lok
	[744] = {icon = 624008, achv = {6726, 6936}},   --Blade Lord Ta'yak
	[713] = {icon = 624010, achv = {6727, 6553}},   --Garalon
	[741] = {icon = 624009, achv = {6728, 6683}},   --Wind Lord Mel'jarak
	[737] = {icon = 624011, achv = {6729, 6518}},   --Amber-Shaper Un'sok
	[743] = {icon = 624012, achv = {6730, 6922}},   --Grand Empress Shek'zeer

	[683] = {icon = 627682, achv = {6731, 6717}},   --Protectors of the Endless
	[742] = {icon = 627683, achv = {6732, 6933}},   --Tsulong
	[729] = {icon = 627684, achv = {6733, 6824}},   --Lei Shi
	[709] = {icon = 627685, achv = {6734, 6825}},   --Sha of Fear
};


local Difficulties;
if addon.IS_MOP then
	Difficulties = {
		DifficultyUtil.ID.RaidLFR,
		DifficultyUtil.ID.Raid10Normal,
		DifficultyUtil.ID.Raid10Heroic,
		DifficultyUtil.ID.Raid25Normal,
		DifficultyUtil.ID.Raid25Heroic,
	};
else
	Difficulties = {
		DifficultyUtil.ID.PrimaryRaidLFR,
		DifficultyUtil.ID.PrimaryRaidNormal,
		DifficultyUtil.ID.PrimaryRaidHeroic,
		DifficultyUtil.ID.PrimaryRaidMythic,
	};
end
LandingPageUtil.RaidDifficulties = Difficulties;


local PlayerClassList_Modern = {
	1,  --WARRIOR
	2,  --PALADIN
	3,  --HUNTER
	4,  --ROGUE
	5,  --PRIEST
	6,  --DEATHKNIGHT
	7,  --SHAMAN
	8,  --MAGE
	9,  --WARLOCK
	10, --MONK
	11, --DRUID
	12, --DEMONHUNTER
	13, --EVOKER
};

local PlayerClassList_MOP = {
	1,  --WARRIOR
	2,  --PALADIN
	3,  --HUNTER
	4,  --ROGUE
	5,  --PRIEST
	6,  --DEATHKNIGHT
	7,  --SHAMAN
	8,  --MAGE
	9,  --WARLOCK
	10, --MONK
	11, --DRUID
};

if addon.IS_MOP then
	LandingPageUtil.PlayerClassList = PlayerClassList_MOP;
else
	LandingPageUtil.PlayerClassList = PlayerClassList_Modern;
end


local DungeonEncounterLookup = {
	--For Classic
	--[journalEncounterID] = dungeonEncounterID

	--Mogu'shan Vaults: journalInstanceID 317
	[677] = 1407,   --Will of the Emperor
	[679] = 1395,   --The Stone Guard
	[682] = 1434,   --Gara'jal the Spiritbinder
	[687] = 1436,   --The Spirit Kings
	[689] = 1390,   --Feng the Accursed
	[726] = 1500,   --Elegon

	--Heart of Fear: journalInstanceID 330
	[713] = 1463,   --Garalon
	[737] = 1499,   --Amber-Shaper Un'sok
	[741] = 1498,   --Wind Lord Mel'jarak
	[743] = 1501,   --Grand Empress Shek'zeer
	[744] = 1504,   --Blade Lord Ta'yak
	[745] = 1507,   --Imperial Vizier Zor'lok

	--Terrace of Endless Spring: journalInstanceID 320
	[683] = 1409,   --Protectors of the Endless
	[709] = 1431,   --Sha of Fear
	[729] = 1506,   --Lei Shi
	[742] = 1505,   --Tsulong
};
function LandingPageUtil.GetDungeonEncounteID(journalEncounterID)
	return DungeonEncounterLookup[journalEncounterID]
end


function LandingPageUtil.GetEncounterIcon(journalEncounterID)
	if EncounterData[journalEncounterID] then
		return EncounterData[journalEncounterID].icon
	end
end

function LandingPageUtil.GetEncounterAchievements(journalEncounterID)
	if EncounterData[journalEncounterID] then
		return EncounterData[journalEncounterID].achv
	end
end

function LandingPageUtil.GetEncounterProgress(instanceID, dungeonEncounterID)
	--instanceID = mapID

	local progress = {};    --{boolean1, boolean2, ...}

	for i, difficultyID in ipairs(Difficulties) do
		progress[i] = IsEncounterComplete(instanceID, dungeonEncounterID, difficultyID);
	end

	return progress
end

function LandingPageUtil.GetInstanceProgress(instanceID, dungeonEncounterIDs)
	local consolidatedProgress = {};    --{numComplete1, numComplete2, ...}

	for i, difficultyID in ipairs(Difficulties) do
		local numComplete = 0;
		for _, dungeonEncounterID in ipairs(dungeonEncounterIDs) do
			if IsEncounterComplete(instanceID, dungeonEncounterID, difficultyID) then
				numComplete = numComplete + 1;
			end
		end
		consolidatedProgress[i] = numComplete;
	end

	return consolidatedProgress
end

function LandingPageUtil.GetDefaultRaidDifficulty()
	local difficultyID = addon.GetDBValue("EncounterJournalDifficulty");
	if difficultyID then
		for _, id in ipairs(Difficulties) do
			if id == difficultyID then
				return difficultyID
			end
		end
	end
	return Difficulties[2]
end

function LandingPageUtil.GetBaseRaidDifficulty()
	if addon.IS_MOP then
		return DifficultyUtil.ID.Raid25Heroic;
	else
		return DifficultyUtil.ID.PrimaryRaidNormal;
	end
end

function LandingPageUtil.GetDefaultPlayerClassID()
	if not PLAYER_CLASS_ID then
		_, _, PLAYER_CLASS_ID = UnitClass("player");
	end
	return PLAYER_CLASS_ID
end

local function GetEJDifficultySize(difficultyID)
	if difficultyID ~= DifficultyUtil.ID.RaidTimewalker and not DifficultyUtil.IsPrimaryRaid(difficultyID) then
		return DifficultyUtil.GetMaxPlayers(difficultyID);
	end
	return nil;
end

local function GetEJDifficultyString(difficultyID)
	local name = DifficultyUtil.GetDifficultyName(difficultyID);
	local size = GetEJDifficultySize(difficultyID);
	if size then
		return string.format(ENCOUNTER_JOURNAL_DIFF_TEXT, size, name);
	else
		return name;
	end
end
LandingPageUtil.GetDifficultyName = GetEJDifficultyString;


do
	local TWW_EncounterTabInfo = {
		JournalInstanceIDs = {
			1302,   --Manaforge Omega
			1296,   --Liberation of Undermine
			1273,   --Nerub-ar Palace
			--768,   --Debug Emerald Nightmare
		},
	};
	LandingPageUtil.AddExpansionData(11, "encounter", TWW_EncounterTabInfo);

	local MID_EncounterTabInfo = {
		JournalInstanceIDs = {
			1314,   --The Dreamrift
			1307,   --The Voidspire
			1308,   --March on Quel'Danas
		},
	};
	LandingPageUtil.AddExpansionData(12, "encounter", MID_EncounterTabInfo);
end
