local _, addon = ...

local QuestFrame = CreateFrame("Frame", "CzechQuestsQuestFrame", UIParent, "BackdropTemplate")
QuestFrame:Hide()

addon.QuestFrame = QuestFrame

function QuestFrame:CreateHeader()
    local font = addon.API.CreateCzechFont(
            self,
            CzechQuestsAddon_Store.config.QUEST_HEADER_FONT_NAME,
            CzechQuestsAddon_Store.config.QUEST_HEADER_FONT_SIZE
    )
    font:SetWidth(self:GetWidth() - 20)
    return font;
end

function QuestFrame:CreateText()
    local font = addon.API.CreateCzechFont(
            self,
            CzechQuestsAddon_Store.config.QUEST_TEXT_FONT_NAME,
            CzechQuestsAddon_Store.config.QUEST_TEXT_FONT_SIZE
    )
    font:SetWidth(self:GetWidth() - 20)
    return font;
end

function QuestFrame:Init()
    -- Default style
    self:SetSize(300, 200)
    self:SetBackdrop({ edgeFile = "Interface/Tooltips/UI-Tooltip-Border", edgeSize = 8 })

    -- Background Parchment texture
    self.Texture = self:CreateTexture(nil, "BACKGROUND", nil, -1);
    self.Texture:SetAllPoints(true)
    self.Texture:SetHorizTile(true)

    -- Create fonts
    self.Title = self:CreateHeader()
    self.Text1 = self:CreateText()
    self.Header = self:CreateHeader()
    self.Text2 = self:CreateText()

    -- Load settings
    self:UpdateSettings()
end

function QuestFrame:UpdateSettings()
    addon.API.UpdateCzechFont(
            self.Title,
            CzechQuestsAddon_Store.config.QUEST_HEADER_FONT_NAME,
            CzechQuestsAddon_Store.config.QUEST_HEADER_FONT_SIZE
    )
    addon.API.UpdateCzechFont(
            self.Text1,
            CzechQuestsAddon_Store.config.QUEST_TEXT_FONT_NAME,
            CzechQuestsAddon_Store.config.QUEST_TEXT_FONT_SIZE
    )
    addon.API.UpdateCzechFont(
            self.Header,
            CzechQuestsAddon_Store.config.QUEST_HEADER_FONT_NAME,
            CzechQuestsAddon_Store.config.QUEST_HEADER_FONT_SIZE
    )
    addon.API.UpdateCzechFont(
            self.Text2,
            CzechQuestsAddon_Store.config.QUEST_TEXT_FONT_NAME,
            CzechQuestsAddon_Store.config.QUEST_TEXT_FONT_SIZE
    )

    if not CzechQuestsAddon_Store.config.QUEST_TEXTURE_ALPHA_ONLY_MOVING then
        self.Texture:SetAlpha(CzechQuestsAddon_Store.config.QUEST_TEXTURE_ALPHA / 100)
    end
end

function QuestFrame:SetTextColor(r, g, b, a)
    self.Title:SetTextColor(r, g, b, a)
    self.Header:SetTextColor(r, g, b, a)
    self.Text1:SetTextColor(r, g, b, a)
    self.Text2:SetTextColor(r, g, b, a)
end

function QuestFrame:ApplyTheme()
    if WOW_PROJECT_ID ~= WOW_PROJECT_MAINLINE then
        self.Texture:SetTexture("Interface/QUESTFRAME/QuestBG");
        if CzechQuestsAddon_Store.config.QUEST_DARK_MODE then
            self:SetBackdropColor(0, 0, 0, 1)
            self.Texture:SetColorTexture(0, 0, 0, 1)
            self:SetTextColor(255, 255, 255, 1)
        else
            self.Texture:SetTexCoord(0, .58, 0.005, 0.66)
            self:SetTextColor(0, 0, 0, 1)
        end
    else
        self.Texture:SetTexture("Interface/QUESTFRAME/QuestBackgroundParchment");
        self.Texture:SetTexCoord(0, .01, 0, 0.4)
        self:SetTextColor(0, 0, 0, 1)
        local questTextContrast = C_CVar.GetCVar("questTextContrast")
        if questTextContrast == "1" then
            -- Brown
            self.Texture:SetTexCoord(0, .01, .4, .8)
        elseif questTextContrast == "2" or questTextContrast == "3" then
            -- Gray
            self.Texture:SetColorTexture(255, 255, 255, 1)
        elseif questTextContrast == "4" then
            -- Black
            self.Texture:SetColorTexture(0, 0, 0, 1)
            self:SetTextColor(255, 255, 255, 1)
        end
    end
end

function QuestFrame:ResetFontText()
    self.Title:SetText("")
    self.Text1:SetText("")
    self.Header:SetText("")
    self.Text2:SetText("")
end

function QuestFrame:SetData(name, text1, header, text2, parentFrame, yOffset, xOffset)
    -- Reset previously values
    self:ResetFontText()
    self:ApplyTheme()

    -- Set parent
    self:SetParent(parentFrame)

    -- set text to labels
    self.Title:SetText(name or "")
    self.Text1:SetText(text1 or "")
    self.Header:SetText(header or "")
    self.Text2:SetText(text2 or "")

    -- apply text positions
    self.Title:SetPoint("TOPLEFT", self, "TOPLEFT", 10, -10)
    self.Text1:SetPoint("TOPLEFT", self.Title, "BOTTOMLEFT", 0, -5)
    self.Header:SetPoint("TOPLEFT", self.Text1, "BOTTOMLEFT", 0, -20)
    self.Text2:SetPoint("TOPLEFT", self.Header, "BOTTOMLEFT", 0, -5)

    -- apply frame position
    self:SetPoint("TOPLEFT", parentFrame, "TOPRIGHT", xOffset, yOffset)

    self:Show()

    -- wait for font render before calculate height
    local height = self.Title:GetStringHeight()
    if height == 0 then
        C_Timer.After(0.5, function()
            self:CalculateHeight()
        end)
    else
        self:CalculateHeight()
    end
end

function QuestFrame:CalculateHeight()
    local height = 0;
    local heights = {
        self.Title:GetHeight(),
        self.Text1:GetHeight(),
        self.Header:GetHeight(),
        self.Text2:GetHeight(),
        10
    }
    for _, value in ipairs(heights) do
        height = height + value + 10
    end
    self:SetHeight(height)
end