local addonName = "MDungeonTeleports"
local version = C_AddOns.GetAddOnMetadata(addonName, "Version") or "Unknown"

local function GetCurrentDate()
    return date("%Y%m%d")
end

-- MARK: Default Settings
local defaultSettings = {
    isSeason1PortalsShown = true,
    isSeason2PortalsShown = true,
    isPortalLibraryShown = true,
    isPortalLibraryRaidShown = true,
    isKeyFrameShown = true,
    selectedFramePack = FramePackCategories[1].items[1].value
}

-- Load Variables
if MDungeonTeleports == nil then
    MDungeonTeleports = {}
end

-- Assign Defaults
MDungeonTeleports.isSeason1PortalsShown =
    MDungeonTeleports.isSeason1PortalsShown ~= nil and MDungeonTeleports.isSeason1PortalsShown or
    defaultSettings.isSeason1PortalsShown
MDungeonTeleports.isSeason2PortalsShown =
    MDungeonTeleports.isSeason2PortalsShown ~= nil and MDungeonTeleports.isSeason2PortalsShown or
    defaultSettings.isSeason2PortalsShown
MDungeonTeleports.isPortalLibraryShown =
    MDungeonTeleports.isPortalLibraryShown ~= nil and MDungeonTeleports.isPortalLibraryShown or
    defaultSettings.isPortalLibraryShown
MDungeonTeleports.isPortalLibraryRaidShown =
    MDungeonTeleports.isPortalLibraryRaidShown ~= nil and MDungeonTeleports.isPortalLibraryRaidShown or
    defaultSettings.isPortalLibraryRaidShown
MDungeonTeleports.isKeyFrameShown =
    MDungeonTeleports.isKeyFrameShown ~= nil and MDungeonTeleports.isKeyFrameShown or defaultSettings.isKeyFrameShown
MDungeonTeleports.selectedFramePack = MDungeonTeleports.selectedFramePack or FramePackCategories[1].items[1].value

local function SaveSettings()
    if
        Season1CheckBox and Season2CheckBox and PortalLibraryCheckBox and PortalLibraryRaidCheckBox and
            ToggleKeyFrameCheckBox
     then
        MDungeonTeleports.isSeason1PortalsShown = Season1CheckBox:GetChecked()
        MDungeonTeleports.isSeason2PortalsShown = Season2CheckBox:GetChecked()
        MDungeonTeleports.isPortalLibraryShown = PortalLibraryCheckBox:GetChecked()
        MDungeonTeleports.isPortalLibraryRaidShown = PortalLibraryRaidCheckBox:GetChecked()
        MDungeonTeleports.isKeyFrameShown = ToggleKeyFrameCheckBox:GetChecked()
    end

    if selectedFramePackValue then
        MDungeonTeleports.selectedFramePack = selectedFramePackValue
    end
    MDungeonTeleports.frameScale = uiScaleSlider:GetValue()
end

-- MARK: Visibility Toggles
local function ToggleSeason1Portals(show)
    if Season1_UpdateVisibility then
        Season1_UpdateVisibility(show)
    end
    SaveSettings()
end

local function ToggleSeason2Portals(show)
    if Season2_UpdateVisibility then
        Season2_UpdateVisibility(show)
    end
    SaveSettings()
end

-- toggle portal library
local function TogglePortalLibrary(show)
    if PortalLibrary_UpdateVisibility then
        PortalLibrary_UpdateVisibility(show)
    end
    SaveSettings()
end

-- toggle raid portal library
local function TogglePortalLibraryRaid(show)
    if PortalLibraryRaid_UpdateVisibility then
        PortalLibraryRaid_UpdateVisibility(show)
    end
    SaveSettings()
end

-- toggle key frame
local function ToggleKeyFrame(show)
    if KeyFrame_UpdateVisibility then
        KeyFrame_UpdateVisibility(show)
    end
    SaveSettings()
end

-- MARK: Scale Update
function UpdateFrameScale(scale)
    if Season1 then
        Season1:SetScale(scale)
    end
    if Season2 then
        Season2:SetScale(scale)
    end
    if PortalLibrary then
        PortalLibrary:SetScale(scale)
    end
    if PortalLibraryRaid then
        PortalLibraryRaid:SetScale(scale)
    end
    MDungeonTeleports.frameScale = scale
end

-- MARK: Settings Frame
local Settings = CreateFrame("Frame", "Settings", UIParent)
Settings:SetSize(420, 250)
Settings:SetPoint("CENTER")
Settings:SetMovable(true)
Settings:EnableMouse(true)
Settings:RegisterForDrag("LeftButton")
Settings:SetScript("OnDragStart", Settings.StartMoving)
Settings:SetScript("OnDragStop", Settings.StopMovingOrSizing)
Settings:Hide()
Settings:SetFrameStrata("DIALOG")
Settings:EnableKeyboard(true)
Settings:SetClampedToScreen(true)
Settings:SetScript(
    "OnKeyDown",
    function(self, key)
        if key == "ESCAPE" then
            self:Hide()
        else
            self:SetPropagateKeyboardInput(true)
        end
    end
)

-- backgroundSettings
local backgroundSettings = Settings:CreateTexture(nil, "BACKGROUND")
backgroundSettings:SetAllPoints(Settings)
backgroundSettings:SetTexture("Interface/AddOns/MDungeonTeleports/media/ui/ui_frames/ui_frames.blp")
backgroundSettings:SetTexCoord(0.589843, 1, 0, 0.488281)

-- title
local SettingsTitle = Settings:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
SettingsTitle:SetPoint("TOP", Settings, "TOP", 0, -7)
SettingsTitle:SetFont("Interface/AddOns/MDungeonTeleports/media/fonts/expressway.ttf", 12, flags)
SettingsTitle:SetText("Settings")

-- addon data and information
local AddonInfo = Settings:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
AddonInfo:SetPoint("BOTTOM", Settings, "BOTTOM", 0, 13)
AddonInfo:SetFont("Interface/AddOns/MDungeonTeleports/media/fonts/expressway.ttf", 8, flags)
AddonInfo:SetText("M+ Dungeon Teleports by peepoStudy // " .. version .. "")
AddonInfo:SetTextColor(0.5, 0.5, 0.5)

-- MARK: Checkboxes
local textureCheckNormal = "Interface/AddOns/MDungeonTeleports/media/ui/ui_elements/checkbox.blp"
local textureCheckPushed = "Interface/AddOns/MDungeonTeleports/media/ui/ui_elements/checkbox_pushed.blp"
local textureCheckHighlight = "Interface/AddOns/MDungeonTeleports/media/ui/ui_elements/checkbox_highlight.blp"
local textureCheckChecked = "Interface/AddOns/MDungeonTeleports/media/ui/ui_elements/checkbox_checked.blp"

local function CreateCheckboxes()
    Season1CheckBox = CreateFrame("CheckButton", nil, Settings, "ChatConfigCheckButtonTemplate")
    Season1CheckBox:SetPoint("CENTER", Settings, "TOPLEFT", 29, -40)
    local font, _, flags = Season1CheckBox.Text:GetFont()
    Season1CheckBox.Text:SetFont("Interface/AddOns/MDungeonTeleports/media/fonts/expressway.ttf", 10, flags)
    Season1CheckBox.Text:SetPoint("LEFT", Season1CheckBox, "RIGHT", 0, 0)
    Season1CheckBox.Text:SetText("Show Season 1")
    Season1CheckBox:SetChecked(MDungeonTeleports.isSeason1PortalsShown)
    Season1CheckBox:SetScript(
        "OnClick",
        function(self)
            ToggleSeason1Portals(self:GetChecked())
        end
    )

    Season1CheckBox:SetNormalTexture(textureCheckNormal)
    Season1CheckBox:SetPushedTexture(textureCheckPushed)
    Season1CheckBox:SetHighlightTexture(textureCheckHighlight)
    Season1CheckBox:SetCheckedTexture(textureCheckChecked)

    -- season2 checkbox
    Season2CheckBox = CreateFrame("CheckButton", nil, Settings, "ChatConfigCheckButtonTemplate")
    Season2CheckBox:SetPoint("CENTER", Settings, "TOPLEFT", 29, -60)
    local font, _, flags = Season2CheckBox.Text:GetFont()
    Season2CheckBox.Text:SetFont("Interface/AddOns/MDungeonTeleports/media/fonts/expressway.ttf", 10, flags)
    Season2CheckBox.Text:SetPoint("LEFT", Season2CheckBox, "RIGHT", 0, 0)
    Season2CheckBox.Text:SetText("Show Season 2")
    Season2CheckBox:SetChecked(MDungeonTeleports.isSeason2PortalsShown)
    Season2CheckBox:SetScript(
        "OnClick",
        function(self)
            ToggleSeason2Portals(self:GetChecked())
        end
    )

    Season2CheckBox:SetNormalTexture(textureCheckNormal)
    Season2CheckBox:SetPushedTexture(textureCheckPushed)
    Season2CheckBox:SetHighlightTexture(textureCheckHighlight)
    Season2CheckBox:SetCheckedTexture(textureCheckChecked)

    PortalLibraryCheckBox = CreateFrame("CheckButton", nil, Settings, "ChatConfigCheckButtonTemplate")
    PortalLibraryCheckBox:SetPoint("CENTER", Settings, "TOPLEFT", 29, -80)
    local font, _, flags = PortalLibraryCheckBox.Text:GetFont()
    PortalLibraryCheckBox.Text:SetFont("Interface/AddOns/MDungeonTeleports/media/fonts/expressway.ttf", 10, flags)
    PortalLibraryCheckBox.Text:SetPoint("LEFT", PortalLibraryCheckBox, "RIGHT", 0, 0)
    PortalLibraryCheckBox.Text:SetText("Show Portal Library")
    PortalLibraryCheckBox:SetChecked(MDungeonTeleports.isPortalLibraryShown)
    PortalLibraryCheckBox:SetScript(
        "OnClick",
        function(self)
            TogglePortalLibrary(self:GetChecked())
        end
    )

    PortalLibraryCheckBox:SetNormalTexture(textureCheckNormal)
    PortalLibraryCheckBox:SetPushedTexture(textureCheckPushed)
    PortalLibraryCheckBox:SetHighlightTexture(textureCheckHighlight)
    PortalLibraryCheckBox:SetCheckedTexture(textureCheckChecked)

    PortalLibraryRaidCheckBox = CreateFrame("CheckButton", nil, Settings, "ChatConfigCheckButtonTemplate")
    PortalLibraryRaidCheckBox:SetPoint("CENTER", Settings, "TOPLEFT", 29, -100)
    local font, _, flags = PortalLibraryRaidCheckBox.Text:GetFont()
    PortalLibraryRaidCheckBox.Text:SetFont("Interface/AddOns/MDungeonTeleports/media/fonts/expressway.ttf", 10, flags)
    PortalLibraryRaidCheckBox.Text:SetPoint("LEFT", PortalLibraryRaidCheckBox, "RIGHT", 0, 0)
    PortalLibraryRaidCheckBox.Text:SetText("Show Portal Library [Raid]")
    PortalLibraryRaidCheckBox:SetChecked(MDungeonTeleports.isPortalLibraryRaidShown)
    PortalLibraryRaidCheckBox:SetScript(
        "OnClick",
        function(self)
            TogglePortalLibraryRaid(self:GetChecked())
        end
    )

    PortalLibraryRaidCheckBox:SetNormalTexture(textureCheckNormal)
    PortalLibraryRaidCheckBox:SetPushedTexture(textureCheckPushed)
    PortalLibraryRaidCheckBox:SetHighlightTexture(textureCheckHighlight)
    PortalLibraryRaidCheckBox:SetCheckedTexture(textureCheckChecked)

    -- tooltips
    ToggleTooltips = CreateFrame("CheckButton", nil, Settings, "ChatConfigCheckButtonTemplate")
    ToggleTooltips:SetPoint("CENTER", Settings, "TOPLEFT", 29, -129)
    local font, _, flags = ToggleTooltips.Text:GetFont()
    ToggleTooltips.Text:SetFont("Interface/AddOns/MDungeonTeleports/media/fonts/expressway.ttf", 10, flags)
    ToggleTooltips.Text:SetPoint("LEFT", ToggleTooltips, "RIGHT", 0, 0)
    ToggleTooltips.Text:SetText("Show Tooltips")
    ToggleTooltips:SetChecked(MDungeonTeleports.showTooltips)
    ToggleTooltips:SetScript(
        "OnClick",
        function(self)
            MDungeonTeleports.showTooltips = self:GetChecked()
        end
    )

    ToggleTooltips:SetNormalTexture(textureCheckNormal)
    ToggleTooltips:SetPushedTexture(textureCheckPushed)
    ToggleTooltips:SetHighlightTexture(textureCheckHighlight)
    ToggleTooltips:SetCheckedTexture(textureCheckChecked)

    -- keyframe
    ToggleKeyFrameCheckBox = CreateFrame("CheckButton", nil, Settings, "ChatConfigCheckButtonTemplate")
    ToggleKeyFrameCheckBox:SetPoint("CENTER", Settings, "TOPRIGHT", -156, -91)
    local font, _, flags = ToggleKeyFrameCheckBox.Text:GetFont()
    ToggleKeyFrameCheckBox.Text:SetFont("Interface/AddOns/MDungeonTeleports/media/fonts/expressway.ttf", 10, flags)
    ToggleKeyFrameCheckBox.Text:SetPoint("LEFT", ToggleKeyFrameCheckBox, "RIGHT", 0, 0)
    ToggleKeyFrameCheckBox.Text:SetText("Show Key Tracker")
    ToggleKeyFrameCheckBox:SetChecked(MDungeonTeleports.isKeyFrameShown)
    ToggleKeyFrameCheckBox:SetScript(
        "OnClick",
        function(self)
            ToggleKeyFrame(self:GetChecked())
        end
    )

    ToggleKeyFrameCheckBox:SetNormalTexture(textureCheckNormal)
    ToggleKeyFrameCheckBox:SetPushedTexture(textureCheckPushed)
    ToggleKeyFrameCheckBox:SetHighlightTexture(textureCheckHighlight)
    ToggleKeyFrameCheckBox:SetCheckedTexture(textureCheckChecked)

    -- respond to keys
    RespondKeyCheckBox = CreateFrame("CheckButton", nil, Settings, "ChatConfigCheckButtonTemplate")
    RespondKeyCheckBox:SetPoint("CENTER", Settings, "TOPRIGHT", -156, -111)
    local font, _, flags = RespondKeyCheckBox.Text:GetFont()
    RespondKeyCheckBox.Text:SetFont("Interface/AddOns/MDungeonTeleports/media/fonts/expressway.ttf", 10, flags)
    RespondKeyCheckBox.Text:SetPoint("LEFT", RespondKeyCheckBox, "RIGHT", 0, 0)
    RespondKeyCheckBox.Text:SetText("Respond to '!keys'")
    RespondKeyCheckBox:SetChecked(MDungeonTeleports.isRespondChecked)
    RespondKeyCheckBox:SetScript(
        "OnClick",
        function(self)
            MDungeonTeleports.isRespondChecked = (self:GetChecked())
            SaveSettings()
        end
    )

    RespondKeyCheckBox:SetNormalTexture(textureCheckNormal)
    RespondKeyCheckBox:SetPushedTexture(textureCheckPushed)
    RespondKeyCheckBox:SetHighlightTexture(textureCheckHighlight)
    RespondKeyCheckBox:SetCheckedTexture(textureCheckChecked)

    -- compactmodebox
    CompactModeBox = CreateFrame("CheckButton", nil, Settings, "ChatConfigCheckButtonTemplate")
    CompactModeBox:SetPoint("CENTER", Settings, "TOPLEFT", 29, -149)
    local font, _, flags = CompactModeBox.Text:GetFont()
    CompactModeBox.Text:SetFont("Interface/AddOns/MDungeonTeleports/media/fonts/expressway.ttf", 10, flags)
    CompactModeBox.Text:SetPoint("LEFT", CompactModeBox, "RIGHT", 0, 0)
    CompactModeBox.Text:SetText("Compact Mode")
    CompactModeBox:SetChecked(MDungeonTeleports.CompactMode)
    CompactModeBox:SetScript(
        "OnClick",
        function(self)
            MDungeonTeleports.CompactMode = self:GetChecked()
            if CompactModeBox then
                CompactModeSeason1()
                CompactModeSeason2()
                CompactModePortalLibrary()
                CompactModePortalLibraryRaid()
                if UpdateSeason1UI then
                    UpdateSeason1UI()
                end
                if UpdateSeason2UI then
                    UpdateSeason2UI()
                end
                if UpdatePortalLibraryUI then
                    UpdatePortalLibraryUI()
                end
                if UpdatePortalLibraryRaidUI then
                    UpdatePortalLibraryRaidUI()
                end
                if UpdateSeason1Background then
                    UpdateSeason1Background()
                end
                if UpdateSeason2Background then
                    UpdateSeason2Background()
                end
                if UpdatePortalLibraryBackground then
                    UpdatePortalLibraryBackground()
                end
                if UpdatePortalLibRaidBackground then
                    UpdatePortalLibRaidBackground()
                end
            end
        end
    )

    CompactModeBox:SetNormalTexture(textureCheckNormal)
    CompactModeBox:SetPushedTexture(textureCheckPushed)
    CompactModeBox:SetHighlightTexture(textureCheckHighlight)
    CompactModeBox:SetCheckedTexture(textureCheckChecked)

    -- Tooltip setup
    CompactModeBox:SetScript("OnEnter", function(self)
        GameTooltip:SetOwner(self, "ANCHOR_CURSOR")
        GameTooltip:SetText("Framepacks do not work with Compact Mode.", 1, 1, 1) -- Text color is white (1, 1, 1)
        GameTooltip:Show()
    end)

    CompactModeBox:SetScript("OnLeave", function(self)
            GameTooltip:Hide()
        end)

    -- altlockbox
    AltLocksBox = CreateFrame("CheckButton", nil, Settings, "ChatConfigCheckButtonTemplate")
    AltLocksBox:SetPoint("CENTER", Settings, "TOPLEFT", 29, -169)
    local font, _, flags = AltLocksBox.Text:GetFont()
    AltLocksBox.Text:SetFont("Interface/AddOns/MDungeonTeleports/media/fonts/expressway.ttf", 10, flags)
    AltLocksBox.Text:SetPoint("LEFT", AltLocksBox, "RIGHT", 0, 0)
    AltLocksBox.Text:SetText("Alternative Locked Icons")
    AltLocksBox:SetChecked(MDungeonTeleports.AltLocks)
    AltLocksBox:SetScript(
    "OnClick",
    function(self)
        MDungeonTeleports.AltLocks = self:GetChecked()
        if UpdateSeason1UI then
            UpdateSeason1UI()
        end
        if UpdateSeason2UI then
            UpdateSeason2UI()
        end
        if UpdatePortalLibraryUI then
            UpdatePortalLibraryUI()
        end
        if UpdatePortalLibraryRaidUI then
            UpdatePortalLibraryRaidUI()
        end
    end
)

    AltLocksBox:SetNormalTexture(textureCheckNormal)
    AltLocksBox:SetPushedTexture(textureCheckPushed)
    AltLocksBox:SetHighlightTexture(textureCheckHighlight)
    AltLocksBox:SetCheckedTexture(textureCheckChecked)    
end

CreateCheckboxes()

-- MARK: Dropdown Framepack
local FramePackDropdown = CreateFrame("Frame", "FramePackDropdown", Settings, "UIDropDownMenuTemplate")
FramePackDropdown:SetPoint("CENTER", Settings, "TOPRIGHT", -93, -60)

local FramePackDropdownLabel = FramePackDropdown:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
local font, _, flags = FramePackDropdownLabel:GetFont()
FramePackDropdownLabel:SetFont("Interface/AddOns/MDungeonTeleports/media/fonts/expressway.ttf", 10, flags)
FramePackDropdownLabel:SetPoint("TOP", FramePackDropdown, "TOP", 0, 10)
FramePackDropdownLabel:SetText("Select Frame Pack")

local selectedFramePackValue = MDungeonTeleports.selectedFramePack
local selectedUIPack = MDungeonTeleports.selectedUIPack

-- Function to update the dropdown text based on the selected frame pack
local function UpdateDropdownText(value)
    -- Find the corresponding text for the selected value
    for _, category in pairs(FramePackCategories) do
        for _, option in pairs(category.items) do
            if option.value == value then
                -- Update the text shown inside the dropdown
                UIDropDownMenu_SetText(FramePackDropdown, option.text) -- Update dropdown display text
                return
            end
        end
    end
    -- Fallback
    UIDropDownMenu_SetText(FramePackDropdown, "Select Frame Pack")
end

local function InitializeDropdown(self, level, menulist)
    local info = UIDropDownMenu_CreateInfo()

    -- Level 1: Show main categories
    if level == 1 then
        -- Level 2: Show the frame packs within each category
        for _, category in pairs(FramePackCategories) do
            info.text = category.category
            info.hasArrow = true
            info.notCheckable = true
            info.menuList = category.items
            UIDropDownMenu_AddButton(info, level)
        end
    elseif level == 2 and menulist then
        for _, option in pairs(menulist) do
            info.text = option.text
            info.func = function(self)
                -- Set the selected frame pack and UI pack
                selectedFramePackValue = option.value
                selectedUIPack = option.value2

                -- Update the saved variables
                MDungeonTeleports.selectedFramePack = selectedFramePackValue
                MDungeonTeleports.selectedUIPack = selectedUIPack

                -- Set the dropdown to show the selected value
                UIDropDownMenu_SetSelectedValue(FramePackDropdown, selectedFramePackValue)

                -- Update the dropdown text to reflect the selected option
                UpdateDropdownText(selectedFramePackValue)

                -- Call update functions for UI
                if UpdateSeason1Background then
                    UpdateSeason1Background()
                end
                if UpdateSeason2Background then
                    UpdateSeason2Background()
                end
                if UpdatePortalLibraryBackground then
                    UpdatePortalLibraryBackground()
                end
                if UpdatePortalLibRaidBackground then
                    UpdatePortalLibRaidBackground()
                end

                -- Update UI packs
                if UpdateSeason1UI then
                    UpdateSeason1UI()
                end
                if UpdateSeason2UI then
                    UpdateSeason2UI()
                end
                if UpdatePortalLibraryUI then
                    UpdatePortalLibraryUI()
                end
                if UpdatePortalLibraryRaidUI then
                    UpdatePortalLibraryRaidUI()
                end
                if UpdateSettingsUI then
                    UpdateSettingsUI()
                end

                -- Save settings
                SaveSettings()
            end
            info.notCheckable = true
            UIDropDownMenu_AddButton(info, level)
        end
    end
end

-- Initialize the dropdown
UIDropDownMenu_Initialize(FramePackDropdown, InitializeDropdown)
UIDropDownMenu_SetWidth(FramePackDropdown, 120)
UIDropDownMenu_SetButtonWidth(FramePackDropdown, 164)
UIDropDownMenu_SetSelectedValue(FramePackDropdown, selectedFramePackValue)
UIDropDownMenu_JustifyText(FramePackDropdown, "LEFT")

UpdateDropdownText(selectedFramePackValue)

-- MARK: UI Slider
local uiScaleSlider = CreateFrame("Slider", "uiScaleSlider", Settings, "OptionsSliderTemplate")
uiScaleSlider:SetPoint("CENTER", Settings, "TOPRIGHT", -92, -160)
uiScaleSlider:SetMinMaxValues(0.8, 1.2)
uiScaleSlider:SetValue(MDungeonTeleports.scaleSliderValue or 50)
uiScaleSlider:SetValueStep(0.1)
uiScaleSlider:SetWidth(135)

-- minimum label
local minLabel = _G[uiScaleSlider:GetName() .. "Low"]
minLabel:SetText("-20%")
minLabel:SetFont("Interface/AddOns/MDungeonTeleports/media/fonts/expressway.ttf", 10, flags)
-- maximum label
local maxLabel = _G[uiScaleSlider:GetName() .. "High"]
maxLabel:SetText("+20%")
maxLabel:SetFont("Interface/AddOns/MDungeonTeleports/media/fonts/expressway.ttf", 10, flags)
-- text label for the slider
local textLabel = _G[uiScaleSlider:GetName() .. "Text"]
textLabel:SetText("UI Scale")
textLabel:SetFont("Interface/AddOns/MDungeonTeleports/media/fonts/expressway.ttf", 10, flags)
-- OnValueChanged handler for the slider
uiScaleSlider:SetScript(
    "OnValueChanged",
    function(self, value)
        -- Round to one decimal place
        local scale = math.floor(value * 10 + 0.5) / 10
        -- Update the scale globally
        UpdateFrameScale(scale)
    end
)

uiScaleSlider:SetValue(MDungeonTeleports.frameScale or 1.0)

-- Update the UI with the current settings
local function UpdateUI()
    if
        Season1CheckBox and Season2CheckBox and PortalLibraryRaidCheckBox and PortalLibraryCheckBox and
            ToggleKeyFrameCheckBox
     then
        Season1CheckBox:SetChecked(MDungeonTeleports.isSeason1PortalsShown)
        Season2CheckBox:SetChecked(MDungeonTeleports.isSeason2PortalsShown)
        PortalLibraryCheckBox:SetChecked(MDungeonTeleports.isPortalLibraryShown)
        PortalLibraryRaidCheckBox:SetChecked(MDungeonTeleports.isPortalLibraryRaidShown)
        ToggleKeyFrameCheckBox:SetChecked(MDungeonTeleports.isKeyFrameShown)
        UIDropDownMenu_SetSelectedValue(FramePackDropdown, MDungeonTeleports.selectedFramePack)
        UpdateDropdownText(selectedFramePackValue)

        ToggleSeason1Portals(MDungeonTeleports.isSeason1PortalsShown)
        ToggleSeason2Portals(MDungeonTeleports.isSeason2PortalsShown)
        TogglePortalLibrary(MDungeonTeleports.isPortalLibraryShown)
        TogglePortalLibraryRaid(MDungeonTeleports.isPortalLibraryRaidShown)
        ToggleKeyFrame(MDungeonTeleports.isKeyFrameShown)
    end
    if RespondKeyCheckBox then
        RespondKeyCheckBox:SetChecked(MDungeonTeleports.isRespondChecked)
    end
    if ToggleTooltips then
        ToggleTooltips:SetChecked(MDungeonTeleports.showTooltips)
    end
    if CompactModeBox then
        CompactModeBox:SetChecked(MDungeonTeleports.CompactMode)
    end
    if AltLocksBox then
        AltLocksBox:SetChecked(MDungeonTeleports.AltLocks)
    end
end

-- MARK: Addon Usage
local AddonUsage1 = Settings:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
AddonUsage1:SetPoint("CENTER", Settings, "CENTER", 0, -77)
AddonUsage1:SetJustifyH("CENTER")
AddonUsage1:SetFont("Interface/AddOns/MDungeonTeleports/media/fonts/expressway.ttf", 10, flags)
AddonUsage1:SetText(
    "• Shift and drag to move your frames. • Toggle to Show or Hide your frames.|n • Adjust frame size with the UI scale. • Change Framepacks using the dropdown."
)

-- MARK: Reset Button
local resetButton = CreateFrame("Button", "ResetButton", Settings)
resetButton:SetSize(24, 24)
resetButton:SetPoint("BOTTOMLEFT", Settings, "BOTTOMLEFT", 4, 4)
resetButton:SetFrameStrata("DIALOG")

local resetButtonTexture = resetButton:CreateTexture(nil, "BACKGROUND")
resetButtonTexture:SetAllPoints(resetButton)
resetButtonTexture:SetTexture("Interface\\AddOns\\MDungeonTeleports\\media\\ui\\ui_default\\button_reset.blp")

local resetButtonHighlight = resetButton:CreateTexture(nil, "HIGHLIGHT")
resetButtonHighlight:SetAllPoints(resetButton)
resetButtonHighlight:SetTexture(
    "Interface\\AddOns\\MDungeonTeleports\\media\\ui\\ui_default\\button_reset_highlight.blp"
)
resetButtonHighlight:Hide()

resetButton.resetButtonHighlight = resetButtonHighlight
resetButton.resetButtonTexture = resetButtonTexture

resetButton:SetScript(
    "OnEnter",
    function(self)
        self.resetButtonHighlight:Show()
        self.resetButtonTexture:Hide()
        GameTooltip:SetOwner(self, "ANCHOR_RIGHT")
        GameTooltip:SetText("Reset Addon UI", 1, 1, 1)
        GameTooltip:AddLine("Reset your AddOn.", nil, nil, nil, true)
        GameTooltip:AddLine("This will reload your UI", nil, nil, nil, true)
        GameTooltip:Show()
    end
)

resetButton:SetScript(
    "OnLeave",
    function(self)
        self.resetButtonHighlight:Hide()
        self.resetButtonTexture:Show()
        GameTooltip:Hide()
    end
)

-- MARK: Reset Script

resetButton:SetScript(
    "OnClick",
    function(self)
        MDungeonTeleports.PortalLibraryRaidPos = {x = 970, y = -195}
        MDungeonTeleports.PortalLibraryPos = {x = 970, y = -100}
        MDungeonTeleports.Season1Pos = {x = 615, y = 280}
        MDungeonTeleports.Season2Pos = {x = 615, y = 145}
        MDungeonTeleports.frameScale = 1
        MDungeonTeleports.isPortalLibraryRaidShown = true
        MDungeonTeleports.isSeason1PortalsShown = true
        MDungeonTeleports.isSeason2PortalsShown = true
        MDungeonTeleports.isPortalLibraryShown = true
        MDungeonTeleports.isKeyFrameShown = true
        MDungeonTeleports.showTooltips = false
        MDungeonTeleports.CompactMode = false
        MDungeonTeleports.AltLocks = false
        MDungeonTeleports.isRespondChecked = false
        MDungeonTeleports.firstLaunch = false
        MDungeonTeleports.selectedFramePack = FramePackCategories[1].items[1].value
        MDungeonTeleports.selectedUIPack = "Interface/AddOns/MDungeonTeleports/media/ui/ui_default/"
        ReloadUI()
    end
)

-- MARK: Settings Exit Button
local settingsExitButton = CreateFrame("Button", "SettingsOpenButton", Settings)
settingsExitButton:SetSize(14, 14)
settingsExitButton:SetPoint("TOPRIGHT", Settings, "TOPRIGHT", -5, -5)
settingsExitButton:SetFrameStrata("DIALOG")

local settingExitButtonTexture = settingsExitButton:CreateTexture(nil, "BACKGROUND")
settingExitButtonTexture:SetAllPoints(settingsExitButton)
settingExitButtonTexture:SetTexture("Interface\\AddOns\\MDungeonTeleports\\media\\ui\\ui_default\\button_close.blp")

local settingsExitButtonHighlight = settingsExitButton:CreateTexture(nil, "HIGHLIGHT")
settingsExitButtonHighlight:SetAllPoints(settingsExitButton)
settingsExitButtonHighlight:SetTexture(
    "Interface\\AddOns\\MDungeonTeleports\\media\\ui\\ui_default\\button_close_highlight.blp"
)
settingsExitButtonHighlight:Hide()

settingsExitButton.settingsExitButtonHighlight = settingsExitButtonHighlight
settingsExitButton.settingExitButtonTexture = settingExitButtonTexture

settingsExitButton:SetScript(
    "OnEnter",
    function(self)
        self.settingsExitButtonHighlight:Show()
        self.settingExitButtonTexture:Hide()
    end
)

settingsExitButton:SetScript(
    "OnLeave",
    function(self)
        self.settingsExitButtonHighlight:Hide()
        self.settingExitButtonTexture:Show()
    end
)

settingsExitButton:SetScript(
    "OnClick",
    function()
        PlaySound(SOUNDKIT.IG_CHARACTER_INFO_CLOSE)
        Settings:Hide()
    end
)

-- Ensure compatibility with both the new and old API versions
local IsAddOnLoaded = IsAddOnLoaded or C_AddOns.IsAddOnLoaded

-- MARK: PVE Settings Button
local settingsOpenButton = CreateFrame("Button", "SettingsOpenButton", PVEFrame)

-- Check if ElvUI is loaded
local isElvUILoaded = IsAddOnLoaded("ElvUI")

-- Set button size based on whether ElvUI is loaded
if isElvUILoaded then
    settingsOpenButton:SetSize(14, 14) -- Size for ElvUI
    settingsOpenButton:SetPoint("TOPRIGHT", PVEFrame, "TOPRIGHT", -22, -5)
else
    settingsOpenButton:SetSize(21, 21) -- Default size if ElvUI is not loaded
    settingsOpenButton:SetPoint("TOPRIGHT", PVEFrame, "TOPRIGHT", -22, -1)
end

settingsOpenButton:SetFrameStrata("DIALOG")

-- Define textures
local defaultTexture = "Interface\\AddOns\\MDungeonTeleports\\media\\ui\\ui_elements\\settings_buttons.blp"
local elvuiTexture = "Interface\\AddOns\\MDungeonTeleports\\media\\ui\\ui_default\\button_settings.blp"

-- Non-ElvUI texture coordinates provided
local defaultNormalCoords = {0.054687, 0.304687, 0.046875, 0.296875} -- Normal state
local defaultHighlightCoords = {0.351562, 0.601562, 0.046875, 0.296875} -- Highlight state
local defaultPressedCoords = {0.054687, 0.304687, 0.3828125, 0.632812} -- Pressed state

-- ElvUI texture paths (these will use the full texture for each state)
local elvuiHighlightTexture =
    "Interface\\AddOns\\MDungeonTeleports\\media\\ui\\ui_default\\button_settings_highlight.blp"
local elvuiPressedTexture =
    "Interface\\AddOns\\MDungeonTeleports\\media\\ui\\ui_default\\button_settings_pressed.blp"

-- Set main texture
local settingsOpenButtonTexture = settingsOpenButton:CreateTexture(nil, "BACKGROUND")
settingsOpenButtonTexture:SetAllPoints(settingsOpenButton)
settingsOpenButtonTexture:SetTexture(isElvUILoaded and elvuiTexture or defaultTexture)

-- Apply texture coordinates based on ElvUI status
if not isElvUILoaded then
    settingsOpenButtonTexture:SetTexCoord(unpack(defaultNormalCoords))
end

-- Set up highlight texture
local settingsButtonHoverOverlay = settingsOpenButton:CreateTexture(nil, "HIGHLIGHT")
settingsButtonHoverOverlay:SetAllPoints(settingsOpenButton)
settingsButtonHoverOverlay:SetTexture(isElvUILoaded and elvuiHighlightTexture or defaultTexture)
settingsButtonHoverOverlay:Hide()

if not isElvUILoaded then
    settingsButtonHoverOverlay:SetTexCoord(unpack(defaultHighlightCoords))
end

-- Define the pressed texture
local settingsButtonPressedOverlay = settingsOpenButton:CreateTexture(nil, "BACKGROUND")
settingsButtonPressedOverlay:SetAllPoints(settingsOpenButton)
settingsButtonPressedOverlay:SetTexture(isElvUILoaded and elvuiPressedTexture or defaultTexture)
settingsButtonPressedOverlay:Hide()

if not isElvUILoaded then
    settingsButtonPressedOverlay:SetTexCoord(unpack(defaultPressedCoords))
end

settingsOpenButton.settingsOpenButtonTexture = settingsOpenButtonTexture
settingsOpenButton.settingsButtonHoverOverlay = settingsButtonHoverOverlay
settingsOpenButton.settingsButtonPressedOverlay = settingsButtonPressedOverlay

-- Tooltip and interaction scripts
settingsOpenButton:SetScript(
    "OnEnter",
    function(self)
        self.settingsButtonHoverOverlay:Show()
        GameTooltip:SetOwner(self, "ANCHOR_RIGHT")
        GameTooltip:SetText("M+ Dungeon Teleports", 1, 1, 1)
        GameTooltip:AddLine("Open the Settings.", nil, nil, nil, true)
        if InCombatLockdown() then
            GameTooltip:AddLine("|cFFFF0000Unavailable during combat!|r", nil, nil, nil, true)
        end
        GameTooltip:Show()
    end
)

settingsOpenButton:SetScript(
    "OnLeave",
    function(self)
        self.settingsButtonHoverOverlay:Hide()
        self.settingsButtonPressedOverlay:Hide()
        self.settingsOpenButtonTexture:Show()
        GameTooltip:Hide()
    end
)

-- Add pressed texture visibility on mouse down and revert on mouse up
settingsOpenButton:SetScript(
    "OnMouseDown",
    function(self)
        self.settingsButtonPressedOverlay:Show()
        self.settingsOpenButtonTexture:Hide()
    end
)

settingsOpenButton:SetScript(
    "OnMouseUp",
    function(self)
        self.settingsButtonPressedOverlay:Hide()
        self.settingsOpenButtonTexture:Show()
    end
)

settingsOpenButton:SetScript(
    "OnClick",
    function(self)
        if InCombatLockdown() then
            print("|cFFFF0000Settings cannot be opened during combat!|r")
            return
        end
        PlaySound(SOUNDKIT.IG_CHARACTER_INFO_OPEN)
        if Settings:IsShown() then
            Settings:Hide()
        else
            Settings:Show()
        end
    end
)

-- Disable the button during combat
local function UpdateButtonStatus()
    if InCombatLockdown() then
        settingsOpenButton:Disable()
    else
        settingsOpenButton:Enable()
    end
end

settingsOpenButton:RegisterEvent("PLAYER_REGEN_ENABLED")
settingsOpenButton:RegisterEvent("PLAYER_REGEN_DISABLED")

settingsOpenButton:SetScript("OnEvent", UpdateButtonStatus)
UpdateButtonStatus()

--------------

function ToggleSettingsPanel()
    if InCombatLockdown() then
        print("|cFFFF0000Settings cannot be opened during combat!|r")
        return
    end

    if Settings:IsShown() then
        Settings:Hide()
    else
        Settings:Show()
    end
end

-- MARK: Slash Command '/dp'
SLASH_DPTOGGLE1 = "/dp"
SlashCmdList["DPTOGGLE"] = function()
    ToggleSettingsPanel()
end

--- MARK: Settings Links Buttons
local discordURL = "https://discord.gg/Ht9WYtfZ"
local curseforgeURL = "https://www.curseforge.com/wow/addons/dungeonports"
local wagoURL = "https://addons.wago.io/addons/dungeonports"

local function ShowPopup(linkURL, linkName)
    local CopyFrame = CreateFrame("Frame", "CopyFrame", UIParent, "UIPanelDialogTemplate")
    CopyFrame:SetSize(350, 80)
    CopyFrame:SetPoint("CENTER")
    CopyFrame:SetFrameStrata("TOOLTIP")
    CopyFrame:EnableMouse(true)
    CopyFrame:SetMovable(true)
    CopyFrame:RegisterForDrag("LeftButton")
    CopyFrame:SetScript(
        "OnDragStart",
        function(self)
            self:StartMoving()
        end
    )
    CopyFrame:SetScript(
        "OnDragStop",
        function(self)
            self:StopMovingOrSizing()
        end
    )

    CopyFrame.Title:SetText(linkName)

    local editBox = CreateFrame("EditBox", nil, CopyFrame, "InputBoxTemplate")
    editBox:SetSize(310, 20)
    editBox:SetPoint("TOP", CopyFrame, "TOP", 0, -40)
    editBox:SetAutoFocus(false)
    editBox:SetText(linkURL)
    editBox:HighlightText()

    editBox:SetScript(
        "OnEscapePressed",
        function()
            CopyFrame:Hide()
        end
    )
    editBox:SetScript(
        "OnEnterPressed",
        function()
            editBox:ClearFocus()
        end
    )
    editBox:SetScript(
        "OnEditFocusGained",
        function(self)
            self:HighlightText()
        end
    )

    CopyFrame.CloseButton:SetScript(
        "OnClick",
        function()
            CopyFrame:Hide()
        end
    )
    
    CopyFrame:Show()
end

-- Setup Button
local function CreateButton(name, texturePath, highlightTexturePath, linkURL, x, y)
    local button = CreateFrame("Button", name, Settings)
    button:SetSize(24, 24)
    button:SetPoint("BOTTOMRIGHT", Settings, "BOTTOMRIGHT", x, y)
    button:SetFrameStrata("DIALOG")

    local buttonIcon = button:CreateTexture(nil, "BACKGROUND")
    buttonIcon:SetAllPoints(button)
    buttonIcon:SetTexture(texturePath)

    local buttonIconHighlight = button:CreateTexture(nil, "HIGHLIGHT")
    buttonIconHighlight:SetAllPoints(button)
    buttonIconHighlight:SetTexture(highlightTexturePath)
    buttonIconHighlight:Hide()

    button:SetScript(
        "OnEnter",
        function(self)
            buttonIconHighlight:Show()
            buttonIcon:Hide()
            GameTooltip:SetOwner(self, "ANCHOR_RIGHT")
            GameTooltip:SetText(name, 1, 1, 1)
            GameTooltip:Show()
        end
    )

    button:SetScript(
        "OnLeave",
        function(self)
            buttonIconHighlight:Hide()
            buttonIcon:Show()
            GameTooltip:Hide()
        end
    )

    button:SetScript(
        "OnClick",
        function()
            ShowPopup(linkURL, name)
        end
    )

    return button
end

-- Create Buttons
local DiscordButton =
    CreateButton(
    "Discord",
    "Interface\\AddOns\\MDungeonTeleports\\media\\ui\\ui_external\\button_discord.blp",
    "Interface\\AddOns\\MDungeonTeleports\\media\\ui\\ui_external\\button_discord_highlight.blp",
    discordURL,
    -4,
    4
)
local CurseForgeButton =
    CreateButton(
    "CurseForge",
    "Interface\\AddOns\\MDungeonTeleports\\media\\ui\\ui_external\\button_curseforge.blp",
    "Interface\\AddOns\\MDungeonTeleports\\media\\ui\\ui_external\\button_curseforge_highlight.blp",
    curseforgeURL,
    -30,
    4
)
local WagoButton =
    CreateButton(
    "Wago",
    "Interface\\AddOns\\MDungeonTeleports\\media\\ui\\ui_external\\button_wago.blp",
    "Interface\\AddOns\\MDungeonTeleports\\media\\ui\\ui_external\\button_wago_highlight.blp",
    wagoURL,
    -56,
    4
)

function UpdateSettingsUI()
    local UIPack = MDungeonTeleports.selectedUIPack or "Interface/Addons/MDungeonTeleports/media/ui/ui_default/"
    -- exit button for settings
    settingExitButtonTexture:SetTexture(UIPack .. "button_close.blp")
    settingsExitButtonHighlight:SetTexture(UIPack .. "button_close_highlight.blp")
    -- open settings pve button
end

-- MARK: End of Settings.

--//////////////////////////////////////////////////////////////////////--

-- MARK: AddOn Load Event
local function OnEvent(self, event, arg1)
    if event == "ADDON_LOADED" and arg1 == "MDungeonTeleports" then
        selectedFramePackValue = MDungeonTeleports.selectedFramePack or FramePackCategories[1].items[1].value
        local savedScale = MDungeonTeleports.frameScale or 1.0
        UIDropDownMenu_SetSelectedValue(FramePackDropdown, selectedFramePackValue)
        uiScaleSlider:SetValue(savedScale)
        UpdateFrameScale(savedScale)
        UpdateUI()
        UpdateSettingsUI()
        UpdateDropdownText(selectedFramePackValue)
    end
end

local eventFrame = CreateFrame("Frame")
eventFrame:RegisterEvent("ADDON_LOADED")
eventFrame:SetScript("OnEvent", OnEvent)

-- MARK: Login Message
local loginmessage = CreateFrame("Frame")
loginmessage:RegisterEvent("PLAYER_LOGIN")
loginmessage:SetScript(
    "OnEvent",
    function(self, event)
        if event == "PLAYER_LOGIN" then
            if not MDungeonTeleports then
                MDungeonTeleports = {}
            end
            local today = GetCurrentDate()
            if MDungeonTeleports.lastLoginMessageDate ~= today then
                DEFAULT_CHAT_FRAME:AddMessage(
                    "[M+ Dungeon Teleports] Find your Settings in the Dungeon Finder!",
                    0.8,
                    0.6,
                    1
                )
                MDungeonTeleports.lastLoginMessageDate = today
            end
        end
    end
)

UpdateSettingsUI()