local _G = _G
local AtlasLoot = _G.AtlasLoot
local ItemInfo = {}
AtlasLoot.ItemInfo = ItemInfo
local AL = AtlasLoot.Locales
local IngameLocales = AtlasLoot.IngameLocales

local type, rawset, rawget, setmetatable = type, rawset, rawget, setmetatable
-- local GetAuctionItemClasses, GetAuctionItemSubClasses = GetAuctionItemClasses, GetAuctionItemSubClasses
local GetItemClassInfo, GetItemSubClassInfo = C_Item.GetItemClassInfo, C_Item.GetItemSubClassInfo

local LOC_DATA = {
	[0] = {
		["__name"] = "Consumable",
		[0] = "Consumable",
		[1] = "Cheese/Bread(OBSOLETE)",
		[2] = "Liquid(OBSOLETE)",
	},
	[1] = {
		["__name"] = "Container",
		[0] = "Bag",
		[1] = "Soul Bag(OBSOLETE)",
		[2] = "Herb Bag",
		[3] = "Enchanting Bag",
		[4] = "Engineering Bag",
	},
	[2] = {
		["__name"] = "Weapon",
		[0] = "One-Handed Axes",
		[1] = "Two-Handed Axes",
		[2] = "Bows",
		[3] = "Guns",
		[4] = "One-Handed Maces",
		[5] = "Two-Handed Maces",
		[6] = "Polearms",
		[7] = "One-Handed Swords",
		[8] = "Two-Handed Swords",
		[9] = "Obsolete",
		[10] = "Staves",
		[11] = "One-Handed Exotics",
		[12] = "Two-Handed Exotics",
		[13] = "Fist Weapons",
		[14] = "Miscellaneous",
		[15] = "Daggers",
		[16] = "Thrown",
		[17] = "Spears",
		[18] = "Crossbows",
		[19] = "Wands",
		[20] = "Fishing Pole",
	},
	[3] = {
		["__name"] = "Jewelry(OBSOLETE)",
		[0] = "Jewelry(OBSOLETE)",
	},
	[4] = {
		["__name"] = "Armor",
		[0] = "Miscellaneous",
		[1] = "Cloth",
		[2] = "Leather",
		[3] = "Mail",
		[4] = "Plate",
		[5] = "Bucklers",
		[6] = "Shields",
		--[7] = "Librams",
		--[8] = "Idols",
		--[9] = "Totems",
	},
	[5] = {
		["__name"] = "Reagent",
		[0] = "Reagent",
	},
	[6] = {
		["__name"] = "Projectile",
		--[0] = "Wand(OBSOLETE)",
		--[1] = "Bolt(OBSOLETE)",
		--[2] = "Arrow",
		--[3] = "Bullet",
		--[4] = "Thrown(OBSOLETE)",
	},
	[7] = {
		["__name"] = "Trade Goods",
		[0] = "Trade Goods",
		[1] = "Parts",
		[2] = "Explosives",
		[3] = "Devices",
	},
	[8] = {
		["__name"] = "Generic(OBSOLETE)",
		[0] = "Generic(OBSOLETE)",
	},
	[9] = {
		["__name"] = "Recipe",
		[0] = "Book",
		[1] = "Leatherworking",
		[2] = "Tailoring",
		[3] = "Engineering",
		[4] = "Blacksmithing",
		[5] = "Cooking",
		[6] = "Alchemy",
		[7] = "First Aid",
		[8] = "Enchanting",
		[9] = "Fishing",
	},
	[10] = {
		["__name"] = "Money(OBSOLETE)",
		[0] = "Money(OBSOLETE)",
	},
	[11] = {
		["__name"] = "Quiver",
		[0] = "Quiver(OBSOLETE)",
		[1] = "Quiver(OBSOLETE)",
		[2] = "Quiver",
		[3] = "Ammo Pouch",
	},
	[12] = {
		["__name"] = "Quest",
		[0] = "Quest",
	},
	[13] = {
		["__name"] = "Key",
		[0] = "Key",
		[1] = "Lockpick",
	},
	[14] = {
		["__name"] = "Permanent(OBSOLETE)",
		[0] = "Permanent",
	},
	[15] = {
		["__name"] = "Miscellaneous",
		[0] = "Junk",
	},
}

local ITEM_DESC_INFO = {
	["slot"] = {
		[""] = "",
		["INVTYPE_RANGEDRIGHT"] 		= "",
		["INVTYPE_SHIELD"] 				= _G["INVTYPE_SHIELD"],
		["INVTYPE_RANGED"] 				= "",
		["INVTYPE_WEAPON"] 				= "",
		["INVTYPE_2HWEAPON"] 			= "",
		["INVTYPE_WRIST"]				= _G["INVTYPE_WRIST"],
		["INVTYPE_TRINKET"]				= _G["INVTYPE_TRINKET"],
		["INVTYPE_ROBE"]				= _G["INVTYPE_ROBE"],
		["INVTYPE_CLOAK"]				= _G["INVTYPE_CLOAK"],
		["INVTYPE_HEAD"]				= _G["INVTYPE_HEAD"],
		["INVTYPE_HOLDABLE"]			= _G["INVTYPE_HOLDABLE"],
		["INVTYPE_CHEST"]				= _G["INVTYPE_CHEST"],
		["INVTYPE_NECK"]				= _G["INVTYPE_NECK"],
		["INVTYPE_TABARD"]				= _G["INVTYPE_TABARD"],
		["INVTYPE_LEGS"]				= _G["INVTYPE_LEGS"],
		["INVTYPE_HAND"]				= _G["INVTYPE_HAND"],
		["INVTYPE_WAIST"]				= _G["INVTYPE_WAIST"],
		["INVTYPE_FEET"]				= _G["INVTYPE_FEET"],
		["INVTYPE_SHOULDER"]			= _G["INVTYPE_SHOULDER"],
		["INVTYPE_FINGER"]				= _G["INVTYPE_FINGER"],
		["INVTYPE_BAG"]					= _G["INVTYPE_BAG"],
		["INVTYPE_AMMO"]				= _G["INVTYPE_AMMO"],
		["INVTYPE_BODY"]				= _G["INVTYPE_BODY"], -- Shirt
		["INVTYPE_QUIVER"]				= _G["INVTYPE_QUIVER"],
		["INVTYPE_RELIC"]				= "", -- _G["INVTYPE_RELIC"],
		["INVTYPE_THROWN"]				= "", -- _G["INVTYPE_THROWN"],
		["INVTYPE_WEAPONMAINHAND"] 		= _G["INVTYPE_WEAPONMAINHAND"],
		["INVTYPE_WEAPONMAINHAND_PET"]	= _G["INVTYPE_WEAPONMAINHAND_PET"],	-- "Main Attack"
		["INVTYPE_WEAPONOFFHAND"]		= _G["INVTYPE_WEAPONOFFHAND"],
	},
	--[[
	["Consumable"] = {		-- 0
		["Consumable"] = true, -- 0
		["Cheese/Bread(OBSOLETE)"] = true, -- 1
		["Liquid(OBSOLETE)"] = true, -- 2
	},
	--]]
	["Container"] = {		-- 1
		["Bag"] 				= "", 		-- 0
		--["Soul Bag"] 			= true, 	-- 1
		--["Herb Bag"] 			= true, 	-- 2
		--["Enchanting Bag"] 	= true, 	-- 3
		--["Engineering Bag"] 	= true, 	-- 4
	},
	["Weapon"] = {		-- 2
		["One-Handed Axes"] 	= AL["One-Hand, Axe"], 		-- 0
		["Two-Handed Axes"] 	= AL["Two-Hand, Axe"], 		-- 1
		["Bows"] 				= AL["Bow"], 				-- 2
		["Guns"] 				= AL["Gun"], 				-- 3
		["One-Handed Maces"] 	= AL["One-Hand, Mace"], 	-- 4
		["Two-Handed Maces"] 	= AL["Two-Hand, Mace"], 	-- 5
		["Polearms"] 			= AL["Polearm"], 			-- 6
		["One-Handed Swords"] 	= AL["One-Hand, Sword"], 	-- 7
		["Two-Handed Swords"] 	= AL["Two-Hand, Sword"], 	-- 8
		--["Obsolete"] 			= true, 					-- 9
		["Staves"] 				= AL["Staff"], 				-- 10
		--["One-Handed Exotics"]= true, 					-- 11
		--["Two-Handed Exotics"]= true, 					-- 12
		["Fist Weapons"] 		= AL["Fist Weapon"], 		-- 13
		--["Miscellaneous"] 	= true, 					-- 14
		["Daggers"] 			= AL["Dagger"], 			-- 15
		--["Thrown"] 			= true, 					-- 16
		--["Spears"] 			= true, 					-- 17
		["Crossbows"] 			= AL["Crossbow"], 			-- 18
		["Wands"] 				= AL["Wand"], 				-- 19
		["Fishing Pole"] 		= AL["Fishing Pole"], 		-- 20
	},
	--[[
	["Jewelry(OBSOLETE)"] = {		-- 3
		["Jewelry(OBSOLETE)"] = true, -- 0
	},
	--]]
	["Armor"] = {		-- 4
		["Miscellaneous"] 	= "", -- 0
		--["Cloth"] 		= true, 			-- 1
		--["Leather"] 		= true, 			-- 2
		--["Mail"] 			= true, 			-- 3
		--["Plate"] 		= true, 			-- 4
		--["Bucklers"] 		= true, 			-- 5
		["Shields"]		 	= AL["Shield"], 	-- 6
		--["Librams"] 		= true, 			-- 7
		--["Idols"] 		= true, 			-- 8
		--["Totems"] 		= true, 			-- 9
	},
	--[[
	["Reagent"] = {		-- 5
		["Reagent"] = true, -- 0
	},
	--]]
	--[[
	["Projectile"] = {		-- 6
		["Wand(OBSOLETE)"] = true, -- 0
		["Bolt(OBSOLETE)"] = true, -- 1
		["Arrow"] = true, -- 2
		["Bullet"] = true, -- 3
		["Thrown(OBSOLETE)"] = true, -- 4
	},
	--]]
	--[[
	["Trade Goods"] = {		-- 7
		["Trade Goods"] = true, -- 0
		["Parts"] = true, -- 1
		["Explosives"] = true, -- 2
		["Devices"] = true, -- 3
	},
	--]]
	--[[
	["Generic(OBSOLETE)"] = {		-- 8
		["Generic(OBSOLETE)"] = true, -- 0
	},
	--]]
	--[[
	["Recipe"] = {		-- 9
		["Book"] = true, -- 0
		["Leatherworking"] = true, -- 1
		["Tailoring"] = true, -- 2
		["Engineering"] = true, -- 3
		["Blacksmithing"] = true, -- 4
		["Cooking"] = true, -- 5
		["Alchemy"] = true, -- 6
		["First Aid"] = true, -- 7
		["Enchanting"] = true, -- 8
		["Fishing"] = true, -- 9
	},
	--]]
	["Money(OBSOLETE)"] = {		-- 10
		["Money(OBSOLETE)"] = IngameLocales["Currency"], -- 0
	},
	--[[
	["Quiver"] = {		-- 11
		["Quiver(OBSOLETE)"] = true, -- 0
		["Quiver(OBSOLETE)"] = true, -- 1
		["Quiver"] = true, -- 2
		["Ammo Pouch"] = true, -- 3
	},
	--]]
	--[[
	["Quest"] = {		-- 12
		["Quest"] = true, -- 0
	},
	--]]
	--[[
	["Key"] = {		-- 13
		["Key"] = true, -- 0
		["Lockpick"] = true, -- 1
	},
	--]]
	--[[
	["Permanent(OBSOLETE)"] = {		-- 14
		["Permanent"] = true, -- 0
	},
	--]]
	["Miscellaneous"] = {		-- 15
		["Junk"] 	= 	_G["MISCELLANEOUS"], 	-- 0
	},
}

-- small info
-- 2 ways you can replace _G["INVTYPE_WEAPONMAINHAND"] with "" in the ITEM_DESC_INFO["slot"] table too hide ALL Mainhand info in description or you use the filter and generate a own name like "Main Hand, Axe"
local FILTER = {
	--- examples
	--{ slot = "INVTYPE_CLOAK", itemType = "Armor", itemSubType = "Cloth", __new = "HELLO THIS IS A TEST :)" },	-- This replace "Back, Cloth" with "HELLO THIS IS A TEST :)"
	--{ slot = "INVTYPE_CLOAK", itemType = "Armor", itemSubType = "Cloth", __new = { slot = "INVTYPE_THROWN", itemType = "Miscellaneous", itemSubType = "Junk" }},	-- This replace "Back, Cloth" with "Thrown, Junk"
	-- replace
	{ slot = "INVTYPE_CLOAK", itemType = "Armor", itemSubType = "Cloth", __new = { slot = "INVTYPE_CLOAK" } },	-- This replace "Back, Cloth" with "Back"
}

local preMt
local function __indexFunc(self, key)
	if not rawget(self, key) then
		rawset(self, key, setmetatable({}, preMt))
	end
	return rawget(self, key)
end

local PreSave = {}
preMt = {
	__index = __indexFunc
}
setmetatable(PreSave, preMt)

local function GetAuctionItemClasses()
	return 'Weapon', 'Armor', 'Container', 'Consumable', 'Trade Goods', 'Projectile', 'Quiver', 'Recipes', 'Reagent', 'Miscellaneous'
end

local function GetAuctionItemClassesLoc()
	return {
				AUCTION_CATEGORY_WEAPONS,
				AUCTION_CATEGORY_ARMOR,
				AUCTION_CATEGORY_CONTAINERS,
				AUCTION_CATEGORY_CONSUMABLES,
				AUCTION_CATEGORY_TRADE_GOODS,
				AUCTION_CATEGORY_PROJECTILE,
				AUCTION_CATEGORY_QUIVER,
				AUCTION_CATEGORY_RECIPES,
				AUCTION_CATEGORY_REAGENT,
				AUCTION_CATEGORY_MISCELLANEOUS,
			}
end

local function Init()
	local NewLocData = {
		--en = {},
		loc = {},
	}
	for iC = 0, #LOC_DATA do
		local class = LOC_DATA[iC]
		local className = GetItemClassInfo(iC)

		--NewLocData.en[class.__name] = className
		NewLocData.loc[className] = class.__name

		for isC = 0, #class do
			local subClass = class[isC]
			local name = GetItemSubClassInfo(iC,isC)
			if not NewLocData[subClass] then
				--NewLocData.en[class.__name..subClass] = name
				NewLocData.loc[className..name] = subClass
			end
		end
	end

	LOC_DATA = NewLocData

	for i = 1,#FILTER do
		FILTER[ ItemInfo.CreateDescription(FILTER[i].slot, LOC_DATA.loc[FILTER[i].itemType], LOC_DATA.loc[FILTER[i].itemType..FILTER[i].itemSubType], true) ] = type(FILTER[i].__new) == "table" and ItemInfo.CreateDescription(FILTER[i].__new.slot, LOC_DATA.loc[FILTER[i].__new.itemType], (FILTER[i].__new.itemType and FILTER[i].__new.itemSubType) and FILTER[i].__new.itemType..FILTER[i].__new.itemSubType or nil, true) or FILTER[i].__new
	end
end
AtlasLoot:AddInitFunc(Init)

-- only use this if you need to ignore the filter
function ItemInfo.CreateDescription(slot, itemType, itemSubType, filterIgnore)
	local desc = ""
	if slot then
		desc = ITEM_DESC_INFO["slot"][slot] and ITEM_DESC_INFO["slot"][slot] or ( _G[slot] or "" )
	end
	itemType = itemType and ( LOC_DATA.loc[itemType] or itemType ) or itemType
	itemSubType = (itemType and itemSubType) and ( LOC_DATA.loc[itemType..itemSubType] or itemSubType ) or itemSubType
	if itemType and itemSubType then
		if ITEM_DESC_INFO[itemType] and ITEM_DESC_INFO[itemType][itemSubType] then
			if ITEM_DESC_INFO[itemType][itemSubType] ~= true then
				if ITEM_DESC_INFO[itemType][itemSubType] ~= "" then
					desc = (desc=="" and "" or desc..", ")..ITEM_DESC_INFO[itemType][itemSubType]
				end
			else
				desc = (desc=="" and "" or desc..", ")..itemSubType
			end
		else
			desc = (desc=="" and "" or desc..", ")..itemSubType
		end
	end
	if not filterIgnore then PreSave[slot or "nil"][itemType or "nil"][itemSubType or "nil"] = { true, FILTER[desc] or desc  } end
	return filterIgnore and desc or ( FILTER[desc] or desc )
end

function ItemInfo.GetDescription(slot, itemType, itemSubType)
	return PreSave[slot or "nil"][itemType or "nil"][itemSubType or "nil"][1] == true and PreSave[slot or "nil"][itemType or "nil"][itemSubType or "nil"][2] or ItemInfo.CreateDescription(slot, itemType, itemSubType)
end
