local _, Cell = ...
local L = Cell.L
local F = Cell.funcs
local U = Cell.uFuncs
local P = Cell.pixelPerfectFuncs
local LCG = LibStub("LibCustomGlow-1.0")

-------------------------------------------------
-- raid tools
-------------------------------------------------
local rtPane
local resCB, resDetachCB, reportCB, buffCB, buffDropdown, sizeEditBox, buffButtons, readyPullCB, styleDropdown, pullDropdown, secEditBox, marksBarCB, marksDropdown, marksShowSoloCB, fadeOutToolsCB

local function CreateRTPane()
    rtPane = Cell.CreateTitledPane(Cell.frames.utilitiesTab, L["Raid Tools"].." |cFF777777"..L["only in group"], 422, 167)
    rtPane:SetPoint("TOPLEFT", 5, -5)
    rtPane:SetPoint("BOTTOMRIGHT", -5, 5)

    local unlockBtn = Cell.CreateButton(rtPane, L["Unlock"], "accent", {77, 17})
    unlockBtn:SetPoint("TOPRIGHT", rtPane)
    unlockBtn.locked = true
    unlockBtn:SetScript("OnClick", function(self)
        if self.locked then
            unlockBtn:SetText(L["Lock"])
            self.locked = false
            Cell.vars.showMover = true
            LCG.PixelGlow_Start(unlockBtn, {0,1,0,1}, 9, 0.25, 8, 1)
        else
            unlockBtn:SetText(L["Unlock"])
            self.locked = true
            Cell.vars.showMover = false
            LCG.PixelGlow_Stop(unlockBtn)
        end
        Cell.Fire("ShowMover", Cell.vars.showMover)
    end)

    -- battle res
    resCB = Cell.CreateCheckButton(rtPane, L["Battle Res Timer"], function(checked, self)
        CellDB["tools"]["battleResTimer"][1] = checked
        resDetachCB:SetEnabled(checked)
        Cell.Fire("UpdateTools", "battleResTimer")
    end, L["Battle Res Timer"], L["Only show during encounter or in mythic+"])
    resCB:SetPoint("TOPLEFT", rtPane, "TOPLEFT", 5, -27)
    resCB:SetEnabled(Cell.isRetail)

    resDetachCB = Cell.CreateCheckButton(rtPane, L["Detached"], function(checked, self)
        CellDB["tools"]["battleResTimer"][2] = checked
        Cell.Fire("UpdateTools", "battleResTimer")
    end)
    resDetachCB:SetPoint("TOPLEFT", resCB, "BOTTOMRIGHT", 5, -5)

    -- death report
    reportCB = Cell.CreateCheckButton(rtPane, L["Death Report"], function(checked, self)
        CellDB["tools"]["deathReport"][1] = checked
        Cell.Fire("UpdateTools", "deathReport")
    end)
    reportCB:SetPoint("TOPLEFT", resCB, "BOTTOMLEFT", 0, -35)
    reportCB:HookScript("OnEnter", function()
        CellTooltip:SetOwner(reportCB, "ANCHOR_TOPLEFT", 0, 2)
        CellTooltip:AddLine(L["Death Report"].." |cffff2727"..L["HIGH CPU USAGE"])
        CellTooltip:AddLine("|cffff2727" .. L["Disabled in battlegrounds and arenas"])
        CellTooltip:AddLine("|cffffffff" .. L["Report deaths to group"])
        CellTooltip:AddLine("|cffffffff" .. L["Use |cFFFFB5C5/cell report X|r to set the number of reports during a raid encounter"])
        CellTooltip:AddLine("|cffffffff" .. L["Current"]..": |cFFFFB5C5"..(CellDB["tools"]["deathReport"][2]==0 and L["all"] or string.format(L["first %d"], CellDB["tools"]["deathReport"][2])))
        CellTooltip:Show()
    end)
    reportCB:HookScript("OnLeave", function()
        CellTooltip:Hide()
    end)

    -- buff tracker
    buffCB = Cell.CreateCheckButton(rtPane, L["Buff Tracker"], function(checked, self)
        CellDB["tools"]["buffTracker"][1] = checked
        buffDropdown:SetEnabled(checked)
        sizeEditBox:SetEnabled(checked)
        if buffButtons then
            for buff, b in pairs(buffButtons) do
                b:SetEnabled(checked)
            end
        end
        Cell.Fire("UpdateTools", "buffTracker")
    end, L["Buff Tracker"].." |cffff7727"..L["MODERATE CPU USAGE"], L["Check if your group members need some raid buffs"],
    Cell.isRetail and L["|cffffb5c5Left-Click:|r cast the spell"] or "|cffffb5c5(Shift)|r "..L["|cffffb5c5Left-Click:|r cast the spell"],
    L["|cffffb5c5Right-Click:|r report unaffected"])
    -- L["Use |cFFFFB5C5/cell buff X|r to set icon size"],
    -- "|cffffffff" .. L["Current"]..": |cFFFFB5C5"..CellDB["tools"]["buffTracker"][3])
    buffCB:SetPoint("TOPLEFT", reportCB, "BOTTOMLEFT", 0, -15)

    buffDropdown = Cell.CreateDropdown(rtPane, 120)
    buffDropdown:SetPoint("TOPLEFT", buffCB, "BOTTOMRIGHT", 5, -5)
    buffDropdown:SetItems({
        {
            ["text"] = L["left-to-right"],
            ["value"] = "left-to-right",
            ["onClick"] = function()
                CellDB["tools"]["buffTracker"][2] = "left-to-right"
                Cell.Fire("UpdateTools", "buffTracker")
            end,
        },
        {
            ["text"] = L["right-to-left"],
            ["value"] = "right-to-left",
            ["onClick"] = function()
                CellDB["tools"]["buffTracker"][2] = "right-to-left"
                Cell.Fire("UpdateTools", "buffTracker")
            end,
        },
        {
            ["text"] = L["top-to-bottom"],
            ["value"] = "top-to-bottom",
            ["onClick"] = function()
                CellDB["tools"]["buffTracker"][2] = "top-to-bottom"
                Cell.Fire("UpdateTools", "buffTracker")
            end,
        },
        {
            ["text"] = L["bottom-to-top"],
            ["value"] = "bottom-to-top",
            ["onClick"] = function()
                CellDB["tools"]["buffTracker"][2] = "bottom-to-top"
                Cell.Fire("UpdateTools", "buffTracker")
            end,
        },
    })

    sizeEditBox = Cell.CreateEditBox(rtPane, 38, 20, false, false, true)
    sizeEditBox:SetPoint("TOPLEFT", buffDropdown, "TOPRIGHT", 5, 0)
    sizeEditBox:SetMaxLetters(3)

    sizeEditBox.confirmBtn = Cell.CreateButton(rtPane, "OK", "accent", {27, 20})
    sizeEditBox.confirmBtn:SetPoint("TOPLEFT", sizeEditBox, "TOPRIGHT", P.Scale(-1), 0)
    sizeEditBox.confirmBtn:Hide()
    sizeEditBox.confirmBtn:SetScript("OnHide", function()
        sizeEditBox.confirmBtn:Hide()
    end)
    sizeEditBox.confirmBtn:SetScript("OnClick", function()
        CellDB["tools"]["buffTracker"][3] = tonumber(sizeEditBox:GetText())
        Cell.Fire("UpdateTools", "buffTracker")
        sizeEditBox.confirmBtn:Hide()
        sizeEditBox:ClearFocus()
    end)

    sizeEditBox:SetScript("OnTextChanged", function(self, userChanged)
        if userChanged then
            local newSize = tonumber(self:GetText())
            if newSize and newSize > 0 and newSize ~= CellDB["tools"]["buffTracker"][3] then
                sizeEditBox.confirmBtn:Show()
            else
                sizeEditBox.confirmBtn:Hide()
            end
        end
    end)

    if Cell.isVanilla or Cell.isTBC or Cell.isWrath or Cell.isCata then
        buffButtons = {}

        local buffOrder, buffs = U.GetBuffTrackerInfo()

        local last
        for i, buff in ipairs(buffOrder) do
            local b = Cell.CreateButton(rtPane, "", "accent-hover", {20, 20})
            buffButtons[buff] = b

            local tex = b:CreateTexture(nil, "ARTWORK")
            P.Point(tex, "TOPLEFT", b, "TOPLEFT", 1, -1)
            P.Point(tex, "BOTTOMRIGHT", b, "BOTTOMRIGHT", -1, 1)
            tex:SetTexture(buffs[buff]["buff1"]["icon"])
            tex:SetTexCoord(0.08, 0.92, 0.08, 0.92)

            b:SetScript("OnEnable", function()
                tex:SetDesaturated(false)
            end)
            b:SetScript("OnDisable", function()
                tex:SetDesaturated(true)
            end)

            b:SetScript("OnClick", function()
                CellDB["tools"]["buffTracker"][5][buff] = not CellDB["tools"]["buffTracker"][5][buff]
                Cell.Fire("UpdateTools", "buffTracker")
                if CellDB["tools"]["buffTracker"][5][buff] then
                    b:SetAlpha(1)
                else
                    b:SetAlpha(0.25)
                end
            end)

            if last then
                b:SetPoint("TOPLEFT", last, "TOPRIGHT", 2, 0)
            else
                b:SetPoint("TOPLEFT", sizeEditBox, "TOPRIGHT", 5, 0)
            end

            last = b
        end
    end

    -- ready & pull
    readyPullCB = Cell.CreateCheckButton(rtPane, L["ReadyCheck and PullTimer buttons"], function(checked, self)
        CellDB["tools"]["readyAndPull"][1] = checked
        styleDropdown:SetEnabled(checked)
        pullDropdown:SetEnabled(checked)
        secEditBox:SetEnabled(checked)
        Cell.Fire("UpdateTools", "buttons")
    end, L["ReadyCheck and PullTimer buttons"], L["Only show when you have permission to do this"], L["readyCheckTips"], L["pullTimerTips"])
    readyPullCB:SetPoint("TOPLEFT", buffCB, "BOTTOMLEFT", 0, -43)
    Cell.RegisterForCloseDropdown(readyPullCB)

    styleDropdown = Cell.CreateDropdown(rtPane, 120)
    styleDropdown:SetPoint("TOPLEFT", readyPullCB, "BOTTOMRIGHT", 5, -5)
    styleDropdown:SetItems({
        {
            ["text"] = L["Ready"].." / "..L["Pull"],
            ["value"] = "text_button",
            ["onClick"] = function()
                CellDB["tools"]["readyAndPull"][2] = "text_button"
                Cell.Fire("UpdateTools", "readyAndPull")
            end,
        },
        {
            ["text"] = "|TInterface\\AddOns\\Cell\\Media\\Icons\\ready:14|t / |TInterface\\AddOns\\Cell\\Media\\Icons\\pull:14|t A",
            ["value"] = "icon_button_h",
            ["onClick"] = function()
                CellDB["tools"]["readyAndPull"][2] = "icon_button_h"
                Cell.Fire("UpdateTools", "readyAndPull")
            end,
        },
        {
            ["text"] = "|TInterface\\AddOns\\Cell\\Media\\Icons\\ready:14|t / |TInterface\\AddOns\\Cell\\Media\\Icons\\pull:14|t B",
            ["value"] = "icon_button_v",
            ["onClick"] = function()
                CellDB["tools"]["readyAndPull"][2] = "icon_button_v"
                Cell.Fire("UpdateTools", "readyAndPull")
            end,
        },
    })

    pullDropdown = Cell.CreateDropdown(rtPane, 109)
    pullDropdown:SetPoint("TOPLEFT", styleDropdown, "TOPRIGHT", 5, 0)
    pullDropdown:SetItems({
        {
            ["text"] = L["Default"],
            ["value"] = "default",
            ["onClick"] = function()
                CellDB["tools"]["readyAndPull"][3][1] = "default"
                Cell.Fire("UpdateTools", "readyAndPull")
            end,
        },
        {
            ["text"] = "MRT",
            ["value"] = "mrt",
            ["onClick"] = function()
                CellDB["tools"]["readyAndPull"][3][1] = "mrt"
                Cell.Fire("UpdateTools", "readyAndPull")
            end,
        },
        {
            ["text"] = "DBM",
            ["value"] = "dbm",
            ["onClick"] = function()
                CellDB["tools"]["readyAndPull"][3][1] = "dbm"
                Cell.Fire("UpdateTools", "readyAndPull")
            end,
        },
        {
            ["text"] = "BigWigs",
            ["value"] = "bw",
            ["onClick"] = function()
                CellDB["tools"]["readyAndPull"][3][1] = "bw"
                Cell.Fire("UpdateTools", "readyAndPull")
            end,
        },
    })

    secEditBox = Cell.CreateEditBox(rtPane, 38, 20, false, false, true)
    secEditBox:SetPoint("TOPLEFT", pullDropdown, "TOPRIGHT", 5, 0)
    secEditBox:SetMaxLetters(3)

    secEditBox.confirmBtn = Cell.CreateButton(rtPane, "OK", "accent", {27, 20})
    secEditBox.confirmBtn:SetPoint("TOPLEFT", secEditBox, "TOPRIGHT", P.Scale(-1), 0)
    secEditBox.confirmBtn:Hide()
    secEditBox.confirmBtn:SetScript("OnHide", function()
        secEditBox.confirmBtn:Hide()
    end)
    secEditBox.confirmBtn:SetScript("OnClick", function()
        CellDB["tools"]["readyAndPull"][3][2] = tonumber(secEditBox:GetText())
        Cell.Fire("UpdateTools", "readyAndPull")
        secEditBox.confirmBtn:Hide()
    end)

    secEditBox:SetScript("OnTextChanged", function(self, userChanged)
        if userChanged then
            local newSec = tonumber(self:GetText())
            if newSec and newSec > 0 and newSec ~= CellDB["tools"]["readyAndPull"][3][2] then
                secEditBox.confirmBtn:Show()
            else
                secEditBox.confirmBtn:Hide()
            end
        end
    end)

    -- marks bar
    marksBarCB = Cell.CreateCheckButton(rtPane, L["Marks Bar"], function(checked, self)
        CellDB["tools"]["marks"][1] = checked
        marksDropdown:SetEnabled(checked)
        marksShowSoloCB:SetEnabled(checked)
        Cell.Fire("UpdateTools", "marks")
    end, L["Marks Bar"], L["Only show when you have permission to do this"], L["marksTips"])
    marksBarCB:SetPoint("TOPLEFT", readyPullCB, "BOTTOMLEFT", 0, -43)
    Cell.RegisterForCloseDropdown(marksBarCB)

    marksDropdown = Cell.CreateDropdown(rtPane, 217)
    marksDropdown:SetPoint("TOPLEFT", marksBarCB, "BOTTOMRIGHT", 5, -5)
    marksDropdown:SetItems({
        {
            ["text"] = L["Target Marks"].." ("..L["Horizontal"]..")",
            ["value"] = "target_h",
            ["onClick"] = function()
                CellDB["tools"]["marks"][3] = "target_h"
                Cell.Fire("UpdateTools", "marks")
            end,
        },
        {
            ["text"] = L["Target Marks"].." ("..L["Vertical"]..")",
            ["value"] = "target_v",
            ["onClick"] = function()
                CellDB["tools"]["marks"][3] = "target_v"
                Cell.Fire("UpdateTools", "marks")
            end,
        },
        {
            ["text"] = L["World Marks"].." ("..L["Horizontal"]..")",
            ["value"] = "world_h",
            ["disabled"] = Cell.isVanilla or Cell.isTBC or Cell.isWrath,
            ["onClick"] = function()
                CellDB["tools"]["marks"][3] = "world_h"
                Cell.Fire("UpdateTools", "marks")
            end,
        },
        {
            ["text"] = L["World Marks"].." ("..L["Vertical"]..")",
            ["value"] = "world_v",
            ["disabled"] = Cell.isVanilla or Cell.isTBC or Cell.isWrath,
            ["onClick"] = function()
                CellDB["tools"]["marks"][3] = "world_v"
                Cell.Fire("UpdateTools", "marks")
            end,
        },
        {
            ["text"] = L["Both"].." ("..L["Horizontal"]..")",
            ["value"] = "both_h",
            ["disabled"] = Cell.isVanilla or Cell.isTBC or Cell.isWrath,
            ["onClick"] = function()
                CellDB["tools"]["marks"][3] = "both_h"
                Cell.Fire("UpdateTools", "marks")
            end,
        },
        {
            ["text"] = L["Both"].." ("..L["Vertical"]..")",
            ["value"] = "both_v",
            ["disabled"] = Cell.isVanilla or Cell.isTBC or Cell.isWrath,
            ["onClick"] = function()
                CellDB["tools"]["marks"][3] = "both_v"
                Cell.Fire("UpdateTools", "marks")
            end,
        }
    })

    marksShowSoloCB = Cell.CreateCheckButton(rtPane, L["Show Solo"], function(checked, self)
        CellDB["tools"]["marks"][2] = checked
        Cell.Fire("UpdateTools", "marks")
    end)
    marksShowSoloCB:SetPoint("TOPLEFT", marksDropdown, "BOTTOMLEFT", 0, -8)

    -- fadeOut
    fadeOutToolsCB = Cell.CreateCheckButton(rtPane, L["Fade Out These Buttons"], function(checked, self)
        CellDB["tools"]["fadeOut"] = checked
        Cell.Fire("UpdateTools", "fadeOut")
    end)
    fadeOutToolsCB:SetPoint("TOPLEFT", marksBarCB, "BOTTOMLEFT", 0, -70)

    local region = CreateFrame("Frame", nil, rtPane)
    region:SetPoint("TOPLEFT", buffCB, -5, 5)
    region:SetPoint("BOTTOM", marksShowSoloCB, 0, -5)
    region:SetPoint("RIGHT", -5, 0)

    fadeOutToolsCB:HookScript("OnEnter", function()
        LCG.PixelGlow_Start(region, Cell.GetAccentColorTable(1), 27, 0.1, 17, 1)
    end)
    fadeOutToolsCB:HookScript("OnLeave", function()
        LCG.PixelGlow_Stop(region)
    end)
end

-------------------------------------------------
-- show
-------------------------------------------------
local init
local function ShowUtilitySettings(which)
    if which == "raidTools" then
        if not init then
            CreateRTPane()
            F.ApplyCombatProtectionToFrame(rtPane, -4, 4, 4, -4)
        end

        rtPane:Show()

        -- if init then return end
        init = true

        -- raid tools
        resCB:SetChecked(CellDB["tools"]["battleResTimer"][1])
        resDetachCB:SetChecked(CellDB["tools"]["battleResTimer"][2])
        resDetachCB:SetEnabled(Cell.isRetail and CellDB["tools"]["battleResTimer"][1])
        reportCB:SetChecked(CellDB["tools"]["deathReport"][1])

        buffCB:SetChecked(CellDB["tools"]["buffTracker"][1])
        buffDropdown:SetSelectedValue(CellDB["tools"]["buffTracker"][2])
        sizeEditBox:SetText(CellDB["tools"]["buffTracker"][3])
        Cell.SetEnabled(CellDB["tools"]["buffTracker"][1], buffDropdown, sizeEditBox)
        if buffButtons then
            for buff, b in pairs(buffButtons) do
                b:SetEnabled(CellDB["tools"]["buffTracker"][1])
                b:SetAlpha(CellDB["tools"]["buffTracker"][5][buff] and 1 or 0.25)
            end
        end

        readyPullCB:SetChecked(CellDB["tools"]["readyAndPull"][1])
        styleDropdown:SetSelectedValue(CellDB["tools"]["readyAndPull"][2])
        pullDropdown:SetSelectedValue(CellDB["tools"]["readyAndPull"][3][1])
        secEditBox:SetText(CellDB["tools"]["readyAndPull"][3][2])
        Cell.SetEnabled(CellDB["tools"]["readyAndPull"][1], styleDropdown, pullDropdown, secEditBox)

        marksDropdown:SetEnabled(CellDB["tools"]["marks"][1])
        marksBarCB:SetChecked(CellDB["tools"]["marks"][1])
        marksDropdown:SetSelectedValue(CellDB["tools"]["marks"][3])
        marksShowSoloCB:SetChecked(CellDB["tools"]["marks"][2])

        fadeOutToolsCB:SetChecked(CellDB["tools"]["fadeOut"])

    elseif init then
        rtPane:Hide()
    end
end
Cell.RegisterCallback("ShowUtilitySettings", "RaidTools_ShowUtilitySettings", ShowUtilitySettings)