--------------------------------------------------------------------------
--
--  LibClassicInspector by kebabstorm
--  for Classic/TBC/WOTLK
--
--  API Version 9 (2022-12-11)
--
--------------------------------------------------------------------------

--------------------------------------------------------------------------
--
--  LIBRARY CALLBACKS
--
--------------------------------------------------------------------------

--------------------------------------------------------------------------
-- ClassicInspector.RegisterCallback(addOnName, "INVENTORY_READY", inventoryReadyCallback)
-- ClassicInspector.RegisterCallback(addOnName, "TALENTS_READY", talentsReadyCallback)
-- ClassicInspector.RegisterCallback(addOnName, "ACHIEVEMENTS_READY", achievementsReadyCallback)
-- ClassicInspector.RegisterCallback(addOnName, "GLYPHS_READY", glyphsReadyCallback)
--
--  Note
--     The callbacks are useful if you need to present data the instant it becomes available,
--     but in most cases these aren't needed and using the data request functions is enough.
--
--  Parameters
--     @string   addOnName         - your addon unique name
--     @string   event             - event name (e.g. "INVENTORY_READY")
--     @function callbackFunc      - your callback function     
--
--  Returns
--     @string   event             - event name
--     @string   guid              - player guid
--     @boolean  isInspect         - was the result of inspection
--     @string   [unit]            - unit token (optional, can return nil if not available)
--
local function inventoryReadyCallback(event, guid, isInspect, unit)
local function talentsReadyCallback(event, guid, isInspect, unit)
local function achievementsReadyCallback(event, guid, isInspect, unit)
local function glyphsReadyCallback(event, guid, isInspect, unit)

--------------------------------------------------------------------------
--
--  LIBRARY FUNCTIONS
--
--------------------------------------------------------------------------

--------------------------------------------------------------------------
-- ClassicInspector:GetSpecializationName(class, tabIndex, localized)
--
--  Parameters
--     @string class               - english class name in uppercase e.g. "WARRIOR"
--     @number tabIndex            - talent tab index (1-3)
--     @boolean localized          - return localized name instead of english name
--
--  Returns
--     @string specName            - specialization name e.g. "Retribution"
--
function lib:GetSpecializationName(class, tabIndex)
    return specName

--------------------------------------------------------------------------
-- ClassicInspector:GetNumTalentsByClass(class, tabIndex)
--
--  Parameters
--     @string class               - english class name in uppercase e.g. "WARRIOR"
--     @number tabIndex            - talent tab index (1-3)
--
--  Returns
--     @number numTalents          - number of talents in tab
--
function lib:GetNumTalentsByClass(class, tabIndex)
    return numTalents

--------------------------------------------------------------------------
-- ClassicInspector:GetSpecialization(unitorguid[, group])
--
--  Parameters
--     @string unitorguid          - unit token or guid
--     @number [group]             - talent group or the current active talent group if nil
--
--  Returns
--     @number specIndex           - main specialization index (1-3)
--     @number pointsSpent         - talent points spent to the main spec
--
function lib:GetSpecialization(unitorguid, _group)
    return specIndex, mostPoints

--------------------------------------------------------------------------
-- ClassicInspector:GetTalentPoints(unitorguid[, group])
--
--  Parameters
--     @string unitorguid          - unit token or guid
--     @number [group]             - talent group or the current active talent group if nil
--
--  Returns
--     @number pointsSpent1        - talent points spent to tab 1
--     @number pointsSpent2        - talent points spent to tab 2
--     @number pointsSpent3        - talent points spent to tab 3
--
function lib:GetTalentPoints(unitorguid, _group)
    return pointsSpent1, pointsSpent2, pointsSpent3

--------------------------------------------------------------------------
-- ClassicInspector:GetActiveTalentGroup(unitorguid)
--
--  Parameters
--     @string unitorguid          - unit token or guid
--
--  Returns
--     @number group               - active talent group (1-2)
--
function lib:GetActiveTalentGroup(unitorguid)
    return group

--------------------------------------------------------------------------
-- ClassicInspector:GetTalentInfo(unitorguid, tabIndex, talentIndex[, group])
--
--  Note
--     talentID is currently unimplemented and returns 0
--
--  Parameters
--     @string unitorguid          - unit token or guid
--     @number tabIndex            - talent tab index (1-3)
--     @number talentIndex         - ranging from 1 to GetNumTalents(tabIndex). counted from left to right, top to bottom.
--     @number [group]             - talent group or the current active talent group if nil
--
--  Returns
--     @string name                - name of the talent
--     @number iconTexture         - fileID of icon texture
--     @number tier                - the row/tier that the talent sits on
--     @number column              - the column that the talent sits on
--     @number rank                - the current amount of talent points for a talent
--     @number maxRank             - the maximum amount of talent points for a talent
--     @number isExceptional       - 1 if the talent is the ultimate talent, e.g. Lightwell, otherwise returns nil
--     @number available           - always 1
--     @number talentID            - talent ID
--
function lib:GetTalentInfo(unitorguid, tabIndex, talentIndex, _group)
    return name, iconTexture, tier, column, rank, maxRank, isExceptional, available, id

--------------------------------------------------------------------------
-- ClassicInspector:GetTalentInfoByClass(class, tabIndex, talentIndex)
--
--  Note
--     talentID is currently unimplemented and returns 0
--
--  Parameters
--     @string class               - english class name in uppercase e.g. "WARRIOR"
--     @number tabIndex            - talent tab index (1-3)
--     @number talentIndex         - ranging from 1 to GetNumTalents(tabIndex). counted from left to right, top to bottom.
--
--  Returns
--     @string name                - name of the talent
--     @number iconTexture         - fileID of icon texture
--     @number tier                - the row/tier that the talent sits on
--     @number column              - the column that the talent sits on
--     @number rank                - always 0
--     @number maxRank             - the maximum amount of talent points for a talent
--     @number isExceptional       - 1 if the talent is the ultimate talent, e.g. Lightwell, otherwise returns nil
--     @number available           - always 1
--     @number talentID            - talent ID
--
function lib:GetTalentInfoByClass(class, tabIndex, talentIndex)
    return name, texture, tier, column, 0, maxRank, isExceptional, available, id

--------------------------------------------------------------------------
-- ClassicInspector:GetInventoryItemID(unitorguid, slot)
--
--  Parameters
--     @string unitorguid          - unit token or guid
--     @number inventorySlot       - inventory slot (1-19)
--
--  Returns
--     @number itemID              - inventory item id
--
function lib:GetInventoryItemID(unitorguid, slot)
    return itemID

--------------------------------------------------------------------------
-- ClassicInspector:GetInventoryItemLink(unitorguid, slot)
--
--  Parameters
--     @string unitorguid          - unit token or guid
--     @number inventorySlot       - inventory slot (1-19)
--
--  Returns
--     @string itemLink            - inventory item link (can return nil if item is not cached yet)
--
function lib:GetInventoryItemLink(unitorguid, slot)
    return itemLink

--------------------------------------------------------------------------
-- ClassicInspector:GetInventoryItemMixin(unitorguid, slot)
--
--  Parameters
--     @string unitorguid          - unit token or guid
--     @number inventorySlot       - inventory slot (1-19)
--
--  Returns
--     @ItemMixin item             - inventory item ItemMixin
--
function lib:GetInventoryItemMixin(unitorguid, slot)
    return item

--------------------------------------------------------------------------
-- ClassicInspector:GetInventoryItemIDTable(unitorguid)
--
--  Parameters
--     @string unitorguid          - unit token or guid
--
--  Returns
--     @table  inventoryTable      - inventory item id table (1-19)
--
function lib:GetInventoryItemIDTable(unitorguid)
    return inventoryTable

--------------------------------------------------------------------------
-- ClassicInspector:GetTalentRanksTable(unitorguid)
--
--  Parameters
--     @string unitorguid          - unit token or guid
--
--  Returns
--     @table  talentsTable        - talent ranks table
--
function lib:GetTalentRanksTable(unitorguid)
    return talentsTable

--------------------------------------------------------------------------
-- ClassicInspector:GetLastCacheTime(unitorguid)
--
--  Parameters
--     @string unitorguid          - unit token or guid
--
--  Returns
--     @number talentsTime         - time when talents were last cached or 0 if not found
--     @number inventoryTime       - time when inventory was last cached or 0 if not found
--     @number achievementsTime    - time when achievements were last cached or 0 if not found
--     @number glyphsTime          - time when glyphs were last cached or 0 if not found
--
function lib:GetLastCacheTime(unitorguid)
    return talentsTime, inventoryTime, achievementsTime, glyphsTime

--------------------------------------------------------------------------
-- ClassicInspector:PlayerGUIDToUnitToken(unit)
--
--  Parameters
--     @string guid                - player guid
--
--  Returns
--     @string unit                - player unit token
--
function lib:PlayerGUIDToUnitToken(guid)
    return unit

--------------------------------------------------------------------------
-- ClassicInspector:IsClassic()
--
--  Returns
--     @boolean isClassic          - client version is Classic "Vanilla": Means Classic Era and its seasons like SoM (1.x.x)
--
function lib:IsClassic()
    return isClassic

--------------------------------------------------------------------------
-- ClassicInspector:IsTBC()
--
--  Returns
--     @boolean isTBC              - client version is Classic TBC (2.x.x)
--
function lib:IsTBC()
    return isTBC

--------------------------------------------------------------------------
-- ClassicInspector:IsWotlk()
--
--  Returns
--     @boolean isWotlk            - client version is Classic Wotlk (3.x.x)
--
function lib:IsWotlk()
    return isWotlk

--------------------------------------------------------------------------
-- ClassicInspector:CanInspect(unitorguid)
--
--  Note
--     This function is provided for special cases and does not need to be used in normal operation.
--     Inspections are handled automatically by the library and do not need to be handled manually.
--
--  Parameters
--     @string unitorguid          - unit token or guid of target to check
--
--  Returns
--     @boolean canInspect         - can target unit be inspected
--
function lib:CanInspect(unitorguid)
    return canInspect

--------------------------------------------------------------------------
-- ClassicInspector:DoInspect(unitorguid)
--
--  Note
--     This function is provided for special cases and does not need to be used in normal operation.
--     Inspections are handled automatically by the library and do not need to be handled manually.
--
--  Parameters
--     @string unitorguid          - unit token or guid of inspection target
--
--  Returns
--     @number status              - inspection status
--                                   == 0 : target cannot be inspected
--                                   == 1 : instant inspection 
--                                   == 2 : queued inspection
--
function lib:DoInspect(unitorguid)
    return status
    
--------------------------------------------------------------------------
-- ClassicInspector:Version()
--
--  Returns
--     @number version             - library version
--
function lib:Version()
    return version

--------------------------------------------------------------------------
-- [WOTLK]
-- ClassicInspector:GetTotalAchievementPoints(unitorguid)
--
--  Parameters
--     @string unitorguid          - unit token or guid
--
--  Returns
--     @number total_points        - total achievement points
--
function lib:GetTotalAchievementPoints(unitorguid)
    return total_points

--------------------------------------------------------------------------
-- [WOTLK]
-- ClassicInspector:GetAchievementInfo(unitorguid, achievementID)
--
--  Parameters
--     @string  unitorguid         - unit token or guid
--     @number  achievementID      - achievement ID (type=achievement)
--
--  Returns
--     @boolean completed          - is achievement completed
--     @number  month              - month of completion
--     @number  day                - day of completion
--     @number  year               - year of completion
--
function lib:GetAchievementInfo(unitorguid, achievementID)
    return completed, month, day, year

--------------------------------------------------------------------------
-- [WOTLK]
-- ClassicInspector:GetStatistic(unitorguid, achievementID)
--
--  Parameters
--     @string unitorguid          - unit token or guid
--     @number achievementID       - achievement ID (type=statistic)
--
--  Returns
--     @string value               - value of the statistic as displayed in-game
--
function lib:GetStatistic(unitorguid, achievementID)
    return value

--------------------------------------------------------------------------
-- [WOTLK]
-- ClassicInspector:AddTrackedAchievement(achievementID)
--
--  Note
--     It is not required to use this, as using the GetAchievementInfo/GetStatistic functions
--     will automatically add the requested achievement to the tracking list.
--
--  Parameters
--     @number  achievementID      - achievement ID (type=achievement/statistic)
--
--  Returns
--     @boolean success            - achievementID is valid and added to tracking list
--     @boolean isStatistic        - is achievement type a statistic
--
function lib:AddTrackedAchievement(achievementID)
    return success, isStatistic

--------------------------------------------------------------------------
-- [WOTLK]
-- ClassicInspector:GetGlyphSocketInfo(unitorguid, socketID[, group])
--
--  Note
--     iconFile is currently implemented only for the local player and returns 0 when requesting
--     info for other players
--
--  Parameters
--     @string unitorguid          - unit token or guid
--     @number socketID            - socket index to query, ranging from 1 to 6 (NUM_GLYPH_SLOTS)
--     @number [group]             - talent group or the current active talent group if nil
--
--  Returns
--     @boolean enabled            - true if the socket has a glyph inserted
--     @number glyphType           - type of glyph accepted by this socket (GLYPHTYPE_MAJOR=1 or GLYPHTYPE_MINOR=2)
--     @number glyphSpellID        - spell ID of the socketed glyph
--     @number iconFile            - file ID of the sigil icon associated with the socketed glyph
--
function lib:GetGlyphSocketInfo(unitorguid, socketID, _group)
    return enabled, glyphType, glyphSpellID, iconFile

--------------------------------------------------------------------------
-- [WOTLK]
-- ClassicInspector:HasGlyph(unitorguid, glyphSpellID[, group])
--
--  Parameters
--     @string unitorguid          - unit token or guid
--     @number glyphSpellID        - spell ID of the socketed glyph
--     @number [group]             - talent group or the current active talent group if nil
--
--  Returns
--     @boolean enabled            - true if the player has socketed glyph with matching ID
--
function lib:HasGlyph(unitorguid, glyphSpellID, _group)
    return enabled

--------------------------------------------------------------------------
-- [WOTLK]
-- ClassicInspector:GetGlyphs(unitorguid[, group])
--
--  Parameters
--     @string unitorguid          - unit token or guid
--     @number [group]             - talent group or the current active talent group if nil
--
--  Returns
--     @number glyphSpellID1       - spell ID of glyph in socket 1 (MAJOR)
--     @number glyphSpellID2       - spell ID of glyph in socket 2 (MINOR)
--     @number glyphSpellID3       - spell ID of glyph in socket 3 (MINOR)
--     @number glyphSpellID4       - spell ID of glyph in socket 4 (MAJOR)
--     @number glyphSpellID5       - spell ID of glyph in socket 5 (MINOR)
--     @number glyphSpellID6       - spell ID of glyph in socket 6 (MAJOR)
--
function lib:GetGlyphs(unitorguid, _group)
    return glyphSpellID1, glyphSpellID2, glyphSpellID3, glyphSpellID4, glyphSpellID5, glyphSpellID6
