local _, Cell = ...
local L = Cell.L
local F = Cell.funcs
local P = Cell.pixelPerfectFuncs

local textureSelector, scrollFrame, confirmBtn, currentTexturePath
local LoadTextures
local buttons = {}
local selectedPath, textureNum

local function CreateTextureSelector()
    if not Cell.frames.indicatorsTab.mask then
        Cell.CreateMask(Cell.frames.indicatorsTab, nil, {1, -1, -1, 1})
        Cell.frames.indicatorsTab.mask:Hide()
    end

    textureSelector = CreateFrame("Frame", "CellOptionsFrame_TextureSelector", Cell.frames.indicatorsTab, "BackdropTemplate")
    Cell.StylizeFrame(textureSelector, nil, Cell.GetAccentColorTable())
    textureSelector:SetFrameLevel(Cell.frames.indicatorsTab:GetFrameLevel() + 50)
    textureSelector:SetPoint("TOPLEFT", P.Scale(1), -100)
    textureSelector:SetPoint("TOPRIGHT", P.Scale(-1), -100)
    textureSelector:SetHeight(235)

    -- add
    local addEB = Cell.CreateEditBox(textureSelector, 355, 20)
    addEB:SetPoint("TOPLEFT", 5, -5)
    addEB.tip = addEB:CreateFontString(nil, "OVERLAY", "CELL_FONT_WIDGET")
    addEB.tip:SetTextColor(0.4, 0.4, 0.4, 1)
    addEB.tip:SetText("Interface\\... (tga|blp|png|jpg)")
    addEB.tip:SetPoint("LEFT", 5, 0)
    addEB:SetScript("OnEditFocusGained", function()
        addEB:HighlightText()
        addEB.tip:Hide()
    end)
    addEB:SetScript("OnEditFocusLost", function()
        addEB:HighlightText(0, 0)
        if addEB:GetText() == "" then
            addEB.tip:Show()
        end
    end)

    local addBtn = Cell.CreateButton(textureSelector, L["Add"], "accent", {66, 20})
    addBtn:SetPoint("TOPLEFT", addEB, "TOPRIGHT", -1, 0)
    addBtn:SetScript("OnClick", function()
        local path = strtrim(addEB:GetText())
        -- check whether exists
        if path ~= "" and not F.TContains(CellDB["customTextures"], path) then
            -- update db
            tinsert(CellDB["customTextures"], path)
            -- reload
            LoadTextures()
        end
    end)

    -- cancel
    local cancelBtn = Cell.CreateButton(textureSelector, L["Cancel"], "red", {70, 20})
    cancelBtn:SetPoint("BOTTOMRIGHT")
    cancelBtn:SetBackdropBorderColor(unpack(Cell.GetAccentColorTable()))
    cancelBtn:SetScript("OnClick", function()
        textureSelector:Hide()
    end)

    -- OK
    confirmBtn = Cell.CreateButton(textureSelector, L["Confirm"], "green", {70, 20})
    confirmBtn:SetPoint("BOTTOMRIGHT", cancelBtn, "BOTTOMLEFT", P.Scale(1), 0)
    confirmBtn:SetBackdropBorderColor(unpack(Cell.GetAccentColorTable()))

    -- textures
    local texFrame = Cell.CreateFrame(nil, textureSelector)
    texFrame:Show()
    texFrame:SetPoint("TOPLEFT", addEB, "BOTTOMLEFT", 0, -10)
    texFrame:SetPoint("BOTTOMRIGHT", -5, 30)
    scrollFrame = Cell.CreateScrollFrame(texFrame, -5, 5)
    scrollFrame:SetScrollStep(55)

    -- current path
    currentTexturePath = textureSelector:CreateFontString(nil, "OVERLAY", "CELL_FONT_WIDGET")
    currentTexturePath:SetPoint("BOTTOMLEFT", 5, 5)
    currentTexturePath:SetPoint("RIGHT", confirmBtn, "LEFT", -5, 0)
    currentTexturePath:SetJustifyH("LEFT")
    currentTexturePath:SetWordWrap(false)

    -- OnHide
    textureSelector:SetScript("OnHide", function()
        Cell.frames.indicatorsTab.mask:Hide()
        textureSelector:Hide()
        addEB.tip:Show()
        addEB:SetText("")
    end)
end

-------------------------------------------------
-- load
-------------------------------------------------
LoadTextures = function()
    scrollFrame:Reset()

    local builtIns, textures = F.GetTextures()
    textureNum = #textures

    -- create buttons
    for i, path in pairs(textures) do
        local b = buttons[i]
        if not b then
            b = CreateFrame("Button", nil, scrollFrame.content, "BackdropTemplate")
            buttons[i] = b
            P.Size(b, 50, 50)
            b:SetBackdrop({bgFile = Cell.vars.whiteTexture, edgeFile = Cell.vars.whiteTexture, edgeSize = P.Scale(1)})
            b:SetBackdropColor(0.115, 0.115, 0.115, 1)
            b:SetBackdropBorderColor(0, 0, 0, 1)
            b:SetScript("OnEnter", function()
                b:SetBackdropBorderColor(unpack(Cell.GetAccentColorTable()))
                b.delBtn:SetBackdropBorderColor(unpack(Cell.GetAccentColorTable()))

                F.FitWidth(currentTexturePath, b.path, "right")
            end)
            b:SetScript("OnLeave", function()
                currentTexturePath:SetText("")
                if selectedPath ~= b.path then
                    b:SetBackdropBorderColor(0, 0, 0, 1)
                    b.delBtn:SetBackdropBorderColor(0, 0, 0, 1)
                end
            end)

            b.tex = b:CreateTexture(nil, "ARTWORK")
            b.tex:SetPoint("TOPLEFT", 5, -5)
            b.tex:SetPoint("BOTTOMRIGHT", -5, 5)

            b.delBtn = Cell.CreateButton(b, "×", "red", {13, 13})
            b.delBtn:GetFontString():SetFont("Interface\\AddOns\\Cell\\Media\\Fonts\\font.ttf", 10, "")
            b.delBtn:SetPoint("TOPRIGHT")
            b.delBtn:HookScript("OnEnter", function()
                b:GetScript("OnEnter")(b)
            end)
            b.delBtn:HookScript("OnLeave", function()
                b:GetScript("OnLeave")(b)
            end)
            b.delBtn:SetScript("OnClick", function()
                -- update db
                F.TRemove(CellDB["customTextures"], b.path)
                -- reload
                LoadTextures()
            end)
        end

        b.path = path

        -- point
        b:ClearAllPoints()
        b:SetParent(scrollFrame.content)
        b:Show()
        if i == 1 then
            b:SetPoint("TOPLEFT", 5, 0)
        elseif i % 7 == 1 then
            b:SetPoint("TOPLEFT", buttons[i-7], "BOTTOMLEFT", 0, -5)
        else
            b:SetPoint("TOPLEFT", buttons[i-1], "TOPRIGHT", 5, 0)
        end

        -- texture
        if strfind(strlower(path), "^interface") then
            b.tex:SetTexture(path)
        else
            b.tex:SetAtlas(path)
        end

        -- onclick
        b:SetScript("OnClick", function(self, button)
            selectedPath = path
            for j, bb in pairs(buttons) do
                if i ~= j then
                    bb:SetBackdropBorderColor(0, 0, 0, 1)
                end
            end
        end)

        -- delete
        if i > builtIns then
            b.delBtn:Show()
        else
            b.delBtn:Hide()
        end

        -- highlight selected
        if selectedPath == path then
            b:SetBackdropBorderColor(unpack(Cell.GetAccentColorTable()))
        else
            b:SetBackdropBorderColor(0, 0, 0, 1)
        end
    end

    -- hide others
    for i = textureNum+1, #buttons do
        buttons[i]:SetParent(nil)
        buttons[i]:ClearAllPoints()
        buttons[i]:Hide()
    end

    -- update height
    scrollFrame:SetContentHeight(50, math.ceil(textureNum/7), 5)
end

-------------------------------------------------
-- functions
-------------------------------------------------
function F.ShowTextureSelector(selected, callback)
    if not textureSelector then
        CreateTextureSelector()
    end

    Cell.frames.indicatorsTab.mask:Show()
    textureSelector:Show()

    selectedPath = selected
    LoadTextures()
    confirmBtn:SetScript("OnClick", function()
        textureSelector:Hide()
        if callback then callback(selectedPath) end
    end)
end