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

-------------------------------------------------------------------------------------------------
-- VARIABLES --
-------------------------------------------------------------------------------------------------
local SummonAssistant = SummonAssistant

-------------------------------------------------------------------------------------------------
-- FUNCTIONS --
-- Move frame --
-------------------------------------------------------------------------------------------------
function SummonAssistant:UpdateMoveFrame()
    local moveFrame = SummonAssistant.MoveFrame
    local onMouseEnter, onMouseExit, onMouseDown, onMouseUp = nil, nil, nil, nil
    if SummonAssistant.Global.IsMoveEnabled then
        moveFrame = SummonAssistant:GetOrCreateMoveFrame()
        onMouseEnter = SummonAssistant.MoveFrameOnEnter
        onMouseExit = SummonAssistant.MoveFrameOnExit
        onMouseDown = SummonAssistant.MoveFrameOnDown
        onMouseUp = SummonAssistant.MoveFrameOnUp
    end

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

-------------------------------------------------------------------------------------------------
-- FUNCTIONS --
-- Move handlers --
-------------------------------------------------------------------------------------------------
function SummonAssistant:GetOrCreateMoveFrame(show)
    if SummonAssistant.MoveFrame == nil then
        local newMoveFrame = SummonAssistant.WM:CreateControlFromVirtual(nil, GuiRoot, "SummonAssistant_MoveFrame")
        local targetFrame = SummonAssistant_Frame
        --Variable is used to define what savedVariable the Frame refers to.
        newMoveFrame.TargetFrame = targetFrame

        newMoveFrame["MoveFrameAnchorToTarget"] = SummonAssistant.MoveFrameAnchorToTarget
        newMoveFrame["MoveFrameGetSnapPosition"] = SummonAssistant.MoveFrameGetSnapPosition
        newMoveFrame["MoveFrameUpdateText"] = SummonAssistant.MoveFrameUpdateText
        newMoveFrame["MoveFrameUpdateColor"] = SummonAssistant.MoveFrameUpdateColor
        newMoveFrame["MoveFrameOnUpdate"] = SummonAssistant.MoveFrameOnUpdate
        newMoveFrame["MoveFrameStorePosition"] = SummonAssistant.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 = SummonAssistant.WM:CreateControl(nil, newMoveFrame, CT_BACKDROP)
        newMoveFrame.overlay:SetDrawLevel(2)
        newMoveFrame.overlay:SetAnchorFill(targetFrame)
        newMoveFrame.overlay:SetEdgeTexture("", 8, 1, 0)
        -- label
        newMoveFrame.labelCenter = SummonAssistant.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 = SummonAssistant.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)

        SummonAssistant.MoveFrame = newMoveFrame
    end
    return SummonAssistant.MoveFrame
end

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

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

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

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

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

function SummonAssistant.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 SummonAssistant.MoveFrameGetSnapPosition(value)
    return (zo_round(value / SummonAssistant.Saved.SnapSize) * SummonAssistant.Saved.SnapSize)
end

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

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

function SummonAssistant.MoveFrameUpdateColor(frame)
    local centerColor = SummonAssistant.Saved.CenterColor
    local edgeColor = SummonAssistant.Saved.EdgeColor
    local fontColor = SummonAssistant.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