-- Archivo: Main_Questline.lua

-- Creación del Frame principal para iniciar misiones
local MainQuestlineFrame = CreateFrame("Frame")

-- Registro del evento de interacción con el NPC
MainQuestlineFrame:RegisterEvent("GOSSIP_SHOW")

-- Definición del NPC y variables de misión
local npcID = 8583  -- Dirania Brillargente
local npcDisplayID = 7895  -- Este puede ser diferente, necesitas verificar el ID de visualización correcto
local missionInProgress = false
local missionCompleted = false  -- Variable para rastrear si la misión ha sido completada
local rewardGiven = false       -- Variable para rastrear si la recompensa ha sido otorgada
local missionTimer = 30  -- Tiempo en segundos para completar la misión
local targetKillCount = 5
local killedCount = 0
local mobID = 2031  -- Sables de la noche

-- Variables globales para la Experiencia Angular de Mundo
local worldAngularXP = 0
local worldAngularLevel = 0
local XP_PER_LEVEL = 1000
local MISSION_XP_REWARD = 200

-- Variables para la siguiente misión secreta
local secretMissionUnlocked = false  -- Rastrea si la misión secreta está desbloqueada
local secretMissionCost = 50        -- Costo en monedas de oro para desbloquear la misión secreta

-- Función auxiliar para obtener el modelo del NPC
local function SetNPCPortrait(frame, displayID)
    if frame.PortraitContainer and frame.PortraitContainer.portrait then
        SetPortraitTextureFromCreatureDisplayID(frame.PortraitContainer.portrait, displayID)
    end
end

-- Frame estilo Míticas+
local mythicPlusFrame
local function ShowMythicPlusStyleFrame()
    mythicPlusFrame = CreateFrame("Frame", "MythicPlusStyleFrame", UIParent, "PortraitFrameTemplate")
    mythicPlusFrame:SetSize(280, 150)
    mythicPlusFrame:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", 1800, 679)

    -- Establecer el retrato del sable de la noche
    SetNPCPortrait(mythicPlusFrame, 6805)  -- DisplayID para sables de la noche

    -- Título de la misión
    local title = mythicPlusFrame:CreateFontString(nil, "OVERLAY", "GameFontNormalLarge")
    title:SetPoint("TOP", 0, -55)
    title:SetText("Caza de Sables de la Noche")

    -- Tiempo restante
    local timerText = mythicPlusFrame:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
    timerText:SetPoint("TOP", title, "BOTTOM", 0, -10)
    mythicPlusFrame.timerText = timerText

    -- Objetivos
    local objectivesText = mythicPlusFrame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
    objectivesText:SetPoint("TOP", timerText, "BOTTOM", 0, -5)
    mythicPlusFrame.objectivesText = objectivesText

    -- Barra de tiempo
    local timerBar = CreateFrame("StatusBar", nil, mythicPlusFrame)
    timerBar:SetSize(240, 15)
    timerBar:SetPoint("BOTTOM", 0, 15)
    timerBar:SetStatusBarTexture("Interface\\TargetingFrame\\UI-StatusBar")
    timerBar:SetStatusBarColor(0, 0.7, 0.3)
    timerBar:SetMinMaxValues(0, missionTimer)
    timerBar:SetValue(missionTimer)
    mythicPlusFrame.timerBar = timerBar

    -- Fondo de la barra de tiempo
    local barBg = timerBar:CreateTexture(nil, "BACKGROUND")
    barBg:SetAllPoints()
    barBg:SetTexture("Interface\\TargetingFrame\\UI-StatusBar")
    barBg:SetVertexColor(0.2, 0.2, 0.2, 0.8)

    -- Borde de la barra de tiempo
    local border = timerBar:CreateTexture(nil, "OVERLAY")
    border:SetTexture("Interface\\CastingBar\\UI-CastingBar-Border-Small")
    border:SetSize(timerBar:GetWidth() + 75, 49)
    border:SetPoint("CENTER", timerBar)

    -- Animación del tiempo y actualización de objetivos
    local timeLeft = missionTimer
    mythicPlusFrame.timerTicker = C_Timer.NewTicker(0.1, function()
        if missionInProgress then
            timeLeft = timeLeft - 0.1
            mythicPlusFrame.timerText:SetFormattedText("Tiempo restante: |cFFFFFF00%.1f|r", timeLeft)
            mythicPlusFrame.objectivesText:SetFormattedText("Sables eliminados: |cFF00FF00%d/%d|r", killedCount, targetKillCount)
            mythicPlusFrame.timerBar:SetValue(timeLeft)
            
            -- Cambiar color de la barra según el tiempo restante
            local r, g, b = 0, 0.7, 0.3
            if timeLeft < 10 then
                r, g, b = 1, 0, 0
            elseif timeLeft < 20 then
                r, g, b = 1, 1, 0
            end
            mythicPlusFrame.timerBar:SetStatusBarColor(r, g, b)
            
            -- Verificar si el tiempo se ha agotado
            if timeLeft <= 0 then
                mythicPlusFrame.timerTicker:Cancel()
                if killedCount >= targetKillCount then
                    print("¡Misión completada! Has eliminado los sables de la noche.")
                    missionCompleted = true
                    killedCount = targetKillCount  -- Asegurarse de que el contador no exceda
                else
                    print("Misión fallida. No lograste matar suficientes sables de la noche a tiempo.")
                end
                missionInProgress = false
                HideMythicPlusStyleFrame()
                SaveWorldAngularXP()
                ShowMissionFrame()  -- Mostrar el frame actualizado
            end
        else
            return false  -- Detener el ticker si la misión ha terminado
        end
    end, missionTimer * 10)  -- 10 ticks por segundo durante la duración de la misión
end

-- Función para ocultar el frame estilo Míticas+
local function HideMythicPlusStyleFrame()
    if mythicPlusFrame then
        if mythicPlusFrame.timerTicker then
            mythicPlusFrame.timerTicker:Cancel()
        end
        mythicPlusFrame:Hide()
    end
end

-- Función para cargar la experiencia y nivel guardados
local function LoadWorldAngularXP()
    if WorldAngularData == nil then
        WorldAngularData = {
            XP = 0,
            Level = 0,
            MissionCompleted = false,
            RewardGiven = false,
            SecretMissionUnlocked = false,  -- Añadido para la misión secreta
        }
    end
    worldAngularXP = WorldAngularData.XP
    worldAngularLevel = WorldAngularData.Level
    missionCompleted = WorldAngularData.MissionCompleted
    rewardGiven = WorldAngularData.RewardGiven
    secretMissionUnlocked = WorldAngularData.SecretMissionUnlocked or false  -- Carga el estado de la misión secreta
end

-- Función para guardar la experiencia y nivel
local function SaveWorldAngularXP()
    WorldAngularData.XP = worldAngularXP
    WorldAngularData.Level = worldAngularLevel
    WorldAngularData.MissionCompleted = missionCompleted
    WorldAngularData.RewardGiven = rewardGiven
    WorldAngularData.SecretMissionUnlocked = secretMissionUnlocked  -- Guarda el estado de la misión secreta
end

-- Función para actualizar la experiencia y nivel
local function UpdateWorldAngularXP(xpGained)
    worldAngularXP = worldAngularXP + xpGained
    while worldAngularXP >= XP_PER_LEVEL do
        worldAngularXP = worldAngularXP - XP_PER_LEVEL
        worldAngularLevel = worldAngularLevel + 1
    end
    SaveWorldAngularXP()
end

-- Función para mostrar el cuadro de misión personalizada
local function ShowMissionFrame()
    local frame = CreateFrame("Frame", "DiraniaQuestFrame", UIParent, "PortraitFrameTemplate")
    frame:SetSize(384, 550)  -- Aumentado el tamaño para acomodar la barra de XP y nuevos elementos
    frame:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", 11, 580)
    frame:SetFrameStrata("HIGH")
    frame:SetMovable(true)
    frame:EnableMouse(true)
    frame:RegisterForDrag("LeftButton")
    frame:SetScript("OnDragStart", frame.StartMoving)
    frame:SetScript("OnDragStop", frame.StopMovingOrSizing)
    frame:Show()

    -- Establecer el retrato del NPC
    SetNPCPortrait(frame, npcDisplayID)

    -- Título de la misión
    local title = frame:CreateFontString(nil, "OVERLAY", "GameFontNormalLarge")
    title:SetPoint("TOP", 0, -40)
    if not missionCompleted then
        title:SetText("Misión de Dirania Brillargente")
    else
        title:SetText("Misión Completada")
    end

    -- Texto descriptivo de la misión o mensaje de completación
    if not missionCompleted then
        local scrollFrame = CreateFrame("ScrollFrame", nil, frame, "UIPanelScrollFrameTemplate")
        scrollFrame:SetSize(330, 280)
        scrollFrame:SetPoint("TOP", 0, -80)

        local description = CreateFrame("EditBox", nil, scrollFrame)
        description:SetMultiLine(true)
        description:SetFontObject(GameFontHighlight)
        description:SetWidth(330)
        description:SetText("Dirania Brillargente está preocupada por el creciente número de sables de la noche que se están volviendo extremadamente agresivos en la zona. Ella sospecha que algo ha alterado su comportamiento natural y necesita tu ayuda para controlar la situación.\n\nDirania te pide que elimines 5 sables de la noche en 30 segundos para evitar más ataques.\n\nObjetivos:\n- Eliminar 5 sables de la noche\n- Tiempo límite: 30 segundos\n\nRecompensas:\n- 500 de experiencia\n- 50 de oro\n- 200 Experiencia Angular de Mundo")
        description:SetAutoFocus(false)
        description:SetScript("OnEscapePressed", function() description:ClearFocus() end)
        scrollFrame:SetScrollChild(description)
    else
        local completionText = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
        completionText:SetPoint("TOP", 0, -80)
        completionText:SetWidth(350)
        completionText:SetJustifyH("LEFT")
        completionText:SetText("¡Felicidades! Has completado la misión de cazar los sables de la noche. Gracias por tu valiosa ayuda. A continuación, puedes recoger tu recompensa.")

        -- Mostrar el nivel del jugador
        local levelText = frame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
        levelText:SetPoint("TOP", completionText, "BOTTOM", 0, -10)
        levelText:SetWidth(350)
        levelText:SetJustifyH("LEFT")
        levelText:SetText(string.format("Tu nivel actual: %d", worldAngularLevel))
    end

    -- Barra de Experiencia Angular de Mundo
    local xpBar = CreateFrame("StatusBar", nil, frame)
    xpBar:SetSize(330, 20)
    xpBar:SetPoint("BOTTOM", 0, 60)
    xpBar:SetStatusBarTexture("Interface\\TargetingFrame\\UI-StatusBar")
    xpBar:SetStatusBarColor(1, 0.6, 0)
    xpBar:SetMinMaxValues(0, XP_PER_LEVEL)
    xpBar:SetValue(worldAngularXP)

    -- Fondo de la barra de XP
    local xpBarBg = xpBar:CreateTexture(nil, "BACKGROUND")
    xpBarBg:SetAllPoints()
    xpBarBg:SetTexture("Interface\\TargetingFrame\\UI-StatusBar")
    xpBarBg:SetVertexColor(0.5, 0.25, 0, 0.5)

    -- Borde de la barra de XP
    local xpBorder = xpBar:CreateTexture(nil, "OVERLAY")
    xpBorder:SetTexture("Interface\\CastingBar\\UI-CastingBar-Border-Small")
    xpBorder:SetSize(xpBar:GetWidth() + 95, 60)
    xpBorder:SetPoint("CENTER", xpBar)

    -- Texto de Experiencia Angular de Mundo
    local xpText = frame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
    xpText:SetPoint("BOTTOM", xpBar, "TOP", 0, 5)
    xpText:SetText(string.format("Experiencia Angular de Mundo: %d / %d (Nivel %d)", worldAngularXP, XP_PER_LEVEL, worldAngularLevel))

    -- Botones dinámicos según el estado de la misión
    if not missionCompleted then
        -- Botón de Aceptar
        local acceptButton = CreateFrame("Button", nil, frame, "UIPanelButtonTemplate")
        acceptButton:SetSize(128, 25)
        acceptButton:SetPoint("BOTTOMRIGHT", -40, 20)
        acceptButton:SetText("Aceptar")
        
        acceptButton:SetScript("OnClick", function()
            frame:Hide()
            missionInProgress = true
            killedCount = 0
            print("¡Has aceptado la misión! Tienes 30 segundos para matar 5 sables de la noche.")
            ShowMythicPlusStyleFrame()
            C_Timer.After(missionTimer, function()
                if killedCount >= targetKillCount then
                    missionCompleted = true
                    print("¡Misión completada! Has eliminado los sables de la noche.")
                else
                    print("Misión fallida. No lograste matar suficientes sables de la noche a tiempo.")
                end
                missionInProgress = false
                HideMythicPlusStyleFrame()
                SaveWorldAngularXP()
                ShowMissionFrame()  -- Mostrar el frame actualizado
            end)
        end)

        -- Botón de Rechazar
        local rejectButton = CreateFrame("Button", nil, frame, "UIPanelButtonTemplate")
        rejectButton:SetSize(128, 25)
        rejectButton:SetPoint("BOTTOMLEFT", 40, 20)
        rejectButton:SetText("Rechazar")
        
        rejectButton:SetScript("OnClick", function()
            frame:Hide()
            print("Has rechazado la misión de Dirania Brillargente.")
        end)
    else
        -- Botón de Completar Recompensa
        local completeButton = CreateFrame("Button", nil, frame, "UIPanelButtonTemplate")
        completeButton:SetSize(128, 25)
        completeButton:SetPoint("BOTTOM", 0, 20)
        completeButton:SetText("Completar Recompensa")
        
        completeButton:SetScript("OnClick", function()
            if not rewardGiven then
                UpdateWorldAngularXP(MISSION_XP_REWARD)
                print(string.format("Has recibido %d Experiencia Angular de Mundo.", MISSION_XP_REWARD))
                rewardGiven = true
                SaveWorldAngularXP()
                
                -- Mostrar mensaje de confirmación
                local confirmation = frame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
                confirmation:SetPoint("CENTER", 0, 0)
                confirmation:SetText("Recompensa otorgada.")
                
                -- Opcional: Cerrar el frame después de un breve periodo
                C_Timer.After(2, function()
                    frame:Hide()
                end)
            else
                print("Ya has recibido la recompensa por esta misión.")
            end

            -- Mostrar el botón para comprar la misión secreta si aún no está desbloqueada
            if missionCompleted and not secretMissionUnlocked then
                -- Botón para comprar la misión secreta
                local buySecretMissionButton = CreateFrame("Button", nil, frame, "UIPanelButtonTemplate")
                buySecretMissionButton:SetSize(200, 30)
                buySecretMissionButton:SetPoint("BOTTOM", 0, 20)
                buySecretMissionButton:SetText("Comprar Misión Secreta por 50 Oro")
                
                buySecretMissionButton:SetScript("OnClick", function()
                    if secretMissionUnlocked then
                        print("Ya has desbloqueado la misión secreta.")
                        return
                    end
                    
                    local playerGold = GetMoney() / 10000  -- Convertir de cobre a oro
                    if playerGold < secretMissionCost then
                        print("No tienes suficiente oro para comprar la misión secreta.")
                        return
                    end
                    
                    print("Por favor, paga 50 monedas de oro a Dirania Brillargente para desbloquear la misión secreta.")
                    -- Opcional: Iniciar una interacción de comercio si es posible
                end)
                
                -- Deshabilitar el botón si ya está comprado
                if secretMissionUnlocked then
                    buySecretMissionButton:SetText("Misión Secreta Comprada")
                    buySecretMissionButton:Disable()
                end
            end
        end)
        
        -- Si la misión secreta está desbloqueada, mostrar la opción
        if secretMissionUnlocked then
            -- Mostrar alguna indicación de que la misión secreta está disponible
            local secretMissionText = frame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
            secretMissionText:SetPoint("BOTTOM", completeButton, "TOP", 0, 10)
            secretMissionText:SetWidth(350)
            secretMissionText:SetJustifyH("CENTER")
            secretMissionText:SetText("Has desbloqueado una misión secreta. ¡Revisa tu mapa para más detalles!")
        end
    end
end

-- Asegúrate de cargar la experiencia al iniciar
LoadWorldAngularXP()

-- Función principal para manejar el evento de interacción con el NPC
MainQuestlineFrame:SetScript("OnEvent", function(self, event, ...)
    if event == "GOSSIP_SHOW" then
        local unitGUID = UnitGUID("target")
        if not unitGUID then return end
        local id = tonumber(string.match(unitGUID, "-(%d+)-%x+$"))
        
        if id == npcID then
            if missionCompleted and rewardGiven and not secretMissionUnlocked then
                ShowMissionFrame()  -- Mostrar el frame actualizado con la opción de misión secreta
            elseif not missionInProgress and not missionCompleted then
                ShowMissionFrame()
            else
                print("Ya tienes una misión en progreso.")
            end
        end
    end
end)

-- Rastreo de muertes de criaturas
local function TrackMobKills()
    local frame = CreateFrame("Frame")
    frame:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
    frame:SetScript("OnEvent", function(self, event)
        local _, subEvent, _, _, _, _, _, destGUID = CombatLogGetCurrentEventInfo()
        if subEvent == "UNIT_DIED" and missionInProgress then
            local id = tonumber(string.match(destGUID, "-(%d+)-%x+$"))
            if id == mobID then
                killedCount = killedCount + 1
                print("Has matado a " .. killedCount .. " de " .. targetKillCount .. " sables de la noche.")
                if mythicPlusFrame then
                    mythicPlusFrame.objectivesText:SetFormattedText("Sables eliminados: |cFF00FF00%d/%d|r", killedCount, targetKillCount)
                end
                
                -- Verificar si se completaron los objetivos
                if killedCount >= targetKillCount then
                    print("¡Misión completada! Has eliminado los sables de la noche.")
                    missionCompleted = true
                    missionInProgress = false  -- Finalizar misión
                    print("La misión ha sido completada. Ve a hablar con Dirania Brillargente para recibir tu recompensa.")
                    HideMythicPlusStyleFrame()  -- Ocultar frame de estilo mítico

                    -- Mostrar el aviso de raid en letras verdes
                    local message = "Objetivo completado a tiempo"
                    local color = { r = 0, g = 1, b = 0 }  -- Verde
                    RaidNotice_AddMessage(RaidBossEmoteFrame, message, color)

                    SaveWorldAngularXP()
                end
            end
        end
    end)
end

TrackMobKills()
