-- ========================================================================= --
--                              SylingTracker                                --
--           https://www.curseforge.com/wow/addons/sylingtracker             --
--                                                                           --
--                               Repository:                                 --
--                   https://github.com/Skamer/SylingTracker                 --
--                                                                           --
-- ========================================================================= --
Syling                    "SylingTracker.UI.HelperWindow"                    ""
-- ========================================================================= --
namespace                             "SLT"
-- ========================================================================= --
export {
  FetchFontObject                     = Fonts.FetchFontObject
}
-- ========================================================================= --
local DESCRIPTION_TEXT_FORMAT = "Wowhead may help you to find your way for completing this %s"
local ACHIEVEMENT_TEXT = "achievement"
local QUEST_TEXT = "quest"
local WOWHEAD_LINK_FORMAT = "https://www.wowhead.com/%s=%i"
-- ========================================================================= --
-- @TODO: Move "SLTEditBox" in a its own file or a better place.
-- ========================================================================= --
class "SLTEditBox" (function(_ENV)
  inherit "EditBox"
  -----------------------------------------------------------------------------
  --                               Methods                                   --
  -----------------------------------------------------------------------------
  function SetSharedMediaFont(self, font)
    local _, fontHeight, flags = self:GetFont()
    if font.outline then 
      if font.outline == "NORMAL" then 
        flags = "OUTLINE"
      elseif font.outline == "THICK" then 
        flags = "THICKOUTLINE"
      end 
    end

    if font.monochrome then 
      if flags then 
        flags = flags..",MONOCHROME"
      else
        flags = "MONOCHROME"
      end
    end

    if font.height then 
      fontHeight = font.height
    end

    local ft = LibSharedMedia:Fetch("font", font.font)

    return self:SetFontObject(FetchFontObject(ft, fontHeight or 10, flags))
  end
  -----------------------------------------------------------------------------
  --                               Properties                                --
  -----------------------------------------------------------------------------
  property "SharedMediaFont" {
    type = FontType,
    handler = function(self, font) self:SetSharedMediaFont(font) end
  }

end)
-- ========================================================================= --
class "HelperWindow" (function(_ENV)
  inherit "Frame"
  -----------------------------------------------------------------------------
  --                               Handlers                                  --
  -----------------------------------------------------------------------------
  local function OnFocusGain(self)
    self:HighlightText()
  end
  -----------------------------------------------------------------------------
  --                               Methods                                   --
  -----------------------------------------------------------------------------
  __Arguments__ { Number }
  function SetID(self, id)
    self.ID = id
  end

  __Arguments__ { String }
  function SetType(self, type)
    self.Type = type
  end

  function UpdateText(self)
    if self.Type == "quest" then 
      Style[self].Description.text = DESCRIPTION_TEXT_FORMAT:format(QUEST_TEXT)
      Style[self].LinkBox.text = WOWHEAD_LINK_FORMAT:format("quest", self.ID)
    elseif self.Type == "achievement" then 
       Style[self].Description.text = DESCRIPTION_TEXT_FORMAT:format(ACHIEVEMENT_TEXT)
       Style[self].LinkBox.text = WOWHEAD_LINK_FORMAT:format("achievement", self.ID)
    end
  end
  -----------------------------------------------------------------------------
  --                               Methods                                   --
  -----------------------------------------------------------------------------
  property "ID " {
    type = Number
  }

  property "Type" {
    type = String
  }
  -----------------------------------------------------------------------------
  --                            Constructors                                 --
  -----------------------------------------------------------------------------
  __Template__{
    CloseButton = Button,
    HeaderText = SLTFontString,
    Description = SLTFontString,
    CopyHelpText = SLTFontString,
    LinkBox = SLTEditBox
  }
  function __ctor(self)
    HelperFrameInstance = self 
    local linkBox = self:GetChild("LinkBox")
    linkBox.OnEditFocusGained = OnFocusGain

    local closeButton = self:GetChild("CloseButton")
    closeButton.OnClick = function() self:Hide() end
  end

end)
-- ========================================================================= --
--                                Styles                                     --
-- ========================================================================= --
Style.UpdateSkin("Default", {
  [HelperWindow] = {
    width = 600,
    height = 175,
    backdrop = {
      bgFile = [[Interface\AddOns\SylingTracker\Media\Textures\Window-Background.blp]]
    },

    CloseButton = {
      width = 24,
      height = 24,
      registerForClicks = { "LeftButtonDown" },
      
      NormalTexture = {
        file = [[Interface\AddOns\SylingTracker\Media\Textures\Icons\close]],
        vertexColor = { r = 1, g = 0, b = 0, a = 0.5},
        setAllPoints = true,
      },
      HighlightTexture = {
        file = [[Interface\AddOns\SylingTracker\Media\Textures\Icons\close]],
        vertexColor = { r = 1, g = 0, b = 0, a = 0.15},
        setAllPoints = true,
      },
      
      location = {
        Anchor("TOPRIGHT", -5, -5)
      }
    },

    HeaderText = {
      height = 24,
      text = "Need Help ?",
      sharedMediaFont = FontType("PT Sans Narrow Bold", 16),
      textColor = Color(0, 0.9, 0.9, 0.9),
      justifyH = "CENTER",
      location = {
        Anchor("TOP", 0, -10),
      }
    },

    Description = {
      height = 24,
      sharedMediaFont = FontType("PT Sans Narrow Bold", 14),
      textColor = Color(0.75, 0.75, 0.75, 0.9),
      justifyH = "CENTER",
      location = {
        Anchor("TOP", 0, -50),
      }
    },

    CopyHelpText = {
      height = 24,
      text = "Ctrl + C to copy",
      sharedMediaFont = FontType("PT Sans Narrow Bold", 13),
      textColor = Color(0.9, 0.37, 0, 0.9),
      justifyH = "CENTER",
      location = {
        Anchor("BOTTOM", 0, 5, "LinkBox", "TOP"),
      }
    },

    LinkBox = {
      height = 36,
      backdrop = {
        bgFile = [[Interface\Buttons\WHITE8X8]]
      },
      backdropColor = { r = 255/255, g = 255/255, b = 255/255, a = 0.07 },
      sharedMediaFont = FontType("PT Sans Narrow Bold", 15),
      textColor = Color(0.9, 195/255, 0, 0.9),
      textInsets = Inset(10, 0, 5, 5),
      autoFocus = false,
      location = {
        Anchor("LEFT", 20),
        Anchor("RIGHT", -20),
        Anchor("BOTTOM", 0, 20)
      }
    }
  }
})
-- ========================================================================= --
local HelperWindowObj = HelperWindow("SylingTracker_HelperWindow", UIParent)
HelperWindowObj:Hide()
HelperWindowObj:SetPoint("CENTER")
-- ========================================================================= --
-- Enchance the API
-- ========================================================================= --
class "API" (function(_ENV)
  
  __Arguments__{ String, Number }
  __Static__() function ShowHelperWindow(type, id)

    HelperWindowObj:SetType(type)
    HelperWindowObj:SetID(id)
    HelperWindowObj:UpdateText()
    HelperWindowObj:Show()
  end

  __Static__() function HideHelperWindow()
    HelperWindowObj:Hide()
  end
end)