--[[-------------------------------------------------------------------------
-- BlizzardFrames.lua
--
-- This file contains the definitions of the blizzard frame integration
-- options. These settings will not apply until the user interface is
-- reloaded.
--
-- Events registered:
--   * ADDON_LOADED - To watch for loading of the ArenaUI
-------------------------------------------------------------------------]]--

local addonName, addon = ...
local L = addon.L

--[[---------------------------------------------------------------------------
--  Options panel definition
---------------------------------------------------------------------------]]--

local panel = CreateFrame("Frame")
panel.name = "Blizzard Frame Options"
panel.parent = addonName

addon.optpanels["BLIZZFRAMES"] = panel

panel:SetScript("OnShow", function(self)
    if not panel.initialized then
        panel:CreateOptions()
        panel.refresh()
    end
end)

local function make_checkbox(name, label)
    local frame = CreateFrame("CheckButton", "CliqueOptionsBlizzFrame" .. name, panel, "UICheckButtonTemplate")
    frame.text = _G[frame:GetName() .. "Text"]
    frame.type = "checkbox"
    frame.text:SetText(label)
    return frame
end

local function make_label(name, template)
    local label = panel:CreateFontString("OVERLAY", "CliqueOptionsBlizzFrame" .. name, template)
    label:SetWidth(panel:GetWidth())
    label:SetJustifyH("LEFT")
    label.type = "label"
    return label
end

function panel:CreateOptions()
    panel.initialized = true

    local bits = {}
    self.intro = make_label("Intro", "GameFontHighlightSmall")
    self.intro:SetText(L["These options control whether or not Clique automatically registers certain Blizzard-created frames for binding. Changes made to these settings will not take effect until the user interface is reloaded."])
    self.intro:SetPoint("RIGHT")
    self.intro:SetJustifyV("TOP")
    self.intro:SetHeight(40)

    self.PlayerFrame = make_checkbox("PlayerFrame", L["Player frame"])
    self.PetFrame = make_checkbox("PetFrame", L["Player's pet frame"])
    self.TargetFrame = make_checkbox("TargetFrame", L["Player's target frame"])
    self.TargetFrameToT = make_checkbox("TargetFrameToT", L["Target of target frame"])
    self.FocusFrame = make_checkbox("FocusFrame", L["Player's focus frame"])
    self.FocusFrameToT = make_checkbox("FocusFrameToT", L["Target of focus frame"])
    self.arena = make_checkbox("ArenaEnemy", L["Arena enemy frames"])
    self.party = make_checkbox("Party", L["Party member frames"])
    self.compactraid = make_checkbox("CompactRaid", L["Compact raid frames"])
    --self.compactparty = make_checkbox("CompactParty", L["Compact party frames"])
    self.boss = make_checkbox("BossTarget", L["Boss target frames"])

    table.insert(bits, self.intro)
    table.insert(bits, self.PlayerFrame)
    table.insert(bits, self.PetFrame)
    table.insert(bits, self.TargetFrame)
    table.insert(bits, self.FocusFrame)
    table.insert(bits, self.FocusFrameToT)

    -- Group these together
    bits[1]:SetPoint("TOPLEFT", 5, -5)

    for i = 2, #bits, 1 do
        bits[i]:SetPoint("TOPLEFT", bits[i-1], "BOTTOMLEFT", 0, 0)
    end

    local last = bits[#bits]

    table.wipe(bits)
    table.insert(bits, self.arena)
    table.insert(bits, self.party)
    table.insert(bits, self.compactraid)
    --table.insert(bits, self.compactparty)
    table.insert(bits, self.boss)

    bits[1]:SetPoint("TOPLEFT", last, "BOTTOMLEFT", 0, -15)

    for i = 2, #bits, 1 do
        bits[i]:SetPoint("TOPLEFT", bits[i-1], "BOTTOMLEFT", 0, 0)
    end
end

function panel.refresh()
    local opt = addon.settings.blizzframes

    panel.PlayerFrame:SetChecked(opt.PlayerFrame)
    panel.PetFrame:SetChecked(opt.PetFrame)
    panel.TargetFrame:SetChecked(opt.TargetFrame)
    panel.FocusFrame:SetChecked(opt.FocusFrame)
    panel.FocusFrameToT:SetChecked(opt.FocusFrameToT)
    panel.arena:SetChecked(opt.arena)
    panel.party:SetChecked(opt.party)
    panel.compactraid:SetChecked(opt.compactraid)
    --panel.compactparty:SetChecked(opt.compactparty)
    panel.boss:SetChecked(opt.boss)
end

function panel.okay()
    local opt = addon.settings.blizzframes
    opt.PlayerFrame = not not panel.PlayerFrame:GetChecked()
    opt.PetFrame = not not panel.PetFrame:GetChecked()
    opt.TargetFrame = not not panel.TargetFrame:GetChecked()
    opt.FocusFrame = not not panel.FocusFrame:GetChecked()
    opt.FocusFrameToT = not not panel.FocusFrameToT:GetChecked()
    opt.arena = not not panel.arena:GetChecked()
    opt.party = not not panel.party:GetChecked()
    opt.compactraid = not not panel.compactraid:GetChecked()
    --opt.compactparty = not not panel.compactparty:GetChecked()
    opt.boss = not not panel.boss:GetChecked()
end

InterfaceOptions_AddCategory(panel, addon.optpanels.ABOUT)

--[[---------------------------------------------------------------------------
--  Blizzard Frame integration code
---------------------------------------------------------------------------]]--
local function enable(frame)
    if type(frame) == "string" then
        local frameName = frame
        frame = _G[frameName]
        if not frame then
            print("Clique: error registering frame: " .. tostring(frameName))
        end
    end

    if frame then
        ClickCastFrames[frame] = true
    end
end

function addon:Enable_BlizzCompactUnitFrames()
    if not addon.settings.blizzframes.compactraid then
        return
    end

    hooksecurefunc("CompactUnitFrame_SetUpFrame", function(frame, ...)
        local name = frame and frame.GetName and frame:GetName()
        for i = 1, 3 do
            local buff = _G[name .. "Buff" .. i]
            local debuff = _G[name .. "Debuff" .. i]
            local dispel = _G[name .. "DispelDebuff" .. i]

            if buff then enable(buff) end
            if debuff then enable(debuff) end
            if dispel then enable(dispel) end
        end
        enable(frame)
    end)
end

function addon:Enable_BlizzArenaFrames()
    if not addon.settings.blizzframes.arena then
        return
    end

    local frames = {
        "ArenaEnemyFrame1",
        "ArenaEnemyFrame2",
        "ArenaEnemyFrame3",
        "ArenaEnemyFrame4",
        "ArenaEnemyFrame5",
    }
    for idx, frame in ipairs(frames) do
        enable(frame)
    end
end

function addon:Enable_BlizzSelfFrames()
    local frames = {
        "PlayerFrame",
        "PetFrame",
        "TargetFrame",
        "TargetFrameToT",
        "FocusFrame",
        "FocusFrameToT",
    }
    for idx, frame in ipairs(frames) do
        if addon.settings.blizzframes[frame] then
            enable(frame)
        end
    end
end

function addon:Enable_BlizzPartyFrames()
    if not addon.settings.blizzframes.party then
        return
    end

    local frames = {
        "PartyMemberFrame1",
		"PartyMemberFrame2",
		"PartyMemberFrame3",
		"PartyMemberFrame4",
        --"PartyMemberFrame5",
		"PartyMemberFrame1PetFrame",
		"PartyMemberFrame2PetFrame",
		"PartyMemberFrame3PetFrame",
        "PartyMemberFrame4PetFrame",
        --"PartyMemberFrame5PetFrame",
    }
    for idx, frame in ipairs(frames) do
        enable(frame)
    end
end

-- function addon:Enable_BlizzCompactParty()
--     if not addon.settings.blizzframes.compactparty then
--         return
--     end
--
--     local frames = {
--         --"CompactPartyFrameMemberSelf",
--         --"CompactPartyFrameMemberSelfBuff1",
--         --"CompactPartyFrameMemberSelfBuff2",
--         --"CompactPartyFrameMemberSelfBuff3",
--         --"CompactPartyFrameMemberSelfDebuff1",
--         --"CompactPartyFrameMemberSelfDebuff2",
--         --"CompactPartyFrameMemberSelfDebuff3",
--         "CompactPartyFrameMember1",
--         "CompactPartyFrameMember1Buff1",
--         "CompactPartyFrameMember1Buff2",
--         "CompactPartyFrameMember1Buff3",
--         "CompactPartyFrameMember1Debuff1",
--         "CompactPartyFrameMember1Debuff2",
--         "CompactPartyFrameMember1Debuff3",
--         "CompactPartyFrameMember1DispelDebuff1",
--         "CompactPartyFrameMember1DispelDebuff2",
--         "CompactPartyFrameMember1DispelDebuff2",
--         "CompactPartyFrameMember2",
--         "CompactPartyFrameMember2Buff1",
--         "CompactPartyFrameMember2Buff2",
--         "CompactPartyFrameMember2Buff3",
--         "CompactPartyFrameMember2Debuff1",
--         "CompactPartyFrameMember2Debuff2",
--         "CompactPartyFrameMember2Debuff3",
--         "CompactPartyFrameMember2DispelDebuff1",
--         "CompactPartyFrameMember2DispelDebuff2",
--         "CompactPartyFrameMember2DispelDebuff2",
--         "CompactPartyFrameMember3",
--         "CompactPartyFrameMember3Buff1",
--         "CompactPartyFrameMember3Buff2",
--         "CompactPartyFrameMember3Buff3",
--         "CompactPartyFrameMember3Debuff1",
--         "CompactPartyFrameMember3Debuff2",
--         "CompactPartyFrameMember3Debuff3",
--         "CompactPartyFrameMember3DispelDebuff1",
--         "CompactPartyFrameMember3DispelDebuff2",
--         "CompactPartyFrameMember3DispelDebuff2",
--         "CompactPartyFrameMember4",
--         "CompactPartyFrameMember4Buff1",
--         "CompactPartyFrameMember4Buff2",
--         "CompactPartyFrameMember4Buff3",
--         "CompactPartyFrameMember4Debuff1",
--         "CompactPartyFrameMember4Debuff2",
--         "CompactPartyFrameMember4Debuff3",
--         "CompactPartyFrameMember4DispelDebuff1",
--         "CompactPartyFrameMember4DispelDebuff2",
--         "CompactPartyFrameMember4DispelDebuff2",
--         "CompactPartyFrameMember5",
--         "CompactPartyFrameMember5Buff1",
--         "CompactPartyFrameMember5Buff2",
--         "CompactPartyFrameMember5Buff3",
--         "CompactPartyFrameMember5Debuff1",
--         "CompactPartyFrameMember5Debuff2",
--         "CompactPartyFrameMember5Debuff3",
--         "CompactPartyFrameMember5DispelDebuff1",
--         "CompactPartyFrameMember5DispelDebuff2",
--         "CompactPartyFrameMember5DispelDebuff2",
--         "CompactPartyFramePet1",
--         "CompactPartyFramePet2",
--         "CompactPartyFramePet3",
--         "CompactPartyFramePet4",
--         "CompactPartyFramePet5",
--     }
--     for idx, frame in ipairs(frames) do
--         enable(frame)
--     end
-- end

function addon:Enable_BlizzBossFrames()
    if not addon.settings.blizzframes.boss then
        return
    end

    local frames = {
        "Boss1TargetFrame",
        "Boss2TargetFrame",
        "Boss3TargetFrame",
        "Boss4TargetFrame",
    }
    for idx, frame in ipairs(frames) do
        enable(frame)
    end
end


function addon:EnableBlizzardFrames()
    self:Enable_BlizzCompactUnitFrames()
    self:Enable_BlizzSelfFrames()
    self:Enable_BlizzPartyFrames()
    self:Enable_BlizzBossFrames()

    local waitForAddon = {}

    if IsAddOnLoaded("Blizzard_ArenaUI") then
        self:Enable_BlizzArenaFrames()
    else
        waitForAddon["Blizzard_ArenaUI"] = "Enable_BlizzArenaFrames"
    end

    if next(waitForAddon) then
        local frame = CreateFrame("Frame")
        frame:RegisterEvent("ADDON_LOADED")
        frame:SetScript("OnEvent", function(frame, event, ...)
            if waitForAddon[...] then
                self[waitForAddon[...]](self)
            end
        end)

        if not next(waitForAddon) then
            frame:UnregisterEvent("ADDON_LOADED")
            frame:SetScript("OnEvent", nil)
        end
    end
end
