local _,ns = ...
local L = ns.L
ns.addonChannel = "AutoScrap_v1" --16 char max ?
local listenframe = CreateFrame("Frame")
listenframe.TimeSinceLastUpdate = 0
listenframe.TimeSinceLastAFKUpdate = 0
local UpdateInterval = 5
local UpdateIntervalAFK = 30
local initMyKills, sumMyKills, initMyPlants, initOthersBag, initMoney, sumMoney, initPlantas, sumPlantas
local procentageBolsaLlena = 0
--local idTag, cantidadTag,totalKillsTag, mykillsTag, separatorTag, dineroTag, plantasTag = "I","C","K","M",",", "D", "P"
local idTag, cantidadTag,totalKillsTag, mykillsTag, separatorTag, dineroTag, plantasTag, compress7, compress3, compressGris, compressVerde, compressAzul, compressMorado, compressBlanco, compressNaranja, startMSG, requestStart, bolsaTag, startTimer, timerTyper, compressNaranjaMasUno = "\001","\002","\003","\004","\005", "\006", "\007", "\008", "\009", "\010", "\011", "\012", "\013", "\014", "\015", "\016", "\017", "\018", "\019", "\020", "\021"

local function partyChatSendMessage(msg)
    if msg ~= "" then
        --C_ChatInfo.SendAddonMessage(ns.addonChannel, msg , "WHISPER", UnitName("player"))
        C_ChatInfo.SendAddonMessage(ns.addonChannel, msg , "PARTY")
        --C_ChatInfo.SendAddonMessage(ns.addonChannel, msg , "RAID")
    end
end

function ns.sendPartyTimerMSG(timer, type)
    partyChatSendMessage(""..startTimer..timer..timerTyper..type..separatorTag)
end

function ns.combatFrameStartedToSendAddonMessageRequest()
    if ns.isPartyRunning() then
        partyChatSendMessage(requestStart)
    end
end
local bufferItemID = {}
local function packAndSendBuffer(init)
    local itemText = init
    local allsent = true
    for k,v in pairs (bufferItemID) do
        --print("-"..k:gsub("\124", "BAR").."-")
        --local color = k:match ("\124c%x%x(%x%x%x%x%x%x)\124"):gsub("9d9d9d", compressGris):gsub("ffffff", compressBlanco):gsub("1eff00", compressVerde):gsub("0070dd", compressAzul):gsub("a335ee", compressMorado):gsub("ff8000",compressNaranja)
        local color = k:match ("\124c%w(%w%w%w):\124"):gsub("IQ0", compressGris):gsub("IQ1", compressBlanco):gsub("IQ2", compressVerde):gsub("IQ3", compressAzul):gsub("IQ4", compressMorado):gsub("IQ5",compressNaranja):gsub("IQ6",compressNaranjaMasUno)
        local info = k:match(":(.*:.*)\124h.*\124h"):gsub(":::::::",compress7):gsub(":::",compress3)
        local temp = itemText .. idTag..color..info..cantidadTag..v..separatorTag --sistema de enviar los itemlink recortados
        --local temp = itemText .. idTag..k..cantidadTag..v..separatorTag
        --print(color,info,temp)
        if temp:len() <= 250 then --254
            itemText = temp
            bufferItemID[k] = nil
        else
            allsent = false
            break
        end
    end
    partyChatSendMessage(itemText)
    return allsent
end

local partyDown
local lastMessage, counter = "", 0
local lastmk, lastd, lastp, lastbolsa
local lastmksent, lastdsent,lastpsent
local function partyUpdateTick()
    --local time = GetTimePreciseSec()
    if IsInRaid() or IsInGroup(LE_PARTY_CATEGORY_INSTANCE) or not IsInGroup(LE_PARTY_CATEGORY_HOME) then
        partyDown()
    end
    local currentMyKills = GetStatistic(1487) --0.01ms
    if not tonumber(currentMyKills) then currentMyKills = 0 end
    sumMyKills = currentMyKills - initMyKills --0.01ms
    --partyChatSendMessage("TK"..sumTotalKills..ns.addonSeparator.."MK"..sumMyKills..ns.addonSeparator)--0.07ms
    --local message = mykillsTag..sumMyKills..separatorTag..dineroTag..math.floor(sumMoney/10000)..separatorTag..plantasTag..sumPlantas..separatorTag
    local sendBuffer = false
    if lastmk == sumMyKills and lastd == sumMoney and lastp == sumPlantas and lastbolsa == procentageBolsaLlena and counter < 10 then --60 segundos entre mensajes si cada mensaje se comprueba cada 5
        counter = counter + 1
    else
        counter = 0
        local finalmk = sumMyKills - lastmksent
        lastmksent = sumMyKills
        local finalp = sumPlantas - lastpsent
        lastpsent = sumPlantas
        local finald = sumMoney - lastdsent
        lastdsent = sumMoney
        local message = mykillsTag..finalmk..separatorTag..dineroTag..finald..separatorTag..plantasTag..finalp..separatorTag..bolsaTag..procentageBolsaLlena..separatorTag
        lastmk,lastd, lastp,lastbolsa = sumMyKills, sumMoney, sumPlantas,procentageBolsaLlena
        sendBuffer = packAndSendBuffer(message)
    end
    --sendBuffer = packAndSendBuffer(message)
    while (not sendBuffer) do
        sendBuffer = packAndSendBuffer("")
    end
    --print("generator tick: ",(GetTimePreciseSec()-time)*1000)
end

local function OnUpdateTimer(self, elapsed)
    --local time = GetTimePreciseSec()
    self.TimeSinceLastUpdate = self.TimeSinceLastUpdate + elapsed
    self.TimeSinceLastAFKUpdate = self.TimeSinceLastAFKUpdate + elapsed
    if (self.TimeSinceLastUpdate < UpdateInterval) then
        return
    end
    self.TimeSinceLastUpdate = 0
    partyUpdateTick()
    if (self.TimeSinceLastAFKUpdate > UpdateIntervalAFK) then
        ns.checkNoResponseAfterLongPeriodOfTime()
        self.TimeSinceLastAFKUpdate = 0
    end
    --print("total exec time: ",(GetTimePreciseSec()-time)*1000)
end

local isPartyUp = false
local function partyUp()
    if not isPartyUp then
        --print ("party up")
        ns.partyIsUpOrDown( true )
        bufferItemID = {}
        ns.removeAllPlayers()
        initMyKills, initMyPlants = GetStatistic(1487), 0
        procentageBolsaLlena = ns.bolsaPorcentajeLlena()
        if not tonumber(initMyKills) then initMyKills = 0 end
        initMoney = GetMoney()
        sumMoney = 0
        --initPlantas = 0  es un tick de 1 siempre, no se resta de un valor inicial
        sumPlantas = 0
        --print ("YOU Joined a party")
        lastmksent, lastdsent,lastpsent= 0,0,0
        ns.setScriptOnMainFrame("CHAT_MSG_ADDON")
        --ns.setScriptOnMainFrame("CHAT_MSG_LOOT") --eliminado por la cache de AutoScrapPartyCurrentItemID.lua
        ns.setScriptOnMainFrame("PLAYER_MONEY")
        ns.setScriptOnMainFrame("UNIT_SPELLCAST_SUCCEEDED")
        partyChatSendMessage(startMSG)
        listenframe.TimeSinceLastUpdate = UpdateInterval + 1 -- force update on 1st try
        listenframe.TimeSinceLastAFKUpdate = 0 --to start in 30s the first check
        lastMessage, counter = "", 0
        lastmk,lastd, lastp, lastbolsa = nil, nil, nil, nil
        listenframe:SetScript("OnUpdate", OnUpdateTimer)
        ns.setPartyRunning(true)
    end
    isPartyUp = true
end

local function checkPartyLeader (flag)
    ns.setPartyLeaderInTimerKillBreakSell(flag)
end

partyDown = function ()
    if isPartyUp then
        --print ("party down")
        checkPartyLeader( true)
        ns.partyIsUpOrDown( false )
        --print ("YOU leaved a party")
        ns.setPartyRunning(false)
        bufferItemID = {}
        ns.removeScriptOnMainFrame("CHAT_MSG_ADDON")
        --ns.removeScriptOnMainFrame("CHAT_MSG_LOOT") ----eliminado por la cache de AutoScrapPartyCurrentItemID.lua
        if ns.combatWasStoppedAnyTime() and not ns.getTimerRunning() then
            --print ("unit_spellcast down")
            ns.setScriptOnMainFrame("UNIT_SPELLCAST_SUCCEEDED")
        end
        if not ns.getTimerRunning() then
            --print ("money down")
            ns.setScriptOnMainFrame("PLAYER_MONEY")
        end
        listenframe:SetScript("OnUpdate", nil)
        ns.removeAllPlayers()
    end
    isPartyUp = false
end

function ns.setPartyMyMoney(money)
    sumMoney = money-initMoney
end

function ns.setPartyPlants()
    sumPlantas = sumPlantas + 1
end

function ns.setPorcentajeBolsasLlenas(porcentaje)
    procentageBolsaLlena = porcentaje
end

function ns.isPartyRunning()
    return isPartyUp
end

function ns.checkReloadInGroup() 
    if IsInGroup(LE_PARTY_CATEGORY_HOME) and not IsInRaid() and not IsInGroup(LE_PARTY_CATEGORY_INSTANCE) then
        partyUp()
        --print("reload", UnitIsGroupLeader("player"))
        checkPartyLeader( UnitIsGroupLeader("player"))
    else
        partyDown()
    end
end


--local group, newgroup = {}, {}
listenframe:RegisterEvent("GROUP_ROSTER_UPDATE")
listenframe:SetScript("OnEvent", function(self,event,...)
--print (event,...)
    
    --elseif event == "GROUP_ROSTER_UPDATE" then
        --group, newgroup = newgroup, group
        --wipe(newgroup)
        if IsInGroup(LE_PARTY_CATEGORY_HOME) and not IsInRaid()  and not IsInGroup(LE_PARTY_CATEGORY_INSTANCE) then
            --print("AS You are not in a group.")
            partyUp()
            checkPartyLeader( UnitIsGroupLeader("player"))
            return
        else
            --print ("you are in a group AS")
            partyDown()
        end
        --[[ local n, unit = GetNumGroupMembers(), "raid"
        if not IsInRaid() then
            n, unit = n - 1, "party"
        end
        for i = 1, n do
            local name = GetUnitName(unit..i, true)
            if name and name ~= UNKNOWNOBJECT then
                newgroup[name] = i
            elseif name and name == UNKNOWNOBJECT then
                print (UNKNOWNOBJECT) -- a veces sale gente en la party que es desconocido
            end
        end

        for name, index in pairs(newgroup) do
            if not group[name] then
                print(name, "joined the group AS.")
            elseif group[name] ~= index then
                print(name, "moved within the group AS.")
            end
        end
        for name, index in pairs(group) do
            if not newgroup[name] then
                print(name, "left the group AS.")
            end
        end ]]
    --end
end)

local myName, myNameAndServer

function ns.myNames(name, nameserver)
    myName, myNameAndServer = name, name.."-"..nameserver
    
end


 
local killsRegEx = mykillsTag.."([-]?%d+)".. separatorTag.. dineroTag.. "([-]?%d+)" .. separatorTag ..plantasTag.. "([-]?%d+)" .. separatorTag ..bolsaTag.. "([-]?%d+)" .. separatorTag
local itemRegExold = idTag .. "(%d+)".. cantidadTag.."(%d+)".. separatorTag
--local itemRegEx = "(%x%x%x%x%x%x)([%x|:]+)"..cantidadTag.."(%d+)"..separatorTag
local itemRegEx = "(IQ%d)([%w|:]+)"..cantidadTag.."(%d+)"..separatorTag
--local idcaRegExComplete = idTag.."[%x|:|"..compressGris.."|"..compressBlanco.."|"..compressVerde.."|"..compressAzul.."|"..compressMorado.."|"..compressNaranja.."|"..compressNaranjaMasUno.."|"..compress7.."|"..compress3.."]+"..cantidadTag.."%d+"..separatorTag
local idcaRegExComplete = idTag.."[%w|:|"..compressGris.."|"..compressBlanco.."|"..compressVerde.."|"..compressAzul.."|"..compressMorado.."|"..compressNaranja.."|"..compressNaranjaMasUno.."|"..compress7.."|"..compress3.."]+"..cantidadTag.."%d+"..separatorTag
local timerRegEx = startTimer.."(%d+)"..timerTyper.."(%w+)"..separatorTag
--local idcaRegExComplete = idTag.."[%x|:]+"..cantidadTag.."%d+"..separatorTag
function ns.pushMSG(text, sender) --mensaje recibido del party addon
    --print("text:",text)
    if sender == myName or sender == myNameAndServer then --comprobar si yo leo mis propios mensajes de party, en tal caso descomentar
        --print ("mensaje mío recibido")
        --sender = "Paco-Servidor"
        return
    end
    --local time = GetTimePreciseSec()
    --if text == startMSG then
        --print ("Restart Received", sender)
       --ns.removePlayer(sender)
    --else
    if text == requestStart then
        --print("request received")
        listenframe.TimeSinceLastUpdate = UpdateInterval + 1
        lastMessage, counter = "", 100
    end
    --[[ if string.starts (text,"T") then
        local tk, mk = text:match(killsRegEx)
        if tk and mk then
            print ("recibido TK MK Sender", tk, mk, sender)
        end
    elseif string.starts(text, "I") then
        local il,id,ca = text:match(itemRegEx)
        if il and id and ca and tonumber(id) and id ~= 180653 and id ~= 82800 then
            --print ("recibido IL ID CA Sender", il,id,ca, sender)
        end
        print ("complex", text, sender)
    end ]]
    --print ("cadena entrera recibida", text, sender)
    if string.starts(text,mykillsTag) then
        local mk, d , p, b= text:match(killsRegEx)
        mk = tonumber(mk)
        d = tonumber(d)
        p = tonumber(p)
        b = tonumber(b)
        if mk and d and p and b then
            --print ("recibido mk", mk, "d", d,  "p", p ,"b", b, "sender", sender)
            ns.AddSendertkmkdp(mk, d, p, b, sender)
        end
    elseif string.starts(text, startTimer) then
        --print("recibido mensaje de chrono", sender)
        -- En patch 11.1.0 UnitIsGroupLeader devuelve true si estás en un reino diferente tanto si usas el nombre del lider como nombre-reino
        -- pero si estás en el mismo reino, el nombre del lider aparece sin el reino y al usar nombre-reino falla.
        
        -- Detectar el reino y si es el mismo quitarlo del nombre si está.
        -- Primer intento quitando guión y el nombre.
        isLeaderSender = sender:match("^([^-]*)") or sender
        -- Debería usar GetNormalizedRealmName(), y si es el mismo reino eliminarlo sólo ese caso. Pero no estoy seguro de si en reinos no asociados esto fallará en algún momento.
        -- Antes no funcionaba así, desde la 11.1.0 cambiaron que funcionara con el nombre de la party nada más. Pero si alguien se crea otro personaje en otro reino con el nombre,
        -- podría modificar el addon para trollear. Igualmente lo ignoramos porque no tiene botones si no es lider y además está en party, por lo que sería raro que troleara.

        if UnitIsGroupLeader(isLeaderSender) then 
            --print("es lider")
            local timer, kills= text:match(timerRegEx)
            --print("recibido" ,text,"-->" ,timer, kills, UnitIsGroupLeader(sender))
            if tonumber (timer) and (kills ==  "kill" or kills =="break" or kills == "sell") then
                ns.runMyTimer(tonumber(timer),kills)
            end
        end
    end
    if ns.getTimerRunning() then
        text = text:gsub(compress7,":::::::"):gsub(compress3,":::"):gsub(compressGris, "IQ0"):gsub(compressBlanco,"IQ1"):gsub(compressVerde,"IQ2"):gsub(compressAzul,"IQ3"):gsub(compressMorado,"IQ4"):gsub(compressNaranja,"IQ5"):gsub(compressNaranjaMasUno,"IQ6")
        --print("decompress:",text)
        for word in text:gmatch(idcaRegExComplete) do
            --print("word decp:", word)

            local temp = word --esto es para el sistema con itemlink, descomentando la línea de arriba del gsub compress etc..
            local color, info, cantidad = temp:match(itemRegEx)
            --print ("color info", color, info, cantidad)
            --print ("color:", color, "info:", info, "cantidad:", cantidad)
            if color and info and cantidad then
                local itemID = info:match("(%d+):")
                if itemID then
                    -- local remakeLink = "|cff"..color.."|Hitem:"..info
                    local remakeLink = "|cn"..color..":"..info
                    local name = "nada"--GetItemInfo(itemID)"" -- mejorar
                    --[[ if not name then
                        name= "noname"
                    end ]]
                    remakeLink = remakeLink.."|h["..name.."]|h|r"
                    remakeLink:gsub("|",'\124')
                    --print ("Recibido:", remakeLink, itemID, cantidad, sender)
                    local tonumberItemID, tonumberCantidad = tonumber(itemID), tonumber(cantidad)
                    if tonumberItemID and tonumberCantidad then
                        ns.AddSenderItem(tonumberItemID, tonumberCantidad, sender)
                    end
                end
            end
            --[[ local id,ca = word:match(itemRegExold)
            id = tonumber(id)
            ca = tonumber(ca)
            if id and ca then
                --print ("Recibido item",id, "cantidad", ca, "sender", sender)
                ns.AddSenderItem(id, ca, sender)
            end ]]
        end
    end
    --print("chat_msg time:",(GetTimePreciseSec()-time)*1000)
end

function ns.lootMSGParty(itemLink, itemID, cantidad) --enviar lo que acabo de recoger yo -- cambiar itemID por itemlink y los 2 ajustes de funciones
    if itemID ~= 180653 and itemID ~= 82800 then
        --print (itemLink, itemID, cantidad)
        --partyChatSendMessage("IL"..itemLink..ns.addonSeparator.."ID"..itemID..ns.addonSeparator.. "CA"..cantidad..ns.addonSeparator)
        if (bufferItemID[itemLink]) then
            bufferItemID[itemLink] = bufferItemID[itemLink] + cantidad
        else
            bufferItemID[itemLink] = cantidad
        end
    end
end

--[[ local countButton = 0
local reloadButton = ns.crearBoton3Fases(UIParent,"Interface\\AddOns\\AutoScrap\\images\\mailpanel", 0,14,179,192, function ()
    ns.AddSendertkmkdp(2, 1, 0, math.random(0,100), "Paco-123")
    ns.AddSendertkmkdp(2, 1, 0, math.random(0,100), "Juan-123")
    if math.random(1,2) == 1 then
        ns.AddSendertkmkdp(2, 1, 0, 0, "asdf")
        if countButton < 10 then
            countButton = countButton +2
        elseif countButton <100 then
            countButton = countButton +10
        elseif countButton <1000 then
            countButton = countButton +100
        end
        ns.AddSenderItem(86547, countButton, "Juan-123")
    else
        ns.AddSenderItem(15191, countButton, "Juan-123")
        ns.AddSenderItem(15166, countButton, "Juan-123")
        ns.AddSendertkmkdp(2, 1, 0, 100, "asdf")
    end
    
end)
reloadButton:SetPoint("CENTER") ]]