--[[
  This file is part of Awesome Events.

  Author: @Ze_Mi <zemi@unive.de>
  Filename: Durability.lua
  Last Modified: 02.11.17 16:36

  Copyright (c) 2017 by Martin Unkel
  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)

  Please read the README file for further information.
  ]]

local libAM = LibStub('LibAwesomeModule-1.0')
local MOD = libAM:New('durability')

MOD.title = GetString(SI_AWEMOD_DURABILITY)
MOD.hint = GetString(SI_AWEMOD_DURABILITY_HINT)
MOD.order = 50
MOD.debug = false

-- OVERRIDES

-- USER SETTINGS

MOD.options = {
    valueLowInfo = {
        type = 'slider',
        name = GetString(SI_AWEMOD_DURABILITY_INFO),
        tooltip = GetString(SI_AWEMOD_DURABILITY_INFO_HINT),
        min  = 1,
        max = 60,
        default = 50,
        order = 1,
    },
    valueLowWarning = {
        type = 'slider',
        name = GetString(SI_AWEMOD_DURABILITY_WARNING),
        tooltip = GetString(SI_AWEMOD_DURABILITY_WARNING_HINT),
        min  = 1,
        max = 40,
        default = 25,
        order = 2,
    },
}
MOD.fontSize = 4

-- OVERRIDES

function MOD:Enable(options)
    self:d('Enable (in debug-mode)')
    self.data = {
        minimumValue = 9999,
        repairCost = 0,
    }
    self:OnInventorySingleSlotUpdate(0)
    self.dataUpdated = true
end

-- EVENT LISTENER

function MOD:GetEventListeners()
    return {
        {
            eventCode = EVENT_INVENTORY_SINGLE_SLOT_UPDATE,
            callback = function(eventCode, bagId, slotId, isNewItem, itemSoundCategory, inventoryUpdateReason, stackCountChange)
                if(bagId == BAG_WORN and inventoryUpdateReason == INVENTORY_UPDATE_REASON_DURABILITY_CHANGE) then
                    MOD:OnInventorySingleSlotUpdate(slotId)
                end
            end,
        }
    }
end

-- EVENT HANDLER

function MOD:OnInventorySingleSlotUpdate(slotId)
    self:d('OnInventorySingleSlotUpdate ' .. slotId)
    -- use slotId if not nil
    --[[
    EQUIP_SLOT_HEAD = 0
    EQUIP_SLOT_NECK = 1
    EQUIP_SLOT_CHEST = 2
    EQUIP_SLOT_SHOULDERS = 3
    EQUIP_SLOT_MAIN_HAND = 4
    EQUIP_SLOT_OFF_HAND = 5
    EQUIP_SLOT_WAIST = 6
    EQUIP_SLOT_WRIST = 7
    EQUIP_SLOT_LEGS = 8
    EQUIP_SLOT_FEET = 9
    EQUIP_SLOT_COSTUME = 10
    EQUIP_SLOT_RING1 = 11
    EQUIP_SLOT_RING2 = 12
    EQUIP_SLOT_POISON = 13
    EQUIP_SLOT_BACKUP_POISON = 14
    EQUIP_SLOT_RANGED = 15
    EQUIP_SLOT_HAND = 16
    EQUIP_SLOT_CLASS1 = 17
    EQUIP_SLOT_CLASS2 = 18
    EQUIP_SLOT_CLASS3 = 19
    EQUIP_SLOT_BACKUP_MAIN = 20
    EQUIP_SLOT_BACKUP_OFF = 21
    EQUIP_SLOT_MAX_VALUE = 21
    EQUIP_SLOT_MIN_VALUE = -1

    EQUIP_SLOT_NONE = -1
    EQUIP_SLOT_TRINKET1 = 222
    EQUIP_SLOT_TRINKET2 = 222
    ]]--

    local repairAllCost = GetRepairAllCost()
    if( repairAllCost ~= self.data.repairCost ) then
        self.data.repairCost = repairAllCost

        local minDura = 100
        for i=0,16,1 do
            if (DoesItemHaveDurability(BAG_WORN,i)) then
                minDura = math.min(minDura,GetItemCondition(BAG_WORN,i))
            end
        end
        self.data.minimumValue = minDura
        self.dataUpdated = true
        self:d(' => dataUpdated')
    end
end

-- LABEL HANDLER

function MOD:Update(options)
    self:d('Update')
    local labelText = ''
    if (self.data.minimumValue <= options.valueLowInfo) then
        if (self.data.minimumValue <= options.valueLowWarning) then
            labelText = MOD.Colorize(COLOR_AWEVS_WARNING, GetString(SI_AWEMOD_DURABILITY_LABEL)) .. ': ' .. self.data.minimumValue .. '%'
        else
            labelText = MOD.Colorize(COLOR_AWEVS_HINT, GetString(SI_AWEMOD_DURABILITY_LABEL)) .. ': ' .. self.data.minimumValue .. '%'
        end
        labelText = labelText .. ' (' .. self.data.repairCost .. 'g)'
    end
    self.label:SetText(labelText)
end -- MOD:Update