local SLE, T, E, L, V, P, G = unpack(select(2, ...))
if select(2, GetAddOnInfo('ElvUI_KnightFrame')) and IsAddOnLoaded('ElvUI_KnightFrame') then return end --Don't break korean code :D
local Armory = SLE:GetModule("Armory_Core")
local IA = SLE:NewModule("Armory_Inspect", "AceEvent-3.0", "AceConsole-3.0", "AceHook-3.0");
local M = E:GetModule("Misc")

local _G = _G

--Adding new stuffs for armory only
function IA:BuildLayout()
	InspectGuildFrameBanner:ClearAllPoints()
	InspectGuildFrameBanner:Point("TOP", InspectFrameInset, "TOP", 0, -4)

	--<< Background >>--
	if not _G["InspectPaperDollFrame"].SLE_Armory_BG then
		_G["InspectPaperDollFrame"].SLE_Armory_BG = _G["InspectPaperDollFrame"]:CreateTexture(nil, 'OVERLAY')
		_G["InspectPaperDollFrame"].SLE_Armory_BG:Point('TOPLEFT', _G["InspectModelFrame"], -4, 0)
		_G["InspectPaperDollFrame"].SLE_Armory_BG:Point('BOTTOMRIGHT', _G["InspectModelFrame"], 4, 0)
	end
	_G["InspectPaperDollFrame"].SLE_Armory_BG:Hide()

	for i, SlotName in pairs(Armory.Constants.GearList) do
		local Slot = _G["Inspect"..SlotName]
		Slot.ID = GetInventorySlotInfo(SlotName)

		--<<Create gems>>--
		for t = 1, Armory.Constants.MaxGemSlots do
			if Slot["textureSlot"..t] then
				Slot["SLE_Gem"..t] = CreateFrame("Frame", nil, Slot)
				Slot["SLE_Gem"..t]:SetPoint("TOPLEFT", Slot["textureSlot"..t])
				Slot["SLE_Gem"..t]:SetPoint("BOTTOMRIGHT", Slot["textureSlot"..t])
				Slot["SLE_Gem"..t]:SetScript("OnEnter", Armory.Gem_OnEnter)
				Slot["SLE_Gem"..t]:SetScript("OnLeave", Armory.Tooltip_OnLeave)
				--Variables for use in some stuff
				Slot["SLE_Gem"..t].frame = "inspect"
			end
		end

		--<<Gradation>>--
		if Slot.iLvlText then
			Slot.SLE_Gradient = Slot:CreateTexture(nil, "BACKGROUND")
			Slot.SLE_Gradient:SetPoint(Slot.Direction, Slot, Slot.Direction, 0, 0)
			Slot.SLE_Gradient:Size(132, 41)
			Slot.SLE_Gradient:SetTexture(Armory.Constants.GradientTexture)
			Slot.SLE_Gradient:SetVertexColor(unpack(E.db.sle.armory.inspect.gradient.color))
			if Slot.Direction == 'LEFT' then
				Slot.SLE_Gradient:SetTexCoord(0, 1, 0, 1)
			else
				Slot.SLE_Gradient:SetTexCoord(1, 0, 0, 1)
			end
			Slot.iLvlText:SetTextColor(1, 1, 1)
			Slot.SLE_Gradient:Hide()
		end

		--<<Missing Warning>>--
		Slot["SLE_Warning"] = CreateFrame("Frame", nil, Slot)
		if SlotName == "MainHandSlot" or SlotName == "SecondaryHandSlot" then
			Slot["SLE_Warning"]:Size(41, 8)
			Slot["SLE_Warning"]:SetPoint("TOP", Slot, "BOTTOM", 0, 0)
		else
			Slot["SLE_Warning"]:Size(8, 41)
			Slot["SLE_Warning"]:SetPoint(Slot.Direction == "LEFT" and "RIGHT" or "LEFT", Slot, Slot.Direction, 0, 0)
		end
		Slot["SLE_Warning"].frame = "inspect"

		Slot["SLE_Warning"].texture = Slot["SLE_Warning"]:CreateTexture(nil, "BACKGROUND")
		Slot["SLE_Warning"].texture:SetInside()
		Slot["SLE_Warning"].texture:SetTexture(Armory.Constants.WarningTexture)
		Slot["SLE_Warning"].texture:SetVertexColor(1, 0, 0)

		Slot["SLE_Warning"]:SetScript("OnEnter", Armory.Warning_OnEnter)
		Slot["SLE_Warning"]:SetScript("OnLeave", Armory.Tooltip_OnLeave)
		Slot["SLE_Warning"]:Hide()

		--<<Transmog>>--
		if Armory.Constants.CanTransmogrify[SlotName] then
			Slot.TransmogInfo = CreateFrame('Button', SlotName.."_SLE_TransmogInfo", Slot)
			Slot.TransmogInfo:Size(12)
			Slot.TransmogInfo:SetFrameLevel(Slot:GetFrameLevel() + 2)
			Slot.TransmogInfo:Point('BOTTOM'..Slot.Direction, Slot, Slot.Direction == 'LEFT' and -2 or 2, -1)
			Slot.TransmogInfo:SetScript('OnEnter', Armory.Transmog_OnEnter)
			Slot.TransmogInfo:SetScript('OnLeave', Armory.Transmog_OnLeave)
			Slot.TransmogInfo:SetScript('OnClick', Armory.Transmog_OnClick)

			Slot.TransmogInfo.Texture = Slot.TransmogInfo:CreateTexture(nil, 'OVERLAY')
			Slot.TransmogInfo.Texture:SetInside()
			Slot.TransmogInfo.Texture:SetTexture(Armory.Constants.TransmogTexture)
			Slot.TransmogInfo.Texture:SetVertexColor(1, .5, 1)

			Slot.TransmogInfo.isInspect = true

			if Slot.Direction == 'LEFT' then
				Slot.TransmogInfo.Texture:SetTexCoord(0, 1, 0, 1)
			else
				Slot.TransmogInfo.Texture:SetTexCoord(1, 0, 0, 1)
			end

			Slot.TransmogInfo:Hide()
		end
	end

	do --<<Check Transmog>>--
		_G["InspectFrame"].SLE_TransmogViewButton = CreateFrame("Button", nil, _G["InspectFrame"], "BackdropTemplate")
		_G["InspectFrame"].SLE_TransmogViewButton:Size(30)
		_G["InspectFrame"].SLE_TransmogViewButton:Point("BOTTOMRIGHT", _G["InspectHandsSlot"], "TOPRIGHT", 0, 4)
		_G["InspectFrame"].SLE_TransmogViewButton:SetBackdrop({
				bgFile = E.media.blankTex,
				edgeFile = E.media.blankTex,
				tile = false, tileSize = 0, edgeSize = E.mult,
				insets = { left = 0, right = 0, top = 0, bottom = 0}
			})
		_G["InspectFrame"].SLE_TransmogViewButton.texture = _G["InspectFrame"].SLE_TransmogViewButton:CreateTexture(nil, 'OVERLAY')
		_G["InspectFrame"].SLE_TransmogViewButton.texture:SetInside()
		_G["InspectFrame"].SLE_TransmogViewButton.texture:SetTexture([[Interface\ICONS\INV_Misc_Desecrated_PlateChest]])
		_G["InspectFrame"].SLE_TransmogViewButton.texture:SetTexCoord(unpack(E.TexCoords))

		_G["InspectFrame"].SLE_TransmogViewButton:SetScript("OnEnter", function(self)
			self:SetBackdropBorderColor(unpack(E["media"].rgbvaluecolor))
			GameTooltip:SetOwner(self, "ANCHOR_TOP")
			GameTooltip:SetText(VIEW_IN_DRESSUP_FRAME)
			GameTooltip:Show()
		end)
		_G["InspectFrame"].SLE_TransmogViewButton:SetScript("OnLeave", function(self)
			-- self:SetBackdropBorderColor(TransmogButtonColors.R, TransmogButtonColors.G, TransmogButtonColors.B)
			self:SetBackdropBorderColor(1, 1, 1)
			_G["GameTooltip"]:Hide()
		end)
		_G["InspectFrame"].SLE_TransmogViewButton:SetScript("OnClick", function(self)
			PlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON);
			DressUpSources(C_TransmogCollection.GetInspectSources());
		end)
	end
end

function IA:Update_BG()
	if not _G.InspectPaperDollFrame then return end
	if E.db.sle.armory.inspect.background.selectedBG == 'HIDE' then
		_G['InspectPaperDollFrame'].SLE_Armory_BG:SetTexture(nil)
	elseif E.db.sle.armory.inspect.background.selectedBG == 'CUSTOM' then
		_G['InspectPaperDollFrame'].SLE_Armory_BG:SetTexture(E.db.sle.armory.inspect.background.customTexture)
	elseif E.db.sle.armory.inspect.background.selectedBG == 'CLASS' then
		_G['InspectPaperDollFrame'].SLE_Armory_BG:SetTexture([[Interface\AddOns\ElvUI_SLE\media\textures\armory\]]..E.myclass)
	else
		_G['InspectPaperDollFrame'].SLE_Armory_BG:SetTexture(SLE.ArmoryConfigBackgroundValues.BlizzardBackdropList[E.db.sle.armory.inspect.background.selectedBG] or [[Interface\AddOns\ElvUI_SLE\media\textures\armory\]]..E.db.sle.armory.inspect.background.selectedBG)
	end

	--CA:AdditionalTextures_Update()
end

function IA:Update_ItemLevel()
	for i, SlotName in pairs(Armory.Constants.GearList) do
		local Slot = _G["Inspect"..SlotName]
		if not Slot then return end

		if Slot.iLvlText then
			Slot.iLvlText:ClearAllPoints()
			Slot.iLvlText:Point("TOP"..Slot.Direction, _G["Inspect"..SlotName], "TOP"..(Slot.Direction == "LEFT" and "RIGHT" or "LEFT"), Slot.Direction == "LEFT" and 2+E.db.sle.armory.inspect.ilvl.xOffset or -2-E.db.sle.armory.inspect.ilvl.xOffset, -1+E.db.sle.armory.inspect.ilvl.yOffset)
		end
	end
end

function IA:Update_Enchant()
	for i, SlotName in pairs(Armory.Constants.GearList) do
		local Slot = _G["Inspect"..SlotName]
		if not Slot then return end

		if Slot.enchantText then
			Slot.enchantText:ClearAllPoints()
			Slot.enchantText:Point(Slot.Direction, _G["Inspect"..SlotName], Slot.Direction == "LEFT" and "RIGHT" or "LEFT", Slot.Direction == "LEFT" and 2+E.db.sle.armory.inspect.enchant.xOffset or -2-E.db.sle.armory.inspect.enchant.xOffset, 1+E.db.sle.armory.inspect.enchant.yOffset)
		end
	end
end

function IA:Update_Gems()
	for i, SlotName in pairs(Armory.Constants.GearList) do
		local Slot = _G["Inspect"..SlotName]
		if not Slot then return end

		if Slot.textureSlot1 then
			Slot.textureSlot1:ClearAllPoints()
			Slot.textureSlot1:Point('BOTTOM'..Slot.Direction, _G["Inspect"..SlotName], "BOTTOM"..(Slot.Direction == "LEFT" and "RIGHT" or "LEFT"), Slot.Direction == "LEFT" and 2+E.db.sle.armory.inspect.gem.xOffset or -2-E.db.sle.armory.inspect.gem.xOffset, 2+E.db.sle.armory.inspect.gem.yOffset)
			for i = 1, Armory.Constants.MaxGemSlots do Slot["textureSlot"..i]:Size(E.db.sle.armory.inspect.gem.size) end
		end
	end
end

function IA:ElvOverlayToggle() --Toggle dat Overlay
	if not _G["InspectFrame"] then return end
	if E.db.sle.armory.inspect.background.overlay then
		_G["InspectModelFrameBackgroundOverlay"]:Show()
	else
		_G["InspectModelFrameBackgroundOverlay"]:Hide()
	end
end

function IA:Enable()
	if not _G["InspectFrame"] then return end
	-- _G["InspectFrame"]:Size(450, 480)
	_G["InspectFrame"]:Size(450, 444)

	_G["InspectFrame"].ItemLevelText:ClearAllPoints()
	_G["InspectFrame"].ItemLevelText:Point("BOTTOM",_G["InspectModelFrame"], "TOP", 0, 2)

	-- Move bottom equipment slots
	_G["InspectMainHandSlot"]:SetPoint('BOTTOMLEFT', _G["InspectPaperDollItemsFrame"], 'BOTTOMLEFT', 185, 14)

	--Making model frame big enough
	_G["InspectModelFrame"]:ClearAllPoints()
	_G["InspectModelFrame"]:SetPoint('TOPLEFT', _G["InspectHeadSlot"], 0, 5)
	_G["InspectModelFrame"]:SetPoint('RIGHT', _G["InspectHandsSlot"])
	_G["InspectModelFrame"]:SetPoint('BOTTOM', _G["InspectMainHandSlot"])

	_G["InspectPaperDollFrame"].ViewButton:Hide()
	_G["InspectFrame"].SLE_TransmogViewButton:Show()

	--This will hide default background stuff. I could make it being shown, but not feeling like figuring out how to stretch the damn texture.
	if _G["InspectModelFrame"] and _G["InspectModelFrame"].BackgroundTopLeft and _G["InspectModelFrame"].BackgroundTopLeft:IsShown() then
		_G["InspectModelFrame"].BackgroundTopLeft:Hide()
		_G["InspectModelFrame"].BackgroundTopRight:Hide()
		_G["InspectModelFrame"].BackgroundBotLeft:Hide()
		_G["InspectModelFrame"].BackgroundBotRight:Hide()
		if _G["InspectModelFrame"].backdrop then
			_G["InspectModelFrame"].backdrop:Hide()
		end
	end

	_G["InspectModelFrameBackgroundOverlay"]:SetPoint('TOPLEFT', _G["InspectModelFrame"], -4, 0)
	_G["InspectModelFrameBackgroundOverlay"]:SetPoint('BOTTOMRIGHT', _G["InspectModelFrame"], 4, 0)

	--Activating background and updating stuff
	_G["InspectPaperDollFrame"].SLE_Armory_BG:Show()
	IA:Update_BG()
	IA:Update_ItemLevel()
	IA:Update_Enchant()
	IA:Update_Gems()

	if E.db.general.itemLevel.displayInspectInfo then M:UpdateInspectInfo() end
end

function IA:Disable()
	if not _G["InspectFrame"] then return end
	_G["InspectFrame"]:Size(338, 424)

	-- Move bottom equipment slots to default position
	_G["InspectMainHandSlot"]:SetPoint('BOTTOMLEFT', _G["InspectPaperDollItemsFrame"], 'BOTTOMLEFT', 130, 16)

	-- Model Frame
	_G["InspectModelFrame"]:ClearAllPoints()
	_G["InspectModelFrame"]:Size(231, 320)
	_G["InspectModelFrame"]:SetPoint('TOPLEFT', _G["InspectPaperDollFrame"], 'TOPLEFT', 52, -66)
	_G["InspectModelFrame"].BackgroundTopLeft:Show()
	_G["InspectModelFrame"].BackgroundTopRight:Show()
	_G["InspectModelFrame"].BackgroundBotLeft:Show()
	_G["InspectModelFrame"].BackgroundBotRight:Show()
	_G["InspectModelFrame"].backdrop:Show()

	_G["InspectPaperDollFrame"].ViewButton:Show()
	_G["InspectFrame"].SLE_TransmogViewButton:Hide()

	for i, SlotName in pairs(Armory.Constants.GearList) do
		local Slot = _G["Inspect"..SlotName]
		if Armory.Constants.Inspect_Defaults[SlotName] then
			for element, points in pairs(Armory.Constants.Inspect_Defaults[SlotName]) do
				Slot[element]:ClearAllPoints()
				Slot[element]:Point(unpack(points))
			end
		end
		if Slot.textureSlot1 then
			for i = 1, Armory.Constants.MaxGemSlots do Slot["textureSlot"..i]:Size(14) end
		end
		if Slot.SLE_Warning then Slot.SLE_Warning:Hide() end
	end

	if _G["InspectPaperDollFrame"].SLE_Armory_BG then _G["InspectPaperDollFrame"].SLE_Armory_BG:Hide() end
	_G["InspectFrame"].ItemLevelText:ClearAllPoints()
	_G["InspectFrame"].ItemLevelText:Point("BOTTOMRIGHT", -6, 6)
end

function IA:ToggleArmory()
	if E.db.sle.armory.inspect.enable then
		IA:Enable()
	else
		IA:Disable()
	end
	M:UpdateInspectPageFonts("Inspect")
end

function IA:PreSetup()
	IA:RegisterEvent("INSPECT_READY", function()
		if not E.db.general.itemLevel.displayInspectInfo then
			Armory:UpdateInspectInfo();
			IA:UnregisterEvent("INSPECT_READY")
			M:ClearPageInfo(_G["InspectFrame"], "Inspect")
		end
	end)
end

function IA:LoadAndSetup()
	IA:BuildLayout()
	IA:ToggleArmory()
	IA:ElvOverlayToggle()
	--For future use. I may consider returning to cache for inspect. Cause it actually never broke
	-- _G["InspectFrame"]:UnregisterEvent("PLAYER_TARGET_CHANGED");
end
