Quantcast
local addonName, addon = ...
local L = addon.L

local class = select(2, UnitClass("player"))

local info = {
    DRUID = {
        ["Balance (DPS)"] = {
            weights = {
                HIT_RATING = 100,
                MASTERY_RATING = 100,
                SPELL_POWER = 66,
                HASTE_RATING = 54,
                CRIT_RATING = 43,
                INTELLECT = 22,
                SPIRIT = 22,
            },
        },
        ["Feral (Tank)"] = {
            weights = {
				STAMINA = 100,
				ARMOR = 75,
				AGILITY = 48,
                DODGE_RATING = 41,
				----------------------------------------------
				ADDITIONAL_ARMOR = 21,
				----------------------------------------------
                MASTERY_RATING = 16,
                CRIT_RATING = 13,
                STRENGTH = 10,
                EXPERTISE_RATING = 10,
				----------------------------------------------
				HEALTH = 7,
				----------------------------------------------
				FERAL_ATTACK_POWER = 5,
				ATTACK_POWER = 5,
                HIT_RATING = 5,
                HASTE_RATING = 1,
            },
        },
        ["Feral (DPS)"] = {
            weights = {
                DAMAGE_PER_SECOND = 151,
                AGILITY = 100,
                STRENGTH = 78,
                ATTACK_POWER = 37,
                MASTERY_RATING = 35,
                HASTE_RATING = 32,
                EXPERTISE_RATING = 29,
                HIT_RATING = 28,
                CRIT_RATING = 28,
            },
        },
        ["Restoration (Healing)"] = {
            weights = {
                SPELL_POWER = 100,
                HASTE_RATING = 57,
                INTELLECT = 51,
                MASTERY_RATING = 45,
                SPIRIT = 32,
                CRIT_RATING = 11,
            },
        },
    },
    WARRIOR = {
        ["Protection (Tank)"] = {
            weights = {
                STAMINA = 100,
                MASTERY_RATING = 100,
                DODGE_RATING = 90,
                PARRY_RATING = 67,
                AGILITY = 67,
                STRENGTH = 48,
                EXPERTISE_RATING = 19,
                HIT_RATING = 10,
                CRIT_RATING = 7,
                ARMOR = 6,
                HASTE_RATING = 1,
            },
        },
        ["Fury (DPS)"] = {
            weights = {
                MASTERY_RATING = 100,
                EXPERTISE_RATING = 100,
                STRENGTH = 82,
                CRIT_RATING = 66,
                AGILITY = 53,
                HIT_RATING = 48,
                HASTE_RATING = 36,
                ARMOR = 5,
            },
        },
        ["Arms (DPS)"] = {
            weights = {
                MASTERY_RATING = 100,
                STRENGTH = 100,
                HIT_RATING = 90,
                EXPERTISE_RATING = 85,
                CRIT_RATING = 80,
                AGILITY = 65,
                HASTE_RATING = 50,
                ARMOR = 2,
            },
        },
    },
    DEATHKNIGHT = {
        ["Blood (Tank)"] = {
            weights = {
                DAMAGE_PER_SECOND = 500,
                MASTERY_RATING = 100,
                STAMINA = 100,
                AGILITY = 69,
                DODGE_RATING = 50,
                PARRY_RATING = 43,
                EXPERTISE_RATING = 38,
                STRENGTH = 31,
                CRIT_RATING = 22,
                ARMOR = 18,
                HASTE_RATING = 16,
                HIT_RATING = 16,
                ARMOR = 11,
            },
        },
        ["Frost (DPS)"] = {
            weights = {
                STRENGTH = 100,
                DAMAGE_PER_SECOND = 100,
                HIT_RATING = 43,
                EXPERTISE_RATING = 41,
                HASTE_RATING = 37,
                MASTERY_RATING = 35,
                ATTACK_POWER = 32,
                CRIT_RATING = 26,
            },
        },
        ["Unholy (DPS)"] = {
            weights = {
                STRENGTH = 100,
                DAMAGE_PER_SECOND = 100,
                HIT_RATING = 25,
                HASTE_RATING = 25,
                ATTACK_POWER = 23,
                EXPERTISE_RATING = 21,
                CRIT_RATING = 20,
                MASTERY_RATING = 8,
            },
        },
    },
    HUNTER = {
        ["Beast Mastery"] = {
            weights = {
                AGILITY = 100,
                DAMAGE_PER_SECOND = 100, -- This is actually RANGED_DPS.
                HIT_RATING = 80,
                CRIT_RATING = 60,
                MASTERY_RATING = 40,
                HASTE_RATING = 20,

				-- Where is attack power?
				-- Is intellect no longer used? Was a primary stat for BM

            },
        },
        ["Marksmanship"] = {
            weights = {
                AGILITY = 100,
                DAMAGE_PER_SECOND = 100, -- ranged dps
                HIT_RATING = 80,
                CRIT_RATING = 60,
                MASTERY_RATING = 40,
                HASTE_RATING = 20,
            },
        },
        ["Survival"] = {
            weights = {
                AGILITY = 100,
                DAMAGE_PER_SECOND = 100,
                HIT_RATING = 80,
                CRIT_RATING = 60,
                MASTERY_RATING = 20,
                HASTE_RATING = 40,
            },
        },
    },
    MAGE = {
        ["Arcane"] = {
            weights = {
                SPELL_POWER = 100,
                INTELLECT = 100,
                HIT_RATING = 80,
                HASTE_RATING = 50,
                CRIT_RATING = 45,
                MASTERY_RATING = 40,
            },
        },
        ["Fire"] = {
            weights = {
                INTELLECT = 100,
                HIT_RATING = 82,
                SPELL_POWER = 68,
                CRIT_RATING = 52,
                MASTERY_RATING = 37,
                HASTE_RATING = 35,
            },
        },
        ["Frost"] = {
            weights = {
                HIT_RATING = 100,
                MASTERY_RATING = 100,
                HASTE_RATING = 42,
                SPELL_POWER = 39,
                CRIT_RATING = 19,
                INTELLECT = 6,
            },
        },
    },
    PALADIN = {
        ["Holy (Healing)"] = {
            weights = {
                SPELL_POWER = 100,
                INTELLECT = 100,
                HASTE_RATING = 80,
				SPIRIT = 50,
                MASTERY_RATING = 50,
                CRIT_RATING = 25,
            },
        },
        ["Protection (Tank)"] = {
            weights = {
                MASTERY_RATING = 100,
                STAMINA = 100,
                AGILITY = 60,
                EXPERTISE_RATING = 59,
                DODGE_RATING = 55,
                PARRY_RATING = 30,
                STRENGTH = 16,
                ARMOR = 8,
            },
        },
        ["Retribution (DPS)"] = {
            weights = {
                STRENGTH = 100,
                DAMAGE_PER_SECOND = 100,
                ATTACK_POWER = 44,
				HIT_RATING = 35,
                EXPERTISE_RATING = 22,
				HASTE_RATING = 18,
                CRIT_RATING = 16,
                MASTERY_RATING = 9,
            },
        },
    },
    PRIEST = {
        ["Discipline (Healing)"] = {
            weights = {
                INTELLECT = 100,
                SPIRIT = 80,
                SPELL_POWER = 19,
                CRIT_RATING = 11,
                HASTE_RATING = 10,
                MASTERY_RATING = 6,
            },
        },
        ["Holy (Healing)"] = {
            weights = {
                MASTERY_RATING = 100,
                INTELLECT = 69,
                SPELL_POWER = 60,
                SPIRIT = 52,
                CRIT_RATING = 38,
                HASTE_RATING = 31,
            },
        },
        ["Shadow Magic (DPS)"] = {
            weights = {
                INTELLECT = 100,
                SPELL_POWER = 79,
                HASTE_RATING = 50,
                CRIT_RATING = 40,
                MASTERY_RATING = 38,
                SPIRIT = 37,
                HIT_RATING = 37,
            },
        },
    },
    ROGUE = {
        ["Assassination"] = {
            weights = {
                DAMAGE_PER_SECOND = 100,
                AGILITY = 100,
                MASTERY_RATING = 50,
                EXPERTISE_RATING = 42,
                HIT_RATING = 67,
                CRIT_RATING = 35,
                HASTE_RATING = 46,
            },
        },
        ["Combat"] = {
            weights = {
                DAMAGE_PER_SECOND = 100,
                AGILITY = 100,
                MASTERY_RATING = 33,
                EXPERTISE_RATING = 59,
                HIT_RATING = 70,
                CRIT_RATING = 35,
                HASTE_RATING = 56,
            },
        },
        ["Subtlety"] = {
            weights = {
                DAMAGE_PER_SECOND = 100, -- melee
                EXPERTISE_RATING = 33,
                AGILITY = 100,
                MASTERY_RATING = 20,
                HIT_RATING = 40,
                HASTE_RATING = 37,
                CRIT_RATING = 31,

				-- where is attack power?
            },
        },
    },
    SHAMAN = {
        ["Elemental Combat (DPS)"] = {
            weights = {
                HIT_RATING = 100,
                SPELL_POWER = 80,
                INTELLECT = 80,
                HASTE_RATING = 60,
                MASTERY_RATING = 40,
                CRIT_RATING = 20,
            },
        },
        ["Enhancement (DPS)"] = {
            weights = {
                DAMAGE_PER_SECOND = 124,
                AGILITY = 100,
                HIT_RATING = 60,
                EXPERTISE_RATING = 48,
                MASTERY_RATING = 44,
                STRENGTH = 42,
                ATTACK_POWER = 40,
                INTELLECT = 36,
                SPELL_POWER = 36,
                CRIT_RATING = 28,
                HASTE_RATING = 16,
            },
        },
        ["Restoration (Healing)"] = {
            weights = {
                INTELLECT = 100,
                SPELL_POWER = 83,
				SPIRIT = 75,
                HASTE_RATING = 67,
                CRIT_RATING = 58,
                MASTERY_RATING = 42,
				STAMINA = 8,
            },
        },
    },
    WARLOCK = {
        ["Affliction"] = {
            weights = {
                INTELLECT = 100,
                SPELL_POWER = 81,
                HIT_RATING = 52,
                HASTE_RATING = 43,
                CRIT_RATING = 32,
                MASTERY_RATING = 30,
                STAMINA = 1,
            },
        },
        ["Demonology"] = {
            weights = {
                INTELLECT = 100,
                SPELL_POWER = 79,
                HIT_RATING = 63,
                HASTE_RATING = 40,
                CRIT_RATING = 35,
                MASTERY_RATING = 31,
                STAMINA = 1,
            },
        },
        ["Destruction"] = {
            weights = {
                INTELLECT = 100,
                SPELL_POWER = 77,
                HIT_RATING = 64,
                HASTE_RATING = 36,
                CRIT_RATING = 34,
                MASTERY_RATING = 29,
                STAMINA = 1,
            },
        },
    },
}

local function GetWeights(link)
    if not info[class] then return {} end

    local scores = {}
    for wname, info in pairs(info[class]) do
        if not link then
            return scores
        end

        local stats = GetItemStats(link)
        if not stats then
            return scores
        end

        local total = 0
        local score = 0
        for stat, weight in pairs(info.weights) do
            total = total + weight

            local key, value

            if stat == "ARMOR" then
                key = "RESISTANCE0_NAME"
                value = stats[key]
            else
                key = "ITEM_MOD_" .. stat .. "_SHORT"
                value = stats[key]
            end

            if not value then
                key = "ITEM_MOD_" .. stat
                value = stats[key]
            end
            if not value then
                value = 0
            end
            score = score + value * weight
        end

        scores[wname] = score / total
    end

    return scores
end


-- Hook all of the relevant tooltips
local lineAdded = {}
local function OnTooltipSetItem(tooltip, ...)
    if not lineAdded[tooltip] then
        -- Get the item link and fetch the scores
        local link = select(2, tooltip:GetItem())
        local scores = GetWeights(link)

        local sort = {}
        for name, score in pairs(scores) do
            table.insert(sort, name)
        end
        table.sort(sort)

        -- If all scores are 0, then don't display anything
        local max = 0
        for name, score in pairs(scores) do
            if score > max then
                max = score
            end
        end

        if max > 0 then
            tooltip:AddLine(" ")
            tooltip:AddLine("Equipment ratings from Wowhead.com:")
            for idx, name in ipairs(sort) do
                local val = string.format("%0.2f", scores[name])
                tooltip:AddDoubleLine(name .. ":", val, 1.0, 1.0, 1.0)
            end
            tooltip:AddLine(" ")
        end
        lineAdded[tooltip] = true
    end
end

local function OnTooltipCleared(tooltip, ...)
    lineAdded[tooltip] = false
end

local tooltips = {
    GameTooltip,
    ItemRefTooltip,
    ShoppingTooltip1,
    ShoppingTooltip2,
    ShoppingTooltip3,
}

for idx, tooltip in ipairs(tooltips) do
    tooltip:HookScript("OnTooltipSetItem", OnTooltipSetItem)
    tooltip:HookScript("OnTooltipCleared", OnTooltipCleared)
end

function addon:Enable()
    -- Calculate the player's 'WowheadGearScore'
    local slotNames = {
        "BackSlot",
        "ChestSlot",
        "FeetSlot",
        "Finger0Slot",
        "Finger1Slot",
        "HeadSlot",
        "HandsSlot",
        "LegsSlot",
        "NeckSlot",
        "RangedSlot",
        "ShoulderSlot",
        "Trinket0Slot",
        "Trinket1Slot",
        "WaistSlot",
        "WristSlot",
        "MainHandSlot",
        "SecondaryHandSlot",
    }

    -- local gscores = {}
    -- for idx, slotName in ipairs(slotNames) do
    --     local slotNum = GetInventorySlotInfo(slotName)
    --     local link = GetInventoryItemLink("player", slotNum)
    --     if link then
    --         local scores = GetWeights(link)
    --         for name, score in pairs(scores) do
    --             if not gscores[name] then gscores[name] = 0 end
    --             gscores[name] = gscores[name] + score
    --         end
    --     end
    -- end

    -- for name, score in pairs(gscores) do
    --     self:Printf("Your '%s' gearscore is %d", name, score)
    -- end
end