local Srendarr = _G['Srendarr']
local L = Srendarr:GetLocale()

local ICON_SIZE = Srendarr.ICON_SIZE
local math_abs  = math.abs
local math_rad  = math.rad

local AuraAnchor = {}

local function GetEdgeRelativePosition(self)
    local left, top     = self :GetLeft(), self :GetTop()
    local right, bottom = self :GetRight(), self :GetBottom()
    local rootW, rootH  = GuiRoot:GetWidth(), GuiRoot:GetHeight()
    local point         = 0
    local x, y

    if (left < (rootW - right) and left < math_abs((left + right) / 2 - rootW / 2)) then
        x, point = left, 2 -- 'LEFT'
    elseif ((rootW - right) < math_abs((left + right) / 2 - rootW / 2)) then
        x, point = right - rootW, 8 -- 'RIGHT'
    else
        x, point = (left + right) / 2 - rootW / 2, 0
    end

    if (bottom < (rootH - top) and bottom < math_abs((bottom + top) / 2 - rootH / 2)) then
        y, point = top, point + 1 -- 'TOP|TOPLEFT|TOPRIGHT'
    elseif ((rootH - top) < math_abs((bottom + top) / 2 - rootH / 2)) then
        y, point = bottom - rootH, point + 4 -- 'BOTTOM|BOTTOMLEFT|BOTTOMRIGHT'
    else
        y = (bottom + top) / 2 - rootH / 2
    end

    point = (point == 0) and 128 or point -- 'CENTER'

    return point, x, y
end

local function AddControl(parent, cType, level)
    local c = WINDOW_MANAGER:CreateControl(nil, parent, cType)
    c:SetDrawLayer(DL_OVERLAY)
    c:SetDrawLevel(level)
    return c, c
end

local function BuildDragOverlay(self)
    local ctrl

    local drag = AddControl(self, CT_TEXTURE, 3)
    drag:SetDimensions(ICON_SIZE, ICON_SIZE)
    drag:SetAnchor(CENTER)
    drag:SetTexture([[/esoui/art/actionbar/abilityself64_up.dds]]) -- border (and root)
    -- OVERLAY ICON
    drag.icon, ctrl = AddControl(drag, CT_TEXTURE, 2)
    ctrl:SetDimensions(ICON_SIZE, ICON_SIZE)
    ctrl:SetAnchor(CENTER)
    ctrl:SetTexture[[/esoui/art/icons/ability_restorationstaff_001.dds]]
    drag.flash, ctrl = AddControl(drag, CT_TEXTURE, 4)
    ctrl:SetDimensions(ICON_SIZE, ICON_SIZE)
    ctrl:SetAnchor(CENTER)
    ctrl:SetTexture([[/esoui/art/actionbar/actionslot_toggledon.dds]])
    ctrl:SetColor(1, 0.82, 0)
    -- LABEL
    drag.label, ctrl = AddControl(drag, CT_LABEL, 4)
    ctrl:SetFont('ZoFontWinH5')
    ctrl:SetHeight(20)
    ctrl:SetVerticalAlignment(1)
    ctrl:SetHorizontalAlignment(1)
    ctrl:SetColor(0.64, 0.52, 0, 1)
    ctrl:SetText(
        (self.k_id == 1) and L.DragLabel_BuffShort or
        (self.k_id == 2) and L.DragLabel_BuffLong or
        (self.k_id == 3) and L.DragLabel_Debuff or
        (self.k_id == 4) and L.DragLabel_Target or
        (self.k_id == 5) and L.DragLabel_Target_Debuff
    )
    -- GROWTH ARROW
    drag.growth, ctrl = AddControl(drag, CT_TEXTURE, 4)
    drag.growth:SetDimensions(32, 32)
    drag.growth:SetTexture([[/esoui/art/ava/ava_keepstatus_icon_timetoupgrade.dds]])
    -- EXTRA GROWTH ARROW
    drag.growthExtra, ctrl = AddControl(drag, CT_TEXTURE, 4)
    drag.growthExtra:SetDimensions(32, 32)
    drag.growthExtra:SetTexture([[/esoui/art/ava/ava_keepstatus_icon_timetoupgrade.dds]])
    -- ANIMATION
    drag.timeline = ANIMATION_MANAGER:CreateTimeline()
    drag.timeline:SetPlaybackType(ANIMATION_PLAYBACK_LOOP, -1)
    local anim
    anim = drag.timeline:InsertAnimation(ANIMATION_SCALE, drag.growth, 0)
    anim:SetDuration(750)
    anim:SetEasingFunction(ZO_LinearEase)
    anim:SetScaleValues(1, 1.25)
    anim = drag.timeline:InsertAnimation(ANIMATION_SCALE, drag.growth, 750)
    anim:SetDuration(750)
    anim:SetEasingFunction(ZO_LinearEase)
    anim:SetScaleValues(1.25, 1)
    anim = drag.timeline:InsertAnimation(ANIMATION_SCALE, drag.growthExtra, 0)
    anim:SetDuration(750)
    anim:SetEasingFunction(ZO_LinearEase)
    anim:SetScaleValues(1, 1.25)
    anim = drag.timeline:InsertAnimation(ANIMATION_SCALE, drag.growthExtra, 750)
    anim:SetDuration(750)
    anim:SetEasingFunction(ZO_LinearEase)
    anim:SetScaleValues(1.25, 1)
    anim = drag.timeline:InsertAnimation(ANIMATION_COLOR, drag.label, 0)
    anim:SetDuration(750)
    anim:SetEasingFunction(ZO_LinearEase)
    anim:SetColorValues(0.64, 0.52, 0, 1, 1, 0.82, 0, 1)
    anim = drag.timeline:InsertAnimation(ANIMATION_COLOR, drag.label, 750)
    anim:SetDuration(750)
    anim:SetEasingFunction(ZO_LinearEase)
    anim:SetColorValues(1, 0.82, 0, 1, 0.64, 0.52, 0, 1)
    anim = drag.timeline:InsertAnimation(ANIMATION_ALPHA, drag.flash, 0)
    anim:SetDuration(750)
    anim:SetEasingFunction(ZO_LinearEase)
    anim:SetAlphaValues(0.4, 1)
    anim = drag.timeline:InsertAnimation(ANIMATION_ALPHA, drag.flash, 750)
    anim:SetDuration(750)
    anim:SetEasingFunction(ZO_LinearEase)
    anim:SetAlphaValues(1, 0.4)

    self.drag = drag
end

local function ConfigureDragOverlay(self)
    local drag = self.drag

    if (not drag) then return end

    local db = Srendarr.db.frames[self.k_id]

    drag.growth:ClearAnchors()
    drag.growthExtra:ClearAnchors()
    drag.label:ClearAnchors()

    if (self.k_id == 1) then
        if (Srendarr.db.combineBuff) then
            drag.label:SetText(L.DragLabel_BuffAll)
        else
            drag.label:SetText(L.DragLabel_BuffShort)
        end
    end

    if (db.auraGrowth == 'LEFT' or db.auraGrowth == 'LEFTCENTER') then
        drag.label:SetAnchor(RIGHT, drag, LEFT, -4, 0)
        drag.growth:SetAnchor(RIGHT, drag.label, LEFT, -2, 0)
        drag.growth:SetTextureRotation(math_rad(90))
    elseif (db.auraGrowth == 'RIGHT' or db.auraGrowth == 'RIGHTCENTER') then
        drag.label:SetAnchor(LEFT, drag, RIGHT, 4, 0)
        drag.growth:SetAnchor(LEFT, drag.label, RIGHT, 4, 0)
        drag.growth:SetTextureRotation(math_rad(270))
    elseif (db.auraGrowth == 'UP') then
        drag.label:SetAnchor(BOTTOM, drag, TOP, 0, -4)
        drag.growth:SetAnchor(BOTTOM, drag.label, TOP, 0, -2)
        drag.growth:SetTextureRotation(0)
    else -- down
        drag.label:SetAnchor(TOP, drag, BOTTOM, 0, 4)
        drag.growth:SetAnchor(TOP, drag.label, BOTTOM, 0, 2)
        drag.growth:SetTextureRotation(math_rad(180))
    end

    if (db.auraGrowth == 'LEFTCENTER') then
        drag.growthExtra:SetHidden(false)
        drag.growthExtra:SetAnchor(LEFT, drag, RIGHT, 4, 0)
        drag.growthExtra:SetTextureRotation(math_rad(270))
    elseif (db.auraGrowth == 'RIGHTCENTER') then
        drag.growthExtra:SetHidden(false)
        drag.growthExtra:SetAnchor(RIGHT, drag, LEFT, -4, 0)
        drag.growthExtra:SetTextureRotation(math_rad(90))
    else
        drag.growthExtra:SetHidden(true)
    end
end

local function EnableDrag(self)
    if ((self.k_id == 2 and Srendarr.db.combineBuff) or (self.k_id == 4 and not Srendarr.db.showTargetAuras) or (self.k_id == 5 and not Srendarr.db.showTargetAurasDebuff)) then return end -- no overlay if not being used

    if (not self.drag) then
        BuildDragOverlay(self)
    end

    self:SetMouseEnabled(true)
    self:SetMovable(true)
    self:ConfigureDragOverlay()
    self.drag:SetHidden(false)
    self.drag.timeline:PlayFromStart()

    Srendarr.auraFrames[self.k_id]:SetAurasNonInteractive()
end

local function DisableDrag(self)
    self:SetMouseEnabled(false)
    self:SetMovable(false)

    if (self.drag) then
        self.drag:SetHidden(true)
        self.drag.timeline:Stop()
        self.drag.growth:SetScale(1)
        self.drag.label:SetColor(0.64, 0.52, 0, 1)
        self.drag.flash:SetAlpha(0.4)
    end

    Srendarr.auraFrames[self.k_id]:ConfigureAllAuras()
end

function AuraAnchor:New(id, point, x, y, scale)
    local frame = CreateControl(nil, GuiRoot, CT_TOPLEVELCONTROL)
    frame:SetKeyboardEnabled(false)
    frame:SetMouseEnabled(false)
    frame:SetMovable(false)
    frame:SetClampedToScreen(true)
    frame:SetDimensions(ICON_SIZE, ICON_SIZE)
    frame:ClearAnchors()
    frame:SetAnchor(point, GuiRoot, point, x, y)
    frame:SetScale(scale)

    frame.k_id = id

    frame:SetHandler('OnReceiveDrag', function(af)
        af:StartMoving()
    end)
    frame:SetHandler('OnMouseUp', function(af)
        af:StopMovingOrResizing()
        local point, x, y = GetEdgeRelativePosition(af)
        Srendarr.db.frames[af.k_id].anchor.point    = point
        Srendarr.db.frames[af.k_id].anchor.x        = x
        Srendarr.db.frames[af.k_id].anchor.y        = y
    end)

    frame['EnableDrag']             = EnableDrag
    frame['DisableDrag']            = DisableDrag
    frame['ConfigureDragOverlay']   = ConfigureDragOverlay

    return frame
end

Srendarr.AuraAnchor = AuraAnchor