local _,ns = ...
local L=ns.L
ns.itemCached = {}
-- ns.itemCachedPrice = {} --movido a bin/AutoScrapItemCachedPrice.lua

local AutoScrap = CreateFrame("Frame")  --se puede crear como global para compartirlo con otros addons. el tipo frame puede recibir ciertas señales, por eso se crea genérico.
-- global char variable: AutoScrap_CharSettings
--print("desde core: "..AutoScrap_CharSettings.cantidad)
ns.PLAYER_ENTERING_WORLD = false
local scrapIventory
local scrapSingleItem

AutoScrap:RegisterEvent("PLAYER_ENTERING_WORLD");
AutoScrap:RegisterEvent("ADDON_LOADED");
AutoScrap:RegisterEvent("PLAYER_LOGIN");
AutoScrap:RegisterEvent("GET_ITEM_INFO_RECEIVED");
AutoScrap:RegisterEvent("BAG_UPDATE"); --cambio en bolsas, se puede lanzar varias veces si mueves de una bolsa a otra
--AutoScrap:RegisterEvent("BAG_UPDATE_COOLDOWN"); -- se recibe cada 20 segundos sin argumentos
AutoScrap:RegisterEvent("PLAYER_LEAVING_WORLD");
AutoScrap:RegisterEvent("MERCHANT_SHOW")
AutoScrap:RegisterEvent("MERCHANT_CLOSED")
AutoScrap:RegisterEvent("PLAYER_REGEN_DISABLED")
AutoScrap:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED") --para empezar el combat frame al recoger plantas.
--AutoScrap:RegisterEvent("CURSOR_CHANGED") only on combatFrame shown
--AutoScrap:RegisterEvent("MERCHANT_UPDATE") --deja de funcionar sin saber por qué al cambiar de un vendedor de un tipo a otro en montura
local checkItemIdLater = {}

--local comprobarWhiteList
local spellHerbAndMine = {}
local oneUpdateLimit
local itemSelfMultipleGlobalRegEx  = LOOT_ITEM_SELF_MULTIPLE:gsub("%%s", "(.+)"):gsub("%%d", "(%%d+)")
local itemSelfGlobalRegEx = LOOT_ITEM_SELF:gsub("%%s", "(.+)")
local function eventHandler (self, event, ...)
    --local time = GetTimePreciseSec()
    --print (event, ...)
    if event == "PLAYER_ENTERING_WORLD" then
        --ns.attachBankFrameToBagOrBank()
        ns.PLAYER_ENTERING_WORLD = true
        --comprobarWhiteList() -- era para quitar los items de la whitelist del scrap al arrancar
        ns.limpiarCacheAS()
        
        --spellHerb = GetSpellInfo(2366)
        --spellMine = GetSpellInfo(2575)
        ns.checkReloadInGroup()
        --la llamo depsués, por algún motivo el bagnon hace el inventario después. baganator no es problema
        C_Timer.After(0.001,ns.crearWowTokenIconAndTextInOtherAddons)
        --ns.startCombatFrame()
    elseif event == "UNIT_SPELLCAST_SUCCEEDED" then
        --local time = GetTimePreciseSec()
        ----- preload info only if is going to happend for speed dispatch ----  spellHerbAndMine table instead of GetSpellInfo <- 0.04ms too expensive
        local condition = false
        if (ns.getTimerRunning()) or (not ns.getTimerRunning() and not ns.combatWasStoppedAnyTime() and ns.isCombatShown()) or (ns.isPartyRunning()) then
            local unitTarget, castGUID, spellID = ...
            -- print(GetSpellName(spellID))
            -- local time = GetTimePreciseSec()
            --print("spell name", C_Spell.GetSpellName(spellID), "spellid", spellID, "en tabla", spellHerbAndMine[C_Spell.GetSpellName(spellID)])
            if unitTarget == "player" and spellHerbAndMine[C_Spell.GetSpellName(spellID)] then
                --for k,v in pairs(spellHerbAndMine) do
                    --if spellID == v then
                        condition = true
                        --break
                    --end
                --end
            end
            -- print("total exec time: ",(GetTimePreciseSec()-time)*1000)
            --print("spellid", spellID, castGUID, unitTarget)

        ----- end preload info only if is going to happend for speed dispatch ----
            --print ("SpellCast event",GetTime())
            if ns.getTimerRunning() then
                if condition then
                        ns.combatFrameSumPlantasYMenas()
                end
            elseif not ns.combatWasStoppedAnyTime() and ns.isCombatShown() then -- para empezar el frame al recoger
                if condition then
                    ns.startCombatFrame()
                    ns.combatFrameSumPlantasYMenas()
                end
            end
            if ns.isPartyRunning() then
                if condition then
                    ns.setPartyPlants()
                end
            end
        end
        --print("total exec time: ",(GetTimePreciseSec()-time)*1000)
    elseif event == "CHAT_MSG_ADDON" then
        --print (event, ...)
        local prefix, text, channel, sender, target = ...
        if prefix == ns.addonChannel and channel == "PARTY" then --evita whispeos desde fuera de party
        --if prefix == ns.addonChannel then
            ns.pushMSG(text,sender)
        end
    elseif  event == "CHAT_MSG_LOOT" then
            local chatString = ...
            --print (event, ...)
            local itemLink, cantidad = string.match(chatString,itemSelfMultipleGlobalRegEx)
            local itemID
            if itemLink and cantidad then
                itemID = tonumber(itemLink:match('item:(%d+)'))
            else
                itemLink, cantidad = string.match(chatString,itemSelfGlobalRegEx) , 1
                if itemLink and cantidad then
                    itemID = tonumber(itemLink:match('item:(%d+)'))
                end
            end
            if itemLink and itemID and cantidad then
                ns.lootMSGParty(itemLink,itemID,cantidad)
            end
    elseif event == "PLAYER_REGEN_DISABLED" then
        if not ns.combatWasStoppedAnyTime() and not ns.getTimerRunning() and ns.isCombatShown() then
            ns.startCombatFrame()
        end
    elseif event == "PLAYER_MONEY" then
        local myMoney = GetMoney()
        if ns.getTimerRunning() then
            ns.combatFrameMoneyEvent(myMoney) -- el argumento ... da el dinero pero a veces al vender viene vacío
        end
        if ns.isPartyRunning() then
            ns.setPartyMyMoney(myMoney) -- el argumento ... da el dinero pero a veces al vender viene vacío
        end
    elseif event == "CURSOR_CHANGED" then
        ns.cursorChangeEvent()
    elseif event == "ADDON_LOADED" then
        ns.variablesCargadas(...)
        ns.limpiarCacheAS()
        if AutoScrap_CharSettings.autoscrapOn then
            scrapIventory()
        end
    elseif event == "PLAYER_LOGIN" then
        local player, serverShortName = UnitFullName("player")
        --ns.myNames(UnitName("player"),GetRealmName())
        ns.myNames(player,serverShortName)
        ns.miniMapLoad()
        local successfulRequest = C_ChatInfo.RegisterAddonMessagePrefix(ns.addonChannel)

        -------------------------------------------------------------------------
        -- script para generar las plantas, menas y troncos de cada expansión.
        -- ejecutar este script para ver cuales son los nuevos ID's
        -- y luego hardcodearlos. es mejor que mirar como se llaman las habilidades o mirar todas las habilidades cada reload
        -- local name = C_Spell.GetSpellInfo(2366).name --herb
        -- for x = 1,1000000 do
        --     if C_Spell.GetSpellInfo(x) and C_Spell.GetSpellInfo(x).name == name then
        --         --spellHerbAndMine[x]= true
        --         print(x)
        --     end
        -- end
        -- name = C_Spell.GetSpellInfo(2575).name --mining
        -- for x = 1,1000000 do
        --     if C_Spell.GetSpellInfo(x) and C_Spell.GetSpellInfo(x).name == name then
        --         --spellHerbAndMine[x]= true
        --         print(x)
        --     end
        -- end
        -- name = C_Spell.GetSpellInfo(2575).name --mining
        -- for x = 1,1000000 do
        --     if C_Spell.GetSpellInfo(x) and C_Spell.GetSpellInfo(x).name == name then
        --         --spellHerbAndMine[x]= true
        --         print(x)
        --     end
        -- end
        -- print(C_Spell.GetSpellName(2575))
        spellHerbAndMine = {
            --mineria
            [C_Spell.GetSpellName(2575)] = true,
            [C_Spell.GetSpellName(195122)] = true,
            [C_Spell.GetSpellName(423341)] = true,
            --herb
            [C_Spell.GetSpellName(2366)] = true,
            [C_Spell.GetSpellName(170691)] = true,
            --fish
            [C_Spell.GetSpellName(7620)] = true,
            [C_Spell.GetSpellName(131476)] = true,
            --logging
            [C_Spell.GetSpellName(167895)] = true,
            [C_Spell.GetSpellName(1239682)] = true,
            --gas
            [C_Spell.GetSpellName(30427)] = true,
        }
        -- fin del script para mirar los id
        -----------------------------------------------------------------------
        
        if C_AddOns.IsAddOnLoaded("FasterLoot") or C_AddOns.IsAddOnLoaded("FasterLooting") then
            ns.otroAddonFasterLootDetectado()
        end
        if not TSM_API then
            -- ns.disableBankWindow()
            ns.disableGuildWindow()
        end
        if Baganator and Baganator.API and Baganator.API.RegisterCornerWidget then
            ns.hookBaganator()
        elseif Bagnon then
            ns.hookBagnonInventoryFrameOnShow()
        elseif ElvUI then
            ns.hookElvUIInventoryFrameOnShow()
        end
        --print (successfulRequest)
        --if not successfulRequest then
            
        --end
        ns.PLAYER_LOGIN = true
    elseif event == "GET_ITEM_INFO_RECEIVED" then --itemID, boolean recibido con éxito
        --print ("GET_ITEM_INFO_RECEIVED",...)
        local item, exito = ...
        if exito and checkItemIdLater[item] then
            --scrapIventory()
            oneUpdateLimit()
            checkItemIdLater[item] = nil
        end
    elseif event == "BAG_UPDATE" then
        --print ("BAG_UPDATE",...)
        oneUpdateLimit()
        --scrapIventory()
    --[[ elseif event == "BAG_UPDATE_COOLDOWN" then
        --print ("BAG_UPDATE_COOLDOWN",...)
       scrapIventory() ]]
    elseif event == "PLAYER_LEAVING_WORLD" then
        ns.PLAYER_ENTERING_WORLD = false
    elseif event == "MERCHANT_SHOW" then
        ns.MerchantShowsUp()
    elseif event == "MERCHANT_CLOSED" then
        ns.merchantClose()
    --[[ elseif event == "COMBAT_LOG_EVENT_UNFILTERED" then
        if ns.getTimerRunning() then
            local timestamp, subEvent, _, sourceGUID, sourceName, _, _, destGUID, destName = CombatLogGetCurrentEventInfo()
            if subEvent == "PARTY_KILL" and sourceName == UnitName("player") then
                --ns.combatFrameSumPartyKill() --radio muy muy corto, como 2 moonfire o menos
                --if sourceName == UnitName("player") then
                    ns.combatFrameSumPartyKillMine()
                --end
             --elseif subEvent == "UNIT_DIED" then -- no registra algunas kills, usamos el logro
                --ns.combatFrameSumUnitDied()
                --IsInGroup() -- no dice id del que lo mató ni nada
            end
        end ]]
    end
    --print("total exec time: ",(GetTimePreciseSec()-time)*1000)
end
AutoScrap:SetScript("OnEvent", eventHandler)

function ns.setScriptOnMainFrame(script)
    AutoScrap:RegisterEvent(script)
end

function ns.removeScriptOnMainFrame(script)
    AutoScrap:UnregisterEvent(script)
end

local processCount = 0
oneUpdateLimit = function ()
    AutoScrap:SetScript ("OnUpdate", function (self, ...)
        --scrapIventory()
        processCount = processCount +1
        if processCount == 999999 then
            processCount = 0
        end
        local myProcessCount = processCount
        C_Timer.After(300/1000,function ()
            if (myProcessCount == processCount) then
                --print("Scrapeando ", GetTime())
                scrapIventory()
            end
        end)
        self:SetScript ("OnUpdate",nil)
    end)
end
--[[ oneUpdateLimit = function ()
    AutoScrap:SetScript ("OnUpdate", function (self, ...)
        print("Scrapeando ", GetTime())
        scrapIventory()
        self:SetScript ("OnUpdate",nil)
    end)
end ]]

local function handle_commands(msg)
    --print("Recibido el comando: " .. msg)
    local separarPalabras = {}
    for substring in msg:gmatch("%S+") do
        table.insert(separarPalabras, substring)
    end
    --msg = {msg}
    if separarPalabras[1] == nil then --puesto /scrap o /autoscrap
        --print ("scrapeando -> cantidad: " .. scrapear_char.cantidad .. " " .. scrapear_char.TSM_mercado .. " 2Mercados: " .. tostring(scrapear_char.usar2Mercados))
        ns.mostrarFrames()
    elseif separarPalabras[1] == "clear" then --puesto /scrap clear o /autoscrap clear

        --limpiarMonedas()
    elseif separarPalabras[1] == "debug" then
            AutoScrap_CharSettings.debug = not AutoScrap_CharSettings.debug
            ns.showDebug(AutoScrap_CharSettings.debug)
    elseif separarPalabras[1] == "test" then
        local time = GetTimePreciseSec()
        scrapIventory()
        --local time = GetTimePreciseSec()
        print("total exec time: ",(GetTimePreciseSec()-time)*1000)
        --[[ local itemID = select(10,GetContainerItemInfo(0,1))
        local result = {}
        result = TSM_API.GetPriceSourceKeys(result)
        for k,v in pairs(result)do
            local data = TSM_API.GetCustomPriceValue(v, "i:"..itemID)
            print (v, data)
        end ]]

        --[[ local itemID = select(10,GetContainerItemInfo(0,1))
        local result = {}
        result = TSM_API.GetPriceSourceKeys(result)
        for k,v in pairs(result)do
            local data = TSM_API.GetCustomPriceValue(v, "i:"..itemID)
            print (v, data)
        end ]]



        --[[ for b = 0, 4 do
            for i = 1, GetContainerNumSlots(b) do
                local itemID = select(10,GetContainerItemInfo(b,i))
                if itemID then local result = TSM_API.GetCustomPriceValue("DBRegionSoldPerDay", "i:"..itemID)
                print (result)end
            end
        end ]]
        --local zz=select(7,GetContainerItemInfo(0,1)) print(GetItemInfo(zz))
    else
        --mensaje de ayuda
    end
end

SlashCmdList["AUTOSCRAP"] = function(msg) handle_commands(msg) end
SLASH_AUTOSCRAP1 = "/autoscrap"
SLASH_AUTOSCRAP2 = "/scrap"

local function comprobarOtrosAddons()
    if not TSM_API then
        ns.fatalErrorFunction(L["|cffff0000No|r |cff00ff00TSM 4|r |cffff0000 found|r"],L["|cffff0000https://www.tradeskillmaster.com/install|r"])
        return
    --[[ elseif not Scrap then
        ns.fatalErrorFunction(L["|cffff0000No addon|r |cff00ff00Scrap|r |cffff0000found, we need it also appart of AutoScrap"],L["|cffff0000https://www.curseforge.com/wow/addons/scrap|r"])
        return ]]
    elseif not (SlashCmdList["SCRAPEAR"] == nil) then
        ns.fatalErrorFunction(L["Old 'Scrapear' files instalation still present"],L["Delete the folder 'Scrapear' in the _retail_/Interface/AddOns folder of WoW"])
    end
end

local function AutoScrapToggleJunk(itemID,classID,subClassID,bag,slot,itemLink,typeItem,valorMercadoEnGold)
    if ns.CheckItemTypeSubtype(classID,subClassID) then
        local noVender = false
        local itemLevel = GetDetailedItemLevelInfo(itemLink)
        --if itemLevel==nil then print(itemLevel, nil)end
        local rate=TSM_API.GetCustomPriceValue("dbregionsalerate * 100", "i:" .. itemID) -- no todoslos objetos tienen rate
        --
        --print(itemID,itemLink,typeItem,itemLevel)
        if typeItem == "any" then--usar rates e ilevel genérico
            if rate and AutoScrap_CharSettings.protectedRatio and not AutoScrap_CharSettings.protectedAdvancedOptions and tonumber(rate) and (tonumber(rate)/100)>= AutoScrap_CharSettings.sellRatio then
                noVender= true
            end
            if rate and AutoScrap_CharSettings.protectedRatio and AutoScrap_CharSettings.protectedAdvancedOptions and tonumber(rate) and valorMercadoEnGold then
                local rateItem = tonumber(rate)/100
                local rateComparacion = 2
                for k,v in ipairs(AutoScrap_CharSettings.ratioData) do
                    rateComparacion= v["rate"]
                    if v["gold"] and v["rate"] and valorMercadoEnGold <= v["gold"] then
                        break;
                    end
                end
                --print (itemLink,"Precio:",valorMercadoEnGold," Rate:",rateItem," RateC:",rateComparacion)
                if rateItem >= rateComparacion then
                    noVender= true
                end
            end
            --ahora lo cambio sólo por items armor y weapon.
            if (classID == 4 or classID == 2) and itemLevel and AutoScrap_CharSettings.protectedIlevel and itemLevel >= AutoScrap_CharSettings.iLevel then
                noVender = true
            end
        else --usar rates a ilevel del tipo escogido en particular
            if typeItem == "ring" then
                --print("ring",itemID,itemLink,typeItem,rate,AutoScrap_CharSettings.ringsRate)
                if rate and tonumber(rate) and (tonumber(rate)/100)>= AutoScrap_CharSettings.ringsRate then
                    noVender = true
                end
                if itemLevel and itemLevel >= AutoScrap_CharSettings.ringsiLevel then
                    noVender = true
                end
            elseif typeItem == "gris" then
                if rate and tonumber(rate) and (tonumber(rate)/100)>= AutoScrap_CharSettings.graysRate then
                    noVender = true
                end
                if itemLevel and itemLevel >= AutoScrap_CharSettings.graysiLevel then
                    noVender = true
                end
            elseif typeItem == "blanco" then
                if rate and tonumber(rate) and (tonumber(rate)/100)>= AutoScrap_CharSettings.whitesRate then
                    noVender = true
                end
                if itemLevel and itemLevel >= AutoScrap_CharSettings.whitesiLevel then
                    noVender = true
                end
            end
        end
        --
        --aplicar
        if not noVender then
            if AutoScrap_CharSettings.protectSouldBinds then
                ns.itemCached[itemID]= false
                local item = Item:CreateFromBagAndSlot(bag, slot)--para soulbind quitar comentado
                item:ContinueOnItemLoad(function()
                    local itemLinkTemp = itemLink
                    ns.itemCached[itemID]= true
                    local location = item:GetItemLocation()
                    local isSoulbound = C_Item.IsBound(location)
                    if not isSoulbound then
                        ns.toggleJunkAS(itemID,itemLinkTemp)
                        --print("protected")
                        --ns.updateUIALLBags()
                    end
                end)
            else
                ns.toggleJunkAS(itemID,itemLink)
            end
        end
    end
end

scrapIventory = function ()
    if ns.PLAYER_ENTERING_WORLD then
        comprobarOtrosAddons()
        local slotsOcupados, slotsVacios
        if not ns.fatalError then
            if AutoScrap_CharSettings.autoscrapOn then
                --local foundedFarmIcons = {} --farm
                slotsOcupados, slotsVacios = 0, 0
                for b = 0, NUM_TOTAL_BAG_FRAMES do
                    for i = 1, C_Container.GetContainerNumSlots(b) do
                        --local v = {GetContainerItemInfo(b, i)}
                        local bag,slot = b,i
                        local itemID = C_Container.GetContainerItemID(b,i)
                        if itemID then
                            slotsOcupados = slotsOcupados + 1
                        else
                            slotsVacios = slotsVacios + 1
                        end
                        --[[ if ns.isCombatShown() and itemID and itemID ~= 180653 then --farm
                            for fIcon = 1,8 do
                                if itemID == AutoScrap_CharSettings.miniBagIcons[fIcon] then
                                    foundedFarmIcons[itemID] = true
                                end
                            end
                        end ]]
                        if not ns.itemCached[itemID] then
                            local itemLink = C_Container.GetContainerItemLink(b,i)
                            if itemID and itemLink and itemID == 180653 then
                                ns.itemCached[itemID] = true
                            end
                            --local icon, itemCount, locked, quality, readable, lootable, itemLink, isFiltered, noValue, itemID = GetContainerItemInfo(b, i)
                            --if v and v[4] == -1 then print("item quality -1 received") end -- nos guardamos esto para saber que no lo ha cargado bien.
                            if itemLink and itemID then
                                --print("attemp-> "  .. v[7].. " id:" ..v[10] )
                                -- ################ código viejo cuando existía el grupo de no vender del TSM
                                --[[ local stringComparacion
                                if (TSM_API.GetGroupPathByItem("i:"..itemID)) then
                                    stringComparacion = string.upper(TSM_API.GetGroupPathByItem("i:"..itemID))
                                    _,stringComparacion = TSM_API.SplitGroupPath(stringComparacion)
                                end
                                if not (stringComparacion == string.upper("No Vender") or stringComparacion == string.upper("NoVender") or stringComparacion == string.upper("#No Vender")) then ]]
                                -- ################ fin código viejo cuando existía el grupo de no vender del TSM -- añadir un end de abajo
                                    --añadir aquí ahora el grupo de no vender
                                    local whiteListed = false
                                    for x,y in pairs (AutoScrap_CharSettings.noVenderList) do --mejor con itemlink? variaciones de items
                                        if x == itemID then
                                            whiteListed = true
                                            ns.itemCached[itemID] = true
                                        end
                                    end
                                    --print ("fired 2", itemID, itemLink)
                                    if ns.isJunkBL(itemID) then
                                        ns.itemCached[itemID] = true
                                    elseif not whiteListed then --añadido no en blacklist ni whitelist --
                                        local valorMercadoComparacion = ns.getItemCachedPrice(itemID)
                                        local skip = false
                                        if not valorMercadoComparacion then
                                            skip = true
                                        end

                                        --quitado el sistema de precio viejo
                                        --[[local valorMercadoComparacion
                                        local skip = false
                                        if not AutoScrap_CharSettings.usar2Mercados then
                                            valorMercadoComparacion = TSM_API.GetCustomPriceValue(AutoScrap_CharSettings.TSM_mercado, "i:" .. itemID)
                                            if not valorMercadoComparacion then
                                                skip = true
                                            end
                                        else
                                            local valordbmarket = TSM_API.GetCustomPriceValue("dbmarket", "i:" .. itemID)
                                            local valordbregionmarketavg = TSM_API.GetCustomPriceValue("dbregionmarketavg", "i:" .. itemID)
                                            
                                            if not valordbmarket and not valordbregionmarketavg then
                                                skip = true
                                            elseif not valordbmarket then
                                                valorMercadoComparacion = valordbregionmarketavg
                                            elseif not valordbregionmarketavg then
                                                valorMercadoComparacion = valordbmarket
                                            else
                                                if  valordbmarket > valordbregionmarketavg  then
                                                    valorMercadoComparacion = valordbmarket
                                                else
                                                    valorMercadoComparacion = valordbregionmarketavg
                                                end
                                            end
                                        end ]]
                                        --fin quitado el sistema de precio viejo

                                        --if skip = true no tiene valor de mercado. valor de meracdo es que tiene valor
                                        -- /run za=select(7,GetContainerItemInfo(0,1))  zz=select(11,GetItemInfo(za)) print(zz/10000)

                                        --Añadir precio de npc si no tiene precio de mercado
                                        local uno,dos,calidadEquipo,itemLevel,cinco,seis,siete,ocho,slotEquipar,diez,sellPrice,classID,subClassID,catorce,quince,diceciseis,diecisiete
                                        if itemID == 82800 then --battle pet no da info de getiteminfo con itemlink, sólo con ID
                                            uno,dos,calidadEquipo,itemLevel,cinco,seis,siete,ocho,slotEquipar,diez,sellPrice,classID,subClassID,catorce,quince,diceciseis,diecisiete= GetItemInfo(itemID)
                                        else
                                            uno,dos,calidadEquipo,itemLevel,cinco,seis,siete,ocho,slotEquipar,diez,sellPrice,classID,subClassID,catorce,quince,diceciseis,diecisiete= GetItemInfo(itemLink)
                                        end
                                        if uno and calidadEquipo and slotEquipar and sellPrice and classID and subClassID then
                                            ns.itemCached[itemID]= true
                                            --print ("Cached: ", itemLink)
                                        else
                                            --print ("Uncached: ", itemLink)
                                        end
                                        if skip and sellPrice and sellPrice>0  and (classID == 4 or classID==2)then
                                            skip=false
                                            valorMercadoComparacion=sellPrice
                                            --print ("no market value and sell price for: ",itemLink,sellPrice/10000)
                                        end

                                        if skip and sellPrice and sellPrice>0 and classID == 15 and subClassID == 0 and not AutoScrap_CharSettings.protectedBoxes then
                                            if ns.Utils.isBox(itemID, b, i) then
                                                skip=false
                                                valorMercadoComparacion=sellPrice
                                            end
                                        end --ns.Utils.isBox(itemID, bag, slot)
                                        --quitar de la lista ahora que no se usa skip para para evitar vender la lista de No vender. Tener en cuenta quel el grupo de tsm no vender ya ni pasa por aquí

                                        --no saltamos todos los de calidad distinta de cero que son los items que no son de color gris y miscelanios y basura
                                        -- if calidadEquipo~=0 and classID == 15 and subClassID == 0 and not skip then
                                        --     skip=true
                                        -- end
                                        
                                    
                                        if not skip then
                                            -- lógica de venta
                                            --print(v[7],v[10])
                                            
                                            --if itemID and itemID == 6268 then print(itemID,itemLevel,itemLink) end
                                            if uno then
                                                if (classID==4 and subClassID == 0 and AutoScrap_CharSettings.venderAnillos and (slotEquipar == "INVTYPE_FINGER" or slotEquipar == "INVTYPE_TRINKET" or slotEquipar == "INVTYPE_NECK"))then  --vender anillos trinkers y abalorios siempre
                                                    --print("Anillo:",itemLink)
                                                        local saltar = false
                                                        if (valorMercadoComparacion / 10000 ) >= AutoScrap_CharSettings.ringsGold then
                                                            saltar = true
                                                            --print("valor mercado saltar")
                                                        end--añadir anillo aqí tb si salta
                                                        if not saltar then
                                                            if not ns.isJunkAS(itemID) then
                                                                --print("Toggle-> "  .. v[7].. " id:" ..v[10] )
                                                                AutoScrapToggleJunk(itemID,classID,subClassID,bag,slot,itemLink,"ring",valorMercadoComparacion/10000)
                                                                --print("eliminado")
                                                            end
                                                        end
                                                elseif ((classID == 4 or classID == 2) and AutoScrap_CharSettings.venderGrises and calidadEquipo==0)then --vender armaduras y armas grises
                                                    --print("Gris:",itemLink)
                                                        local saltar = false
                                                        if (valorMercadoComparacion / 10000 ) >= AutoScrap_CharSettings.graysGold then
                                                            saltar = true
                                                        end
                                                        if not saltar then
                                                            if not ns.isJunkAS(itemID) then
                                                                AutoScrapToggleJunk(itemID,classID,subClassID,bag,slot,itemLink,"gris",valorMercadoComparacion/10000)
                                                            end
                                                        end
                                                elseif ((classID == 4 or classID == 2) and AutoScrap_CharSettings.venderBlancos and calidadEquipo==1)then --vender armaduras y armas blancas
                                                    --print("blanco:",itemLink)
                                                        local saltar = false
                                                        if (valorMercadoComparacion / 10000 )>= AutoScrap_CharSettings.whitesGold then
                                                            saltar = true
                                                        end
                                                        if not saltar then
                                                            if not ns.isJunkAS(itemID) then
                                                                AutoScrapToggleJunk(itemID,classID,subClassID,bag,slot,itemLink,"blanco",valorMercadoComparacion/10000)
                                                            end
                                                        end
                                                elseif ( valorMercadoComparacion / 10000 ) < AutoScrap_CharSettings.cantidad then  -- vender si menor del precio
                                                    --print("any:",itemLink)
                                                    if not ns.isJunkAS(itemID) then
                                                        AutoScrapToggleJunk(itemID,classID,subClassID,bag,slot,itemLink,"any",valorMercadoComparacion/10000)
                                                    end
                                                end

                                            -- fin lógica de venta
                                            else --GetItemInfo failed
                                                checkItemIdLater[itemID] = true
                                            end -- 
                                        end
                                        skip = false
                                    end
                                --end --end del grupo antiguo de no vender del TSM
                            else
                                --print("attemp-> nill")
                            end
                            --::continue::
                        end -- fin if cached itemlink
                    end
                end-- fin for del b=
                --[[ for k,v in pairs(foundedFarmIcons) do --farm
                    ns.updateFarmBagIcon (k,GetItemCount(k))
                end ]]
            end
        end
        if ns.isCombatShown() then --farm2
            ns.updateFarmIconsWithInventoryNumbers()
        end
        if ns.isPartyRunning() or (ns.isCombatShown() or ns.getTimerRunning()) then
            local totalFreeSlots, totalSlots, totalOcupados
            if not slotsOcupados then --autoscrap en off o con error de tsm, sin complicarse replicamos aquí código
                --slotsOcupados, slotsVacios = 0,0
                totalFreeSlots, totalSlots = 0,0
                for b=0,NUM_TOTAL_BAG_FRAMES do
                    totalFreeSlots = totalFreeSlots + C_Container.GetContainerNumFreeSlots(b)
                    totalSlots = totalSlots + C_Container.GetContainerNumSlots(b)
                end
                totalOcupados=totalSlots-totalFreeSlots
            else
                totalOcupados = slotsOcupados
                totalSlots=slotsVacios+slotsOcupados
            end
            --print (totalOcupados,totalSlots, math.floor(((totalOcupados*100)/totalSlots)+0.5))
            local percent = math.floor(((totalOcupados*100)/totalSlots)+0.5)
            if ns.isPartyRunning() then ns.setPorcentajeBolsasLlenas(percent) end
            if ns.isCombatShown() or ns.getTimerRunning() then ns.setMyBagsPercentage(percent) end
        end

        --ns.updateUIALLBags()
    end
end
ns.scrapIventory = scrapIventory

function ns.bolsaPorcentajeLlena()
    local totalFreeSlots, totalSlots, totalOcupados
    totalFreeSlots, totalSlots = 0,0
    for b=0,NUM_TOTAL_BAG_FRAMES do
        totalFreeSlots = totalFreeSlots + C_Container.GetContainerNumFreeSlots(b)
        totalSlots = totalSlots + C_Container.GetContainerNumSlots(b)
    end
    totalOcupados=totalSlots-totalFreeSlots
    -- Si haces reloggin (no reload) NUM_TOTAL_BAG_FRAMES es es el número de bolsas, pero C_Container.GetContainerNumFreeSlots(b) de cualquier bolsa devuelve 0.
    -- Esto debe ser porque el partyup() se llama si estás en party y carga esta función en ese momento. No es muy importante, pero devolver 0 con un if de protección.
    if totalSlots == 0 then
        return 0
    end
    return math.floor(((totalOcupados*100)/totalSlots)+0.5)
end

--[[ scrapSingleItem = function ()
    if ns.PLAYER_ENTERING_WORLD then
        comprobarOtrosAddons()
        if not ns.fatalError then
            if AutoScrap_CharSettings.autoscrapOn then
                
            end
        end
    end
end ]]

--[[ comprobarWhiteList = function ()
    for k,v in pairs(AutoScrap_CharSettings.noVenderList) do
        if ns.isJunkAS(k) then
            ns.toggleJunkAS(k,v)
        end
    end
end
ns.comprobarWhiteList = comprobarWhiteList
ASGlobal = comprobarWhiteList ]]

--[[ local function limpiarMonedas()
    for b = 0, 4 do
        for i = 1, GetContainerNumSlots(b) do
            local icon, itemCount, locked, quality, readable, lootable, itemLink, isFiltered, noValue, itemID = GetContainerItemInfo(b, i)
            if icon and itemCount and itemLink and itemID then
                if ns.isJunkAS(itemID) then
                    ns.toggleJunkAS(itemID,itemLink)
                end
            end
        end
    end
end
ns.limpiarMonedas = limpiarMonedas ]]

function ns.limpiarCacheAS()
    ns.itemCached={}
    ns.clearItemCachedPrice()
end