-- 1. Show Quick Slot for Technoscrying World Quest


local _, addon = ...
local API = addon.API;
local QuickSlot = addon.QuickSlot;

local IsQuestActive = C_TaskQuest.IsActive;
local IsOnQuest = C_QuestLog.IsOnQuest;
local HasOverrideActionBar = HasOverrideActionBar;
local GetOverrideBarSkin = GetOverrideBarSkin;
local UnitPowerBarID = UnitPowerBarID;  --659
local IsFlying = IsFlying;

local GOGGLE_NAME = C_Item.GetItemNameByID(202247);
local GOGGLE_ITEM_ID = 202247;
local GOGGLE_SPELL_ID = 398013;

local QUICKSLOT_NAME = "technoscryers";

local QUESTS = {
    [78820] = 2133,     --Zaralek Cavern
    [78931] = 2151,     --The Forbidden Reach
    [78616] = 2022,     --The Waking Shores
};

local QUEST_MAPS = {};
for _, uiMapID in pairs(QUESTS) do
    table.insert(QUEST_MAPS, uiMapID);
end

local ZoneTriggerModule;
local EL = CreateFrame("Frame");


function EL:ShouldShowQuickSlot()
    if IsFlying() then
        return false
    end
    return not ((HasOverrideActionBar() and GetOverrideBarSkin() == 534041) or (UnitPowerBarID("player") == 659))
end

function EL:StopZoneTrigger()
    if ZoneTriggerModule then
        ZoneTriggerModule:SetEnabled(false);
    end
end

function EL:SetupZoneTrigger(maps)
    if not ZoneTriggerModule then
        local module = API.CreateZoneTriggeredModule("azarchives");
        ZoneTriggerModule = module;
        ZoneTriggerModule:SetValidZones(QUEST_MAPS);

        local function OnEnterZoneCallback()
            EL:ListenEvents(true);
        end

        local function OnLeaveZoneCallback()
            EL:ListenEvents(false);
        end

        module:SetEnterZoneCallback(OnEnterZoneCallback);
        module:SetLeaveZoneCallback(OnLeaveZoneCallback);
    end

    
    ZoneTriggerModule:SetEnabled(true);
    ZoneTriggerModule:Update();
end

function EL:SearchQuests()
    --Not used
    --We don't know when the quests will refresh so we always listen quest events on 3 maps

    local maps = {};

    for questID, uiMapID in pairs(QUESTS) do
        if IsQuestActive(questID) then
            table.insert(maps, uiMapID);
        end
    end

    if #maps > 0 then
        self:SetupZoneTrigger(maps);
    else
        self:StopZoneTrigger();
    end
end

function EL:ListenEvents(state)
    if state then
        self:RegisterEvent("QUEST_ACCEPTED");
        self:RegisterEvent("QUEST_REMOVED");
        self:SetScript("OnEvent", self.OnEvent);
    else
        self:UnregisterEvent("QUEST_ACCEPTED");
        self:UnregisterEvent("QUEST_REMOVED");
        self:UnregisterEvent("UPDATE_OVERRIDE_ACTIONBAR");
        self:UnregisterEvent("UNIT_POWER_BAR_HIDE");
        self:UnregisterEvent("PLAYER_MOUNT_DISPLAY_CHANGED");
        self:SetScript("OnEvent", nil);
        self:SetCheckFlying(false);
        QuickSlot:RequestCloseUI(QUICKSLOT_NAME);
    end
end

local function CheckFlying_OnUpdate(self, elapsed)
    self.t = self.t + elapsed;
    if self.t > 0.5 then
        self.t = 0;
        local isFlying = IsFlying();
        if isFlying ~= self.isFlying then
            self.isFlying = isFlying;
            self:UpdateQuickSlot();
        end
    end
end

function EL:SetCheckFlying(state)
    if state then
        self.t = 0;
        self.isFlying = nil;
        self:SetScript("OnUpdate", CheckFlying_OnUpdate);
    else
        self:SetScript("OnUpdate", nil);
    end
end

function EL:UpdateQuest()
    local isOnQuest;

    for questID in pairs(QUESTS) do
        if IsOnQuest(questID) then
            isOnQuest = true
            break
        end
    end

    if isOnQuest then
        self:ListenEvents(true);
        self:RegisterEvent("UPDATE_OVERRIDE_ACTIONBAR");
        self:RegisterUnitEvent("UNIT_POWER_BAR_HIDE", "player");
        self:UpdateQuickSlot();
        self:SetCheckFlying(true);
    else
        self:UnregisterEvent("UPDATE_OVERRIDE_ACTIONBAR");
        self:UnregisterEvent("UNIT_POWER_BAR_HIDE");
        self:SetCheckFlying(false);
        QuickSlot:RequestCloseUI(QUICKSLOT_NAME);
    end
end

local QUICKSLOT_DATA = {
    buttons = {
        {actionType = "item", itemID = GOGGLE_ITEM_ID, spellID = GOGGLE_SPELL_ID},
    },
    systemName = QUICKSLOT_NAME,
    spellcastType = 1,      --Channel
};

function EL:UpdateQuickSlot()
    if self:ShouldShowQuickSlot() then
        QuickSlot:SetButtonData(QUICKSLOT_DATA);
        QuickSlot:ShowUI();
        if not GOGGLE_NAME then
            GOGGLE_NAME = C_Item.GetItemNameByID(202247);
        end
        local itemName = GOGGLE_NAME or "Technoscryers";
        QuickSlot:SetHeaderText(itemName, true);
        QuickSlot:SetDefaultHeaderText(itemName);
    else
        QuickSlot:RequestCloseUI(QUICKSLOT_NAME);
    end
end

function EL:OnEvent(event, ...)
    if event == "QUEST_ACCEPTED" then
        local questID = ...
        if questID and QUESTS[questID] then
            self:UpdateQuest()
        end

    elseif event == "QUEST_REMOVED" then
        local questID = ...
        if questID and QUESTS[questID] then
            self:UpdateQuest();
            --self:SearchQuests();
        end

    elseif event == "UPDATE_OVERRIDE_ACTIONBAR" or event == "UNIT_POWER_BAR_HIDE" then
        self:UpdateQuickSlot();
    end
end




local function EnableModule(state)
    if state then
        --EL:SearchQuests();
        EL:SetupZoneTrigger();
        EL:UpdateQuest();
    else
        EL:StopZoneTrigger();
        EL:ListenEvents(false);
    end
end

do
    local moduleData = {
        name = addon.L["ModuleName Technoscryers"],
        dbKey = "Technoscryers",
        description = addon.L["ModuleDescription Technoscryers"],
        toggleFunc = EnableModule,
        categoryID = 1002,
        uiOrder = 10,
        moduleAddedTime = 1706633000,
        categoryKeys = {"Old"},
    };

    addon.ControlCenter:AddModule(moduleData);
end