MrPlow = {}

local LibSort, minor = LibStub:GetLibrary("LibSort-1.0")

local watchedSlots = {[INVENTORY_GUILD_BANK] = true, [INVENTORY_BACKPACK] = true, [INVENTORY_BANK] = true }

local IS_WEAPON = { [EQUIP_TYPE_MAIN_HAND] = true, [EQUIP_TYPE_OFF_HAND] = true, [EQUIP_TYPE_ONE_HAND] = true, [EQUIP_TYPE_TWO_HAND] = true}

local WEAPON_ORDER = {
	[WEAPONTYPE_AXE] =  1,
	[WEAPONTYPE_DAGGER] =  2,
	[WEAPONTYPE_HAMMER] = 3,
	[WEAPONTYPE_SWORD] = 4,

	[WEAPONTYPE_TWO_HANDED_AXE] = 5,
	[WEAPONTYPE_TWO_HANDED_HAMMER] = 6,
	[WEAPONTYPE_TWO_HANDED_SWORD] = 7,

	[WEAPONTYPE_BOW] = 8,

	[WEAPONTYPE_FIRE_STAFF] = 9,
	[WEAPONTYPE_FROST_STAFF] =  10,
	[WEAPONTYPE_LIGHTNING_STAFF] = 11,
	[WEAPONTYPE_HEALING_STAFF] = 12,

	[WEAPONTYPE_NONE] = 13,
	[WEAPONTYPE_RUNE] = 14,
	[WEAPONTYPE_SHIELD] = 15
}

local ARMOUR_ORDER = {
	[EQUIP_TYPE_HEAD] 	= 1,
	[EQUIP_TYPE_SHOULDERS] 	= 2,
	[EQUIP_TYPE_CHEST] 	= 3,
	[EQUIP_TYPE_HAND] 	= 4,
	[EQUIP_TYPE_WAIST] 	= 5,
	[EQUIP_TYPE_LEGS] 	= 6,
	[EQUIP_TYPE_FEET] 	= 7,

	[EQUIP_TYPE_NECK] 	= 8,
	[EQUIP_TYPE_RING] 	= 9,

	[EQUIP_TYPE_MAIN_HAND] 	= 10,
	[EQUIP_TYPE_OFF_HAND] 	= 11,
	[EQUIP_TYPE_ONE_HAND] 	= 12,
	[EQUIP_TYPE_TWO_HAND] 	= 13,
	[EQUIP_TYPE_COSTUME] 	= 14,
}

local ITEM_TYPE_ORDER = {
	[ITEMTYPE_WEAPON] = 			1,
	[ITEMTYPE_ARMOR] = 			2,
	[ITEMTYPE_FOOD] = 			3,
	[ITEMTYPE_DRINK] = 			4,
	[ITEMTYPE_RECIPE] =  			5,
	[ITEMTYPE_POTION] =  			6,
	[ITEMTYPE_POISON] =   			7,
	[ITEMTYPE_CONTAINER] = 			8,
	[ITEMTYPE_AVA_REPAIR] =   		9,
	[ITEMTYPE_ARMOR_BOOSTER] =		10,
	[ITEMTYPE_WEAPON_BOOSTER] = 		11,
	[ITEMTYPE_BLACKSMITHING_BOOSTER] = 	12,
	[ITEMTYPE_BLACKSMITHING_RAW_MATERIAL] = 13,
	[ITEMTYPE_BLACKSMITHING_MATERIAL] = 	14,
	[ITEMTYPE_CLOTHIER_BOOSTER] = 		15,
	[ITEMTYPE_CLOTHIER_RAW_MATERIAL] =	16,
	[ITEMTYPE_CLOTHIER_MATERIAL] = 		17,
	[ITEMTYPE_WOODWORKING_BOOSTER] =	18,
	[ITEMTYPE_WOODWORKING_RAW_MATERIAL] = 	19,
	[ITEMTYPE_WOODWORKING_MATERIAL] = 	20,
	[ITEMTYPE_ALCHEMY_BASE] = 		21,
	[ITEMTYPE_REAGENT] = 			22,
	[ITEMTYPE_ENCHANTMENT_BOOSTER] =	23,
	[ITEMTYPE_INGREDIENT] =   		24,
	[ITEMTYPE_FLAVORING] =			25,
	[ITEMTYPE_SPICE] =			26,
	[ITEMTYPE_ADDITIVE] =			27,
	[ITEMTYPE_RAW_MATERIAL] =		28,
	[ITEMTYPE_SPELLCRAFTING_TABLET] = 	29,
	[ITEMTYPE_STYLE_MATERIAL] =   		30,
	[ITEMTYPE_GLYPH_WEAPON] =   		31,
	[ITEMTYPE_GLYPH_ARMOR] =   		32,
	[ITEMTYPE_GLYPH_JEWELRY] =   		33,
	[ITEMTYPE_RACIAL_STYLE_MOTIF] =		34,
	[ITEMTYPE_SOUL_GEM] =   		35,
	[ITEMTYPE_SIEGE] =   			36,
	[ITEMTYPE_MOUNT] =			37,
	[ITEMTYPE_LURE] = 			38,
	[ITEMTYPE_TRASH] = 	  		39,
	[ITEMTYPE_COSTUME] =			40,
	[ITEMTYPE_DISGUISE] =			41,
	[ITEMTYPE_TABARD] =			42,
	[ITEMTYPE_COLLECTIBLE] = 		43,
	[ITEMTYPE_TROPHY] =   			44,
	[ITEMTYPE_LOCKPICK] =			45,
	[ITEMTYPE_TOOL] =			46,
	[ITEMTYPE_ARMOR_TRAIT] =   		47,
	[ITEMTYPE_WEAPON_TRAIT] =   		48,
	[ITEMTYPE_PLUG] =			49,
	[ITEMTYPE_NONE] =			50,
	[ITEMTYPE_DEPRECATED] =			51,
}

local ENCHANTING_RUNE_ORDER = {
	[ENCHANTING_RUNE_POTENCY]	= 1,
	[ENCHANTING_RUNE_ESSENCE]	= 2,
	[ENCHANTING_RUNE_ASPECT] 	= 3,
	[ENCHANTING_RUNE_NONE]		= 4,
}

function MrPlow:Loaded(...)
   local eventCode, addonName = ...
   if addonName ~= "MrPlow" then return end

   LibSort:Register("Item Sort", "Item Type", "The type of item", "itemType", function(...) return MrPlow:ItemType(...) end)
   LibSort:Register("Item Sort", "Weapon Type", "The type of weapon", "weaponType", function(...) return MrPlow:WeaponType(...) end)
   LibSort:Register("Item Sort", "Armour Equip Type", "The type of armour", "armorEquipType", function(...) return MrPlow:ArmourEquipType(...) end)
   LibSort:Register("Item Sort", "Armour Type", "The weight of armour", "armorType", function(...) return MrPlow:ArmorType(...) end)
   LibSort:Register("Item Sort", "Crafting Type", "The crafting type of an item", "craftingType", function(...) return MrPlow:CraftingType(...) end)

   LibSort:Register("Item Sort", "Subjective Level", "The calculated subjective level", "subjectiveLevel", function(bag, index) return GetItemLevel(bag, index) end)

   LibSort:RegisterDefaultOrder("Item Sort", {"Item Type", "Weapon Type", "Armour Equip Type", "Armour Type", "Crafting Type"}, {"Subjective Level"})
end

function MrPlow:SubjectiveLevel(bag, index)
	return GetItemLevel(bag, index)
end

function MrPlow:ItemType(bag, index)
      	return ITEM_TYPE_ORDER[GetItemType(bag, index)] or 100
end

function MrPlow:WeaponType(bag, index)
        return WEAPON_ORDER[GetItemLinkWeaponType(GetItemLink(bag, index))]
end

function MrPlow:ArmorType(bag, index)
	return GetItemLinkArmorType(GetItemLink(bag, index))
end

function MrPlow:ArmourEquipType(bag, index)
	return ARMOUR_ORDER[GetItemLinkEquipType(GetItemLink(bag, index))]
end

function MrPlow:CraftingType(bag, index)
	local _, _, extra1 = GetItemCraftingInfo(bag, index)
	return ENCHANTING_RUNE_ORDER[extra1 or 4]
end

EVENT_MANAGER:RegisterForEvent("MrPlowLoaded", EVENT_ADD_ON_LOADED, function(...) MrPlow:Loaded(...) end)