-- Asegurarse de que VoiceOver está correctamente definido
VoiceOver = VoiceOver or {}
setfenv(1, VoiceOver)

-- Definir colores
local YELLOW = "|cFFFFFF00"
local WHITE = "|cFFFFFFFF"
local RESET = "|r"

-- Redefinir la función GameObjectOnlyFrameDebugPrint para imprimir el título en amarillo y el mensaje en blanco
local function GameObjectOnlyFrameDebugPrint(message)
    print(YELLOW .. "[GameObjectOnlyFrame Debug]" .. WHITE .. message .. RESET)
end

-- Crear un frame para mostrar el título y el contenido del objeto en un solo textbox
local gameObjectOnlyFrame = CreateFrame("Frame", "GameObjectOnlyFrame", UIParent, "BasicFrameTemplateWithInset")
gameObjectOnlyFrame:SetSize(500, 350)
gameObjectOnlyFrame:SetPoint("CENTER")
gameObjectOnlyFrame:EnableMouse(true)
gameObjectOnlyFrame:SetMovable(true)
gameObjectOnlyFrame:RegisterForDrag("LeftButton")
gameObjectOnlyFrame:SetScript("OnDragStart", gameObjectOnlyFrame.StartMoving)
gameObjectOnlyFrame:SetScript("OnDragStop", gameObjectOnlyFrame.StopMovingOrSizing)
gameObjectOnlyFrame:Hide() -- Ocultar el frame inicialmente

-- Crear un campo de texto para el contenido del objeto
local gameObjectContentEditBox = CreateFrame("EditBox", nil, gameObjectOnlyFrame, "InputBoxTemplate")
gameObjectContentEditBox:SetMultiLine(true)
gameObjectContentEditBox:SetSize(450, 250)
gameObjectContentEditBox:SetPoint("TOP", gameObjectOnlyFrame, "TOP", 0, -30)
gameObjectContentEditBox:SetAutoFocus(false)
gameObjectContentEditBox:SetScript("OnEscapePressed", function(self) self:ClearFocus() end)

-- Añadir el script para seleccionar todo el texto cuando se haga clic
gameObjectContentEditBox:SetScript("OnMouseDown", function(self)
    self:HighlightText()
end)

-- Función para mostrar y seleccionar el texto en el campo
local function ShowAndSelectGameObjectText(objectTitle, objectText)
    GameObjectOnlyFrameDebugPrint("Displaying object details: Title - " .. objectTitle)

    local formattedText = string.format("[Object: %s]\n\n%s", objectTitle, objectText)

    gameObjectOnlyFrame:Show()
    gameObjectContentEditBox:SetText(formattedText)
    gameObjectContentEditBox:HighlightText()
end

-- Función para manejar el evento ITEM_TEXT_READY
local function OnItemTextReadyEvent()
    local title = ItemTextGetItem()
    local content = ItemTextGetText()

    if title and content then
        ShowAndSelectGameObjectText(title, content)
    else
        GameObjectOnlyFrameDebugPrint("Failed to retrieve object details")
    end
end

-- Crear un tooltip oculto para escanear información
local scanningTooltip = CreateFrame("GameTooltip", "GameObjectOnlyFrameScanningTooltip", nil, "GameTooltipTemplate")
scanningTooltip:SetOwner(WorldFrame, "ANCHOR_NONE")

-- Función para obtener el texto completo del tooltip
local function GetTooltipText(link)
    scanningTooltip:ClearLines()
    scanningTooltip:SetHyperlink(link)

    local text = ""
    local name = ""

    if _G["GameObjectOnlyFrameScanningTooltipTextLeft1"] then
        name = _G["GameObjectOnlyFrameScanningTooltipTextLeft1"]:GetText() or ""
    end

    local numLines = scanningTooltip:NumLines()
    for i = 2, numLines do
        local left = _G["GameObjectOnlyFrameScanningTooltipTextLeft" .. i]
        local right = _G["GameObjectOnlyFrameScanningTooltipTextRight" .. i]

        if left and left:GetText() then
            text = text .. left:GetText() .. "\n"
        end
        if right and right:GetText() then
            text = text .. right:GetText() .. "\n"
        end
    end

    return name, text
end

-- Función para manejar clics en enlaces de items
local function OnHyperlinkClick(_, link)
    local linkType = string.match(link, "^(.-):")
    if linkType == "item" then
        local itemName, itemDescription = GetTooltipText(link)
        ShowAndSelectGameObjectText(itemName, itemDescription)
        return true
    end
end

-- Crear un frame para capturar el evento ITEM_TEXT_READY
local gameObjectEventFrame = CreateFrame("Frame")
gameObjectEventFrame:RegisterEvent("ITEM_TEXT_READY")
gameObjectEventFrame:SetScript("OnEvent", function(self, event, ...)
    if event == "ITEM_TEXT_READY" then
        OnItemTextReadyEvent()
    end
end)

-- Registrar para clics en enlaces del chat
for i = 1, NUM_CHAT_WINDOWS do
    local frame = _G["ChatFrame" .. i]
    if frame then
        frame:SetScript("OnHyperlinkClick", OnHyperlinkClick)
    end
end

-- Función para reiniciar la tabla de objetos capturados (si es necesario en el futuro)
function ResetCapturedObjects()
    local capturedObjects = {}
    GameObjectOnlyFrameDebugPrint("Reset captured objects table")
end
