--[[
Author: Jarth
Filename: MementoBar_Move.lua
]] --

-------------------------------------------------------------------------------------------------
-- VARIABLES --
-------------------------------------------------------------------------------------------------
local baseModule = MementoBar

-------------------------------------------------------------------------------------------------
-- FUNCTIONS --
-- Move frame --
-------------------------------------------------------------------------------------------------
function baseModule:UpdateMoveFrame()
    local moveFrame = baseModule.MoveFrame
    local onMouseEnter, onMouseExit, onMouseDown, onMouseUp = nil, nil, nil, nil

    if baseModule.Global.IsMoveEnabled then
        moveFrame = baseModule:GetOrCreateMoveFrame()
        onMouseEnter = baseModule.MoveFrameOnEnter
        onMouseExit = baseModule.MoveFrameOnExit
        onMouseDown = baseModule.MoveFrameOnDown
        onMouseUp = baseModule.MoveFrameOnUp
    end

    if moveFrame then
        moveFrame:SetHandler("OnMouseEnter", onMouseEnter)
        moveFrame:SetHandler("OnMouseExit", onMouseExit)
        moveFrame:SetHandler("OnMouseDown", onMouseDown)
        moveFrame:SetHandler("OnMouseUp", onMouseUp)
        moveFrame:SetHidden(not baseModule.Global.IsMoveEnabled)
        moveFrame.overlay:SetHidden(not baseModule.Global.IsMoveEnabled)
        moveFrame.labelCenter:SetHidden(not baseModule.Global.IsMoveEnabled)
        moveFrame.labelTopLeft:SetHidden(not baseModule.Global.IsMoveEnabled)
        moveFrame.MoveFrameUpdateText(moveFrame)
        moveFrame.MoveFrameUpdateColor(moveFrame)
        moveFrame.MoveFrameAnchorToTarget(moveFrame, moveFrame.TargetFrame)
    end
end

-------------------------------------------------------------------------------------------------
-- FUNCTIONS --
-- Move handlers --
-------------------------------------------------------------------------------------------------
function baseModule:GetOrCreateMoveFrame(show)
    if baseModule.MoveFrame == nil then
        local newMoveFrame = baseModule.WM:CreateControlFromVirtual(nil, GuiRoot, "MementoBar_MoveFrame")
        local targetFrame = MementoBar_Frame

        --Variable is used to define what savedVariable the Frame refers to.
        newMoveFrame.TargetFrame = targetFrame

        newMoveFrame["MoveFrameAnchorToTarget"] = baseModule.MoveFrameAnchorToTarget
        newMoveFrame["MoveFrameGetSnapPosition"] = baseModule.MoveFrameGetSnapPosition
        newMoveFrame["MoveFrameUpdateText"] = baseModule.MoveFrameUpdateText
        newMoveFrame["MoveFrameUpdateColor"] = baseModule.MoveFrameUpdateColor
        newMoveFrame["MoveFrameOnUpdate"] = baseModule.MoveFrameOnUpdate
        newMoveFrame["MoveFrameStorePosition"] = baseModule.MoveFrameStorePosition

        newMoveFrame:SetDimensions(targetFrame:GetWidth(), targetFrame:GetHeight())
        newMoveFrame:SetDrawLayer(4)
        newMoveFrame:SetParent(GuiRoot)
        newMoveFrame:SetMouseEnabled(true)
        newMoveFrame:SetMovable(true)
        newMoveFrame:SetClampedToScreen(true)

        -- overlay
        newMoveFrame.overlay = baseModule.WM:CreateControl(nil, newMoveFrame, CT_BACKDROP)
        newMoveFrame.overlay:SetDrawLevel(2)
        newMoveFrame.overlay:SetAnchorFill(targetFrame)
        newMoveFrame.overlay:SetEdgeTexture("", 8, 1, 0)
        -- label
        newMoveFrame.labelCenter = baseModule.WM:CreateControl(nil, newMoveFrame, CT_LABEL)
        newMoveFrame.labelCenter:SetDrawLevel(3)
        newMoveFrame.labelCenter:SetAnchorFill(targetFrame)
        newMoveFrame.labelCenter:SetFont("ZoFontWinH5")
        newMoveFrame.labelCenter:SetHorizontalAlignment(1)
        newMoveFrame.labelCenter:SetVerticalAlignment(1)

        newMoveFrame.labelTopLeft = baseModule.WM:CreateControl(nil, newMoveFrame, CT_LABEL)
        newMoveFrame.labelTopLeft:SetDrawLevel(3)
        newMoveFrame.labelTopLeft:SetAnchorFill(targetFrame)
        newMoveFrame.labelTopLeft:SetFont("ZoFontWinH5")
        newMoveFrame.labelTopLeft:SetHorizontalAlignment(0)
        newMoveFrame.labelTopLeft:SetVerticalAlignment(0)

        baseModule.MoveFrame = newMoveFrame
    end
    return baseModule.MoveFrame
end

function baseModule.MoveFrameOnEnter(frame)
    frame.MoveFrameUpdateText(frame, true)
end

function baseModule.MoveFrameOnExit(frame)
    frame.MoveFrameUpdateText(frame, false)
end

function baseModule.MoveFrameOnDown(frame)
    frame:SetHandler("OnUpdate", frame.MoveFrameOnUpdate)
end

function baseModule.MoveFrameOnUp(frame)
    frame.MoveFrameOnUpdate(frame)
    frame.MoveFrameUpdateText(frame, false)
    frame:SetHandler("OnUpdate", nil)
    frame.MoveFrameStorePosition(frame)
end

function baseModule.MoveFrameOnUpdate(frame)
    frame.TargetFrame:ClearAnchors()
    frame.TargetFrame:SetAnchor(TOPLeft, GuiRoot, TOPLeft, baseModule.MoveFrameGetSnapPosition(frame:GetLeft()), baseModule.MoveFrameGetSnapPosition(frame:GetTop()))
    frame.MoveFrameUpdateText(frame, true)
end

function baseModule.MoveFrameUpdateText(frame, position)
    local labelTextTopLeft = ""

    frame.labelCenter:SetText(string.format("%s,%s", frame:GetWidth(), frame:GetHeight()))

    if (position) then
        labelTextTopLeft = string.format("%s,%s", frame.TargetFrame:GetLeft(), frame.TargetFrame:GetTop())
    end

    frame.labelTopLeft:SetText(labelTextTopLeft)
end

function baseModule.MoveFrameGetSnapPosition(value)
    return (zo_round(value / baseModule.Saved.SnapSize) * baseModule.Saved.SnapSize)
end

function baseModule.MoveFrameStorePosition(frame)
    baseModule.Saved.Top = frame.MoveFrameGetSnapPosition(frame:GetTop())
    baseModule.Saved.Left = frame.MoveFrameGetSnapPosition(frame:GetLeft())
end

function baseModule.MoveFrameAnchorToTarget(frame, target)
    frame:ClearAnchors()
    frame:SetDimensions(target:GetWidth(), target:GetHeight())
    frame:SetAnchor(TOPLeft, GuiRoot, TOPLeft, target:GetLeft(), target:GetTop())
end

function baseModule.MoveFrameUpdateColor(frame)
    local centerColor = baseModule.Saved.CenterColor
    local edgeColor = baseModule.Saved.EdgeColor
    local fontColor = baseModule.Saved.FontColor

    frame.overlay:SetCenterColor(centerColor.r, centerColor.g, centerColor.b, centerColor.a)
    frame.overlay:SetEdgeColor(edgeColor.r, edgeColor.g, edgeColor.b, edgeColor.a)
    frame.labelCenter:SetColor(fontColor.r, fontColor.g, fontColor.b, fontColor.a)
    frame.labelTopLeft:SetColor(fontColor.r, fontColor.g, fontColor.b, fontColor.a)
end