local _, addon = ...
local GetItemQualityColor = addon.API.GetItemQualityColor;

local ThemeUtil = {};
addon.ThemeUtil = ThemeUtil;

local gsub = string.gsub;
local unpack = unpack;

local TEXTURE_PATH;
local THEME_ID;


local function AdjustRedText(text)
    local count;
    text, count = gsub(text, "|[cC][fF][fF][fF][fF]0000", "|cff9B2020");

    if count == 0 then
        text, count = gsub(text, "|cnRED_FONT_COLOR:", "|cff9B2020");
    end

    return text, (count and count > 0)  --2nd payload used for replacing the gossip icon
end

local function AdjustBlueText(text)
    local count;
    text, count = gsub(text, "|[cC][fF][fF]0000[fF][fF]", "|cff0078FF");
    return text, false
end

local AdjustTextColor = AdjustRedText;

local COLORS = {
    --ColorKey = {r, g, b}

    DarkBrown = {0.19, 0.17, 0.13},
    LightBrown = {0.50, 0.36, 0.24},
    Ivory = {0.87, 0.86, 0.75},

    DarkModeGrey90 = {0.9, 0.9, 0.9},
    DarkModeGrey70 = {0.7, 0.7, 0.7},
    DarkModeGrey50 = {0.5, 0.5, 0.5},
    DarkModeGold = {1, 0.98, 0.8},
    DarkModeGoldDim = {0.796, 0.784, 0.584},
};

local FONT_OBJECT_COLOR = {
    --FontObjectName = {Theme Brown, Dark}

    DUIFont_Quest_Title_18 = {"DarkBrown", "DarkModeGrey90"},
    DUIFont_Quest_Title_16 = {"DarkBrown", "DarkModeGrey90"},
    DUIFont_Quest_SubHeader = {"DarkBrown", "DarkModeGrey90"},
    DUIFont_Quest_Paragraph = {"DarkBrown", "DarkModeGrey70"},
    DUIFont_Quest_Gossip = {"DarkBrown", "DarkModeGoldDim"},
    DUIFont_Quest_Quest = {"Ivory", "DarkModeGold"},
    DUIFont_Quest_Disabled = {"LightBrown", "DarkModeGrey50"},

    DUIFont_Settings_Disabled = {"LightBrown", "DarkModeGrey50"},

    DUIFont_Item = {"DarkBrown", "DarkModeGrey90"},
    DUIFont_ItemSelect = {"Ivory", "DarkModeGold"},

    DUIFont_QuestType_Left = {"DarkBrown", "DarkModeGrey90"},
    DUIFont_QuestType_Right = {"DarkModeGrey70", "DarkModeGrey70"},

    DUIFont_Constant_10 = {"DarkBrown", "DarkModeGrey70"},
    DUIFont_Constant_8 = {"DarkBrown", "DarkModeGrey70"},

    DUIFont_MenuButton_Normal = {"DarkBrown", "DarkModeGrey90"},
    DUIFont_MenuButton_Highlight = {"DarkBrown", "DarkModeGrey90"},
};


local function SetFontColor(fontObject, key)
    local color = COLORS[key];
    fontObject:SetTextColor(color[1], color[2], color[3]);
end

function ThemeUtil:SetFontColor(fontObject, key)
    SetFontColor(fontObject, key);
end

function ThemeUtil:SetThemeByID(themeID)
    local colorIndex;

    if themeID == 2 then    --Dark
        colorIndex = 2;
        TEXTURE_PATH = "Interface/AddOns/DialogueUI/Art/Theme_Dark/";
        AdjustTextColor = AdjustBlueText;
    else
        themeID = 1;
        colorIndex = 1;
        TEXTURE_PATH = "Interface/AddOns/DialogueUI/Art/Theme_Brown/";
        AdjustTextColor = AdjustRedText;
    end

    THEME_ID = themeID;

    local _G = _G;

    for fontName, colorKey in pairs(FONT_OBJECT_COLOR) do
        SetFontColor(_G[fontName], colorKey[colorIndex]);
    end

    if addon.DialogueUI then
        addon.DialogueUI:LoadTheme();
    end

    if addon.SettingsUI then
        addon.SettingsUI:LoadTheme();
    end

    if addon.QuestItemDisplay then
        addon.QuestItemDisplay:LoadTheme();
    end

    if addon.DropdownMenu then
        addon.DropdownMenu:LoadTheme();
    end
end

function ThemeUtil:GetTexturePath()
    return TEXTURE_PATH
end

function ThemeUtil:GetTextureFile(fileName)
    if fileName then
        return TEXTURE_PATH..fileName;
    end
end

function ThemeUtil:GetThemeID()
    return THEME_ID
end

function ThemeUtil:IsDarkMode()
    return THEME_ID == 2
end

function ThemeUtil:GetQualityColor(quality)
    if self:IsDarkMode() then
        return GetItemQualityColor(quality):GetRGB()
    else
        return 0.19, 0.17, 0.13, 1
    end
end

function ThemeUtil:GetItemSelectColor()
    if self:IsDarkMode() then
        return unpack(COLORS.DarkModeGold)
    else
        return unpack(COLORS.Ivory)
    end
end

function ThemeUtil:AdjustTextColor(text)
    return AdjustTextColor(text);
end


do
    ThemeUtil:SetThemeByID(1);

    local function Settings_Theme(dbValue)
        local themeID;
        if dbValue == 2 then
            themeID = 2;
        else
            themeID = 1;
        end
        ThemeUtil:SetThemeByID(themeID);
    end
    addon.CallbackRegistry:Register("SettingChanged.Theme", Settings_Theme);
end