-------------------------------------------------------------------------------
-- Disenchant.lua
--
-- Compute expected disenchant value.  The data here is based on info from
-- WowWiki (http://www.wowwiki.com/Disenchanting_tables) with some updates
-- based on Wowhead queries.
-------------------------------------------------------------------------------

local _

-- Item ids for disenchanting materials.
local AbyssCrystal_Id = 34057;
local ArcaneDust_Id = 22445;
local DreamDust_Id = 11176;
local DreamShard_Id = 34052;
local EtherealShard_Id = 74247;
local HeavenlyShard_Id = 52721;
local HypnoticDust_Id = 52555;
local GreaterAstralEssence_Id = 11082;
local GreaterCelestialEssence_Id = 52719;
local GreaterCosmicEssence_Id = 34055;
local GreaterEternalEssence_Id = 16203;
local GreaterMagicEssence_Id = 10939;
local GreaterMysticEssence_Id = 11135;
local GreaterNetherEssence_Id = 11175;
local GreaterPlanarEssence_Id = 22446;
local IllusionDust_Id = 16204;
local InfiniteDust_Id = 34054;
local LargeBrilliantShard_Id = 14344;
local LargeGlimmeringShard_Id = 11084;
local LargeGlowingShard_Id = 11139;
local LargePrismaticShard_Id = 22449;
local LargeRadiantShard_Id = 11178;
local LesserAstralEssence_Id = 10998;
local LesserCelestialEssence_Id = 52718;
local LesserCosmicEssence_Id = 34056;
local LesserEternalEssence_Id = 16202;
local LesserMagicEssence_Id = 10938;
local LesserMysticEssence_Id = 11134;
local LesserNetherEssence_Id = 11174;
local LesserPlanarEssence_Id = 22447;
local MaelstromCrystal_Id = 72722;
local MysteriousEssence_Id = 74250;
local NexusCrystal_Id = 20725;
local ShaCrystal_Id = 74248;
local SmallBrilliantShard_Id = 14343;
local SmallDreamShard_Id = 34053;
local SmallEtherealShard_Id = 74252;
local SmallGlimmeringShard_Id = 10978;
local SmallGlowingShard_Id = 11138;
local SmallHeavenlyShard_Id = 52720;
local SmallPrismaticShard_Id = 22448;
local SmallRadiantShard_Id = 11177;
local SoulDust_Id = 11083;
local SpiritDust_Id = 74249;
local StrangeDust_Id = 10940;
local VisionDust_Id = 11137;
local VoidCrystal_Id = 22450;

local UncommonArmor = {
  {
    minlvl = 5,
    maxlvl = 15,
    shards = {
      { p = 0.80, min = 1, max = 2, id = StrangeDust_Id, },
      { p = 0.20, min = 1, max = 2, id = LesserMagicEssence_Id, },
    },
  },
  {
    minlvl = 16,
    maxlvl = 20,
    shards = {
      { p = 0.75, min = 2, max = 3, id = StrangeDust_Id, },
      { p = 0.20, min = 1, max = 2, id = GreaterMagicEssence_Id, },
      { p = 0.05, min = 1, max = 1, id = SmallGlimmeringShard_Id, },
    },
  },
  {
    minlvl = 21,
    maxlvl = 25,
    shards = {
      { p = 0.75, min = 4, max = 6, id = StrangeDust_Id, },
      { p = 0.15, min = 1, max = 2, id = LesserAstralEssence_Id, },
      { p = 0.10, min = 1, max = 1, id = SmallGlimmeringShard_Id, },
    },
  },
  {
    minlvl = 26,
    maxlvl = 30,
    shards = {
      { p = 0.75, min = 1, max = 2, id = SoulDust_Id, },
      { p = 0.20, min = 1, max = 2, id = GreaterAstralEssence_Id, },
      { p = 0.05, min = 1, max = 1, id = LargeGlimmeringShard_Id, },
    },
  },
  {
    minlvl = 31,
    maxlvl = 35,
    shards = {
      { p = 0.75, min = 2, max = 5, id = SoulDust_Id, },
      { p = 0.20, min = 1, max = 2, id = LesserMysticEssence_Id, },
      { p = 0.05, min = 1, max = 1, id = SmallGlowingShard_Id, },
    },
  },
  {
    minlvl = 36,
    maxlvl = 40,
    shards = {
      { p = 0.75, min = 1, max = 2, id = VisionDust_Id, },
      { p = 0.20, min = 1, max = 2, id = GreaterMysticEssence_Id, },
      { p = 0.05, min = 1, max = 1, id = LargeGlowingShard_Id, },
    },
  },
  {
    minlvl = 41,
    maxlvl = 45,
    shards = {
      { p = 0.75, min = 2, max = 5, id = VisionDust_Id, },
      { p = 0.20, min = 1, max = 2, id = LesserNetherEssence_Id, },
      { p = 0.05, min = 1, max = 1, id = SmallRadiantShard_Id, },
    },
  },
  {
    minlvl = 46,
    maxlvl = 50,
    shards = {
      { p = 0.75, min = 1, max = 2, id = DreamDust_Id, },
      { p = 0.20, min = 1, max = 2, id = GreaterNetherEssence_Id, },
      { p = 0.05, min = 1, max = 1, id = LargeRadiantShard_Id, },
    },
  },
  {
    minlvl = 51,
    maxlvl = 55,
    shards = {
      { p = 0.75, min = 2, max = 5, id = DreamDust_Id, },
      { p = 0.20, min = 1, max = 2, id = LesserEternalEssence_Id, },
      { p = 0.05, min = 1, max = 1, id = SmallBrilliantShard_Id, },
    },
  },
  {
    minlvl = 56,
    maxlvl = 60,
    shards = {
      { p = 0.75, min = 1, max = 2, id = IllusionDust_Id, },
      { p = 0.20, min = 1, max = 2, id = GreaterEternalEssence_Id, },
      { p = 0.05, min = 1, max = 1, id = LargeBrilliantShard_Id, },
    },
  },
  {
    minlvl = 61,
    maxlvl = 65,
    shards = {
      { p = 0.75, min = 2, max = 5, id = IllusionDust_Id, },
      { p = 0.20, min = 2, max = 3, id = GreaterEternalEssence_Id, },
      { p = 0.05, min = 1, max = 1, id = LargeBrilliantShard_Id, },
    },
  },
  {
    minlvl = 79,
    maxlvl = 80,
    shards = {
      { p = 0.75, min = 1, max = 2, id = ArcaneDust_Id, },
      { p = 0.22, min = 1, max = 2, id = LesserPlanarEssence_Id, },
      { p = 0.03, min = 1, max = 1, id = SmallPrismaticShard_Id, },
    },
  },
  {
    minlvl = 81,
    maxlvl = 100,
    shards = {
      { p = 0.75, min = 2, max = 3, id = ArcaneDust_Id, },
      { p = 0.22, min = 2, max = 3, id = LesserPlanarEssence_Id, },
      { p = 0.03, min = 1, max = 1, id = SmallPrismaticShard_Id, },
    },
  },
  {
    minlvl = 101,
    maxlvl = 120,
    shards = {
      { p = 0.75, min = 2, max = 5, id = ArcaneDust_Id, },
      { p = 0.22, min = 1, max = 2, id = GreaterPlanarEssence_Id, },
      { p = 0.03, min = 1, max = 1, id = LargePrismaticShard_Id, },
    },
  },
  {
    minlvl = 130,
    maxlvl = 151,
    shards = {
      { p = 0.75, min = 1, max = 3, id = InfiniteDust_Id, },
      { p = 0.22, min = 1, max = 2, id = LesserCosmicEssence_Id, },
      { p = 0.03, min = 1, max = 1, id = SmallDreamShard_Id, },
    },
  },
  {
    minlvl = 152,
    maxlvl = 182,
    shards = {
      { p = 0.75, min = 2, max = 7, id = InfiniteDust_Id, },
      { p = 0.22, min = 1, max = 2, id = GreaterCosmicEssence_Id, },
      { p = 0.03, min = 1, max = 1, id = DreamShard_Id, },
    },
  },
  {
    minlvl = 272,
    maxlvl = 275,
    shards = {
      { p = 0.75, min = 1, max = 2, id = HypnoticDust_Id, },
      { p = 0.25, min = 1, max = 2, id = LesserCelestialEssence_Id, },
    },
  },
  {
    minlvl = 276,
    maxlvl = 290,
    shards = {
      { p = 0.75, min = 1, max = 3, id = HypnoticDust_Id, },
      { p = 0.25, min = 1, max = 3, id = LesserCelestialEssence_Id, },
    },
  },
  {
    minlvl = 291,
    maxlvl = 305,
    shards = {
      { p = 0.75, min = 1, max = 4, id = HypnoticDust_Id, },
      { p = 0.25, min = 1, max = 4, id = LesserCelestialEssence_Id, },
    },
  },
  {
    minlvl = 306,
    maxlvl = 315,
    shards = {
      { p = 0.75, min = 1, max = 5, id = HypnoticDust_Id, },
      { p = 0.25, min = 1, max = 2, id = GreaterCelestialEssence_Id, },
    },
  },
  {
    minlvl = 316,
    maxlvl = 325,
    shards = {
      { p = 0.75, min = 1, max = 6, id = HypnoticDust_Id, },
      { p = 0.25, min = 1, max = 4, id = GreaterCelestialEssence_Id, },
    },
  },
  {
    minlvl = 326,
    maxlvl = 350,
    shards = {
      { p = 0.75, min = 1, max = 7, id = HypnoticDust_Id, },
      { p = 0.25, min = 1, max = 5, id = GreaterCelestialEssence_Id, },
    },
  },
  {
    minlvl = 351,
    maxlvl = 380,
    shards = {
      { p = 0.85, min = 1, max = 3, id = SpiritDust_Id, },
      { p = 0.15, min = 1, max = 1, id = MysteriousEssence_Id, },
    },
  },
  {
    minlvl = 381,
    maxlvl = 390,
    shards = {
      { p = 0.85, min = 1, max = 4, id = SpiritDust_Id, },
      { p = 0.15, min = 1, max = 1, id = MysteriousEssence_Id, },
    },
  },
  {
    minlvl = 391,
    maxlvl = 410,
    shards = {
      { p = 0.85, min = 1, max = 5, id = SpiritDust_Id, },
      { p = 0.15, min = 1, max = 2, id = MysteriousEssence_Id, },
    },
  },
  {
    minlvl = 411,
    maxlvl = 450,
    shards = {
      { p = 0.85, min = 1, max = 6, id = SpiritDust_Id, },
      { p = 0.15, min = 1, max = 3, id = MysteriousEssence_Id, },
    },
  },
};

local UncommonWeapon = {
  {
    minlvl = 10,
    maxlvl = 15,
    shards = {
      { p = 0.80, min = 1, max = 2, id = LesserMagicEssence_Id, },
      { p = 0.20, min = 1, max = 2, id = StrangeDust_Id, },
    },
  },
  {
    minlvl = 16,
    maxlvl = 20,
    shards = {
      { p = 0.75, min = 1, max = 2, id = GreaterMagicEssence_Id, },
      { p = 0.20, min = 2, max = 3, id = StrangeDust_Id, },
      { p = 0.05, min = 1, max = 1, id = SmallGlimmeringShard_Id, },
    },
  },
  {
    minlvl = 21,
    maxlvl = 25,
    shards = {
      { p = 0.75, min = 1, max = 2, id = LesserAstralEssence_Id, },
      { p = 0.15, min = 4, max = 6, id = StrangeDust_Id, },
      { p = 0.10, min = 1, max = 1, id = SmallGlimmeringShard_Id, },
    },
  },
  {
    minlvl = 26,
    maxlvl = 30,
    shards = {
      { p = 0.75, min = 1, max = 2, id = GreaterAstralEssence_Id, },
      { p = 0.20, min = 1, max = 2, id = SoulDust_Id, },
      { p = 0.05, min = 1, max = 1, id = LargeGlimmeringShard_Id, },
    },
  },
  {
    minlvl = 31,
    maxlvl = 35,
    shards = {
      { p = 0.75, min = 1, max = 2, id = LesserMysticEssence_Id, },
      { p = 0.20, min = 2, max = 5, id = SoulDust_Id, },
      { p = 0.05, min = 1, max = 1, id = SmallGlowingShard_Id, },
    },
  },
  {
    minlvl = 36,
    maxlvl = 40,
    shards = {
      { p = 0.75, min = 1, max = 2, id = GreaterMysticEssence_Id, },
      { p = 0.20, min = 1, max = 2, id = VisionDust_Id, },
      { p = 0.05, min = 1, max = 1, id = LargeGlowingShard_Id, },
    },
  },
  {
    minlvl = 41,
    maxlvl = 45,
    shards = {
      { p = 0.75, min = 1, max = 2, id = LesserNetherEssence_Id, },
      { p = 0.20, min = 2, max = 5, id = VisionDust_Id, },
      { p = 0.05, min = 1, max = 1, id = SmallRadiantShard_Id, },
    },
  },
  {
    minlvl = 46,
    maxlvl = 50,
    shards = {
      { p = 0.75, min = 1, max = 2, id = GreaterNetherEssence_Id, },
      { p = 0.20, min = 1, max = 2, id = DreamDust_Id, },
      { p = 0.05, min = 1, max = 1, id = LargeRadiantShard_Id, },
    },
  },
  {
    minlvl = 51,
    maxlvl = 55,
    shards = {
      { p = 0.75, min = 1, max = 2, id = LesserEternalEssence_Id, },
      { p = 0.22, min = 2, max = 5, id = DreamDust_Id, },
      { p = 0.03, min = 1, max = 1, id = SmallBrilliantShard_Id, },
    },
  },
  {
    minlvl = 56,
    maxlvl = 60,
    shards = {
      { p = 0.75, min = 1, max = 2, id = GreaterEternalEssence_Id, },
      { p = 0.22, min = 1, max = 2, id = IllusionDust_Id, },
      { p = 0.03, min = 1, max = 1, id = LargeBrilliantShard_Id, },
    },
  },
  {
    minlvl = 61,
    maxlvl = 65,
    shards = {
      { p = 0.75, min = 2, max = 3, id = GreaterEternalEssence_Id, },
      { p = 0.22, min = 2, max = 5, id = IllusionDust_Id, },
      { p = 0.03, min = 1, max = 1, id = LargeBrilliantShard_Id, },
    },
  },
  {
    minlvl = 80,
    maxlvl = 100,
    shards = {
      { p = 0.75, min = 2, max = 3, id = LesserPlanarEssence_Id, },
      { p = 0.22, min = 2, max = 3, id = ArcaneDust_Id, },
      { p = 0.03, min = 1, max = 1, id = SmallPrismaticShard_Id, },
    },
  },
  {
    minlvl = 101,
    maxlvl = 120,
    shards = {
      { p = 0.75, min = 1, max = 2, id = GreaterPlanarEssence_Id, },
      { p = 0.22, min = 2, max = 5, id = ArcaneDust_Id, },
      { p = 0.03, min = 1, max = 1, id = LargePrismaticShard_Id, },
    },
  },
  {
    minlvl = 130,
    maxlvl = 151,
    shards = {
      { p = 0.75, min = 1, max = 2, id = LesserCosmicEssence_Id, },
      { p = 0.22, min = 1, max = 3, id = InfiniteDust_Id, },
      { p = 0.03, min = 1, max = 1, id = SmallDreamShard_Id, },
    },
  },
  {
    minlvl = 152,
    maxlvl = 187,
    shards = {
      { p = 0.75, min = 1, max = 2, id = GreaterCosmicEssence_Id, },
      { p = 0.22, min = 2, max = 7, id = InfiniteDust_Id, },
      { p = 0.03, min = 1, max = 1, id = DreamShard_Id, },
    },
  },
  {
    minlvl = 272,
    maxlvl = 275,
    shards = {
      { p = 0.75, min = 1, max = 2, id = LesserCelestialEssence_Id, },
      { p = 0.25, min = 1, max = 2, id = HypnoticDust_Id, },
    },
  },
  {
    minlvl = 276,
    maxlvl = 290,
    shards = {
      { p = 0.75, min = 1, max = 3, id = LesserCelestialEssence_Id, },
      { p = 0.25, min = 1, max = 3, id = HypnoticDust_Id, },
    },
  },
  {
    minlvl = 291,
    maxlvl = 305,
    shards = {
      { p = 0.75, min = 1, max = 4, id = LesserCelestialEssence_Id, },
      { p = 0.25, min = 1, max = 4, id = HypnoticDust_Id, },
    },
  },
  {
    minlvl = 306,
    maxlvl = 315,
    shards = {
      { p = 0.75, min = 1, max = 2, id = GreaterCelestialEssence_Id, },
      { p = 0.25, min = 1, max = 5, id = HypnoticDust_Id, },
    },
  },
  {
    minlvl = 316,
    maxlvl = 325,
    shards = {
      { p = 0.75, min = 1, max = 4, id = GreaterCelestialEssence_Id, },
      { p = 0.25, min = 1, max = 6, id = HypnoticDust_Id, },
    },
  },
  {
    minlvl = 326,
    maxlvl = 350,
    shards = {
      { p = 0.75, min = 1, max = 5, id = GreaterCelestialEssence_Id, },
      { p = 0.25, min = 1, max = 7, id = HypnoticDust_Id, },
    },
  },
  {
    minlvl = 351,
    maxlvl = 380,
    shards = {
      { p = 0.85, min = 1, max = 4, id = SpiritDust_Id, },
      { p = 0.15, min = 1, max = 1, id = MysteriousEssence_Id, },
    },
  },
  {
    minlvl = 381,
    maxlvl = 390,
    shards = {
      { p = 0.85, min = 1, max = 5, id = SpiritDust_Id, },
      { p = 0.15, min = 1, max = 1, id = MysteriousEssence_Id, },
    },
  },
  {
    minlvl = 391,
    maxlvl = 410,
    shards = {
      { p = 0.85, min = 1, max = 6, id = SpiritDust_Id, },
      { p = 0.15, min = 1, max = 2, id = MysteriousEssence_Id, },
    },
  },
  {
    minlvl = 411,
    maxlvl = 450,
    shards = {
      { p = 0.85, min = 1, max = 7, id = SpiritDust_Id, },
      { p = 0.15, min = 1, max = 3, id = MysteriousEssence_Id, },
    },
  },
};

local Rare = {
  {
    minlvl = 11,
    maxlvl = 25,
    shards = {
      { p = 1.00, min = 1, max = 1, id = SmallGlimmeringShard_Id, },
    },
  },
  {
    minlvl = 26,
    maxlvl = 30,
    shards = {
      { p = 1.00, min = 1, max = 1, id = LargeGlimmeringShard_Id, },
    },
  },
  {
    minlvl = 31,
    maxlvl = 35,
    shards = {
      { p = 1.00, min = 1, max = 1, id = SmallGlowingShard_Id, },
    },
  },
  {
    minlvl = 36,
    maxlvl = 40,
    shards = {
      { p = 1.00, min = 1, max = 1, id = LargeGlowingShard_Id, },
    },
  },
  {
    minlvl = 41,
    maxlvl = 45,
    shards = {
      { p = 1.00, min = 1, max = 1, id = SmallRadiantShard_Id, },
    },
  },
  {
    minlvl = 46,
    maxlvl = 50,
    shards = {
      { p = 1.00, min = 1, max = 1, id = LargeRadiantShard_Id, },
    },
  },
  {
    minlvl = 51,
    maxlvl = 55,
    shards = {
      { p = 1.00, min = 1, max = 1, id = SmallBrilliantShard_Id, },
    },
  },
  {
    minlvl = 56,
    maxlvl = 65,
    shards = {
      { p = 0.995, min = 1, max = 1, id = LargeBrilliantShard_Id, },
      { p = 0.005, min = 1, max = 1, id = NexusCrystal_Id, },
    },
  },
  {
    minlvl = 66,
    maxlvl = 99,
    shards = {
      { p = 0.995, min = 1, max = 1, id = SmallPrismaticShard_Id, },
      { p = 0.005, min = 1, max = 1, id = NexusCrystal_Id, },
    },
  },
  {
    minlvl = 100,
    maxlvl = 115,
    shards = {
      { p = 0.995, min = 1, max = 1, id = LargePrismaticShard_Id, },
      { p = 0.005, min = 1, max = 1, id = VoidCrystal_Id, },
    },
  },
  {
    minlvl = 130,
    maxlvl = 166,
    shards = {
      { p = 0.995, min = 1, max = 1, id = SmallDreamShard_Id, },
      { p = 0.005, min = 1, max = 1, id = AbyssCrystal_Id, },
    },
  },
  {
    minlvl = 167,
    maxlvl = 200,
    shards = {
      { p = 0.995, min = 1, max = 1, id = DreamShard_Id, },
      { p = 0.005, min = 1, max = 1, id = AbyssCrystal_Id, },
    },
  },
  {
    minlvl = 201,
    maxlvl = 316,
    shards = {
      { p = 1, min = 1, max = 1, id = SmallHeavenlyShard_Id, },
    },
  },
  {
    minlvl = 317,
    maxlvl = 380,
    shards = {
      { p = 1, min = 1, max = 1, id = HeavenlyShard_Id, },
    },
  },
  {
    minlvl = 381,
    maxlvl = 424,
    shards = {
      { p = 1, min = 1, max = 1, id = SmallEtherealShard_Id, },
    },
  },
  {
    minlvl = 425,
    maxlvl = 449,
    shards = {
      { p = 1, min = 1, max = 1, id = EtherealShard_Id, },
    },
  },
  {
    minlvl = 449,
    maxlvl = 450,
    shards = {
      { p = 0.8, min = 1, max = 1, id = SmallEtherealShard_Id, },
	  { p = 0.2, min = 1, max = 1, id = EtherealShard_Id, },
    },
  },
  {
    minlvl = 451,
    maxlvl = 500,
    shards = {
      { p = 1, min = 1, max = 1, id = EtherealShard_Id, },
    },
  },
};

local Epic = {
  {
    minlvl = 40,
    maxlvl = 45,
    shards = {
      { p = 1.00, min = 2, max = 4, id = SmallRadiantShard_Id, },
    },
  },
  {
    minlvl = 46,
    maxlvl = 50,
    shards = {
      { p = 1.00, min = 2, max = 4, id = LargeRadiantShard_Id, },
    },
  },
  {
    minlvl = 51,
    maxlvl = 55,
    shards = {
      { p = 1.00, min = 2, max = 4, id = SmallBrilliantShard_Id, },
    },
  },
  {
    minlvl = 56,
    maxlvl = 60,
    shards = {
      { p = 1.00, min = 1, max = 1, id = NexusCrystal_Id, },
    },
  },
  {
    minlvl = 61,
    maxlvl = 94,
    shards = {
      { p = 1.00, min = 1, max = 2, id = NexusCrystal_Id, },
    },
  },
  {
    minlvl = 95,
    maxlvl = 165,
    shards = {
      { p = 1.00, min = 1, max = 2, id = VoidCrystal_Id, },
    },
  },
  {
    minlvl = 200,
    maxlvl = 277,
    shards = {
      { p = 1.00, min = 1, max = 1, id = AbyssCrystal_Id, },
    },
  },
  {
    minlvl = 278,
    maxlvl = 419,
    shards = {
      { p = 1.00, min = 1, max = 1, id = MaelstromCrystal_Id, },
    },
  },
  {
    minlvl = 420,
    maxlvl = 600,
    shards = {
      { p = 1.00, min = 1, max = 1, id = ShaCrystal_Id, },
    },
  },
};

-- Constants used to build the disenchant table.
local ITEM_TYPE_ARMOR = 1;
local ITEM_TYPE_WEAPON = 2;

-- Warlords compatibility - these constants moved to a LuaEnum.
local ITEM_QUALITY_UNCOMMON = LE_ITEM_QUALITY_UNCOMMON or ITEM_QUALITY_UNCOMMON
local ITEM_QUALITY_RARE = LE_ITEM_QUALITY_RARE or ITEM_QUALITY_RARE
local ITEM_QUALITY_EPIC = LE_ITEM_QUALITY_EPIC or ITEM_QUALITY_EPIC

local Qualities = {
  ITEM_QUALITY_UNCOMMON,
  ITEM_QUALITY_RARE,
  ITEM_QUALITY_EPIC,
};

local Types = {
  ITEM_TYPE_ARMOR,
  ITEM_TYPE_WEAPON,
};

-- This table collects the raw data above.
local DisenchantInfo = {
  [ITEM_QUALITY_UNCOMMON] = {
    [ITEM_TYPE_ARMOR] = UncommonArmor,
    [ITEM_TYPE_WEAPON] = UncommonWeapon,
  },
  [ITEM_QUALITY_RARE] = {
    [ITEM_TYPE_ARMOR] = Rare,
    [ITEM_TYPE_WEAPON] = Rare,
  },
  [ITEM_QUALITY_EPIC] = {
    [ITEM_TYPE_ARMOR] = Epic,
    [ITEM_TYPE_WEAPON] = Epic,
  },
};

-- Here's the official disenchant table, built on startup.
local DisenchantTable;

local LocalizedWeapon;
local LocalizedArmor;

-- Flesh out the disenchant table for quick lookup.
function AuctionLite:BuildDisenchantTable()
  -- Get the localized names for weapons and armor, which we use to
  -- determine item type.
  
  --LocalizedWeapon, LocalizedArmor = GetAuctionItemClasses();
  LocalizedWeapon, LocalizedArmor = AUCTION_CATEGORY_WEAPONS, AUCTION_CATEGORY_ARMOR;

  -- Build the lookup table.
  DisenchantTable = {};

  local quality;
  for _, quality in ipairs(Qualities) do
    DisenchantTable[quality] = {};

    local typ;
    for _, typ in ipairs(Types) do
      DisenchantTable[quality][typ] = {};

      local table = DisenchantTable[quality][typ];
      local ranges = DisenchantInfo[quality][typ];

      for _, range in ipairs(ranges) do
        local i;
        for i = range.minlvl, range.maxlvl do
          table[i] = range.shards;
        end
      end
    end
  end

  -- We're done with the original data, so free it.
  DisenchantInfo = nil;
end

-- Compute the expected disenchant value for this item.
function AuctionLite:GetDisenchantValue(item)
  local result = nil;

  -- Get the item quality, level, and type.
  local _, _, quality, ilvl, _, typeStr = GetItemInfo(item);

  local disenchantable =
    quality == ITEM_QUALITY_UNCOMMON or
    quality == ITEM_QUALITY_RARE or
    quality == ITEM_QUALITY_EPIC;

  local typ;
  if typeStr == LocalizedWeapon then
    typ = ITEM_TYPE_WEAPON;
  elseif typeStr == LocalizedArmor then
    typ = ITEM_TYPE_ARMOR;
  end

  -- If it's disenchantable, look it up.
  if disenchantable and typ ~= nil then
    local shards = DisenchantTable[quality][typ][ilvl];
    if shards ~= nil then
      -- Iterate through all the possible shards we could generate
      -- to compute the expected value.
      local failed = false;
      local total = 0;
      local shard;
      for _, shard in ipairs(shards) do
        local shardValue = self:GetAuctionValue(shard.id);
        if shardValue ~= nil then
          total = total + shardValue * shard.p *
                          (shard.min + (shard.max - shard.min) / 2);
        else
          failed = true;
        end
      end

      -- If we looked up all the shards successfully, we're done.
      if not failed then
        result = total;
      end
    end
  end

  return result;
end
