local ADDON_NAME, PT = ...
if type(PT) ~= "table" then
    _G.PartyTranslatorAddon = _G.PartyTranslatorAddon or {}
    PT = _G.PartyTranslatorAddon
end

function PT.RegisterSettings()
    if PT.settingsRegistered then
        return
    end
    if not Settings or not Settings.RegisterVerticalLayoutCategory then
        return
    end

    local category, layout = Settings.RegisterVerticalLayoutCategory("PartyTranslator")
    PT.settingsCategory = category

    local function ApplyAppearanceNow()
        if PT.ApplyWindowAppearance then
            PT.ApplyWindowAppearance()
        end
    end

    local function RegisterLiveCallback(settingVariable, dbKey, callback)
        if not Settings.SetOnValueChangedCallback then return end
        Settings.SetOnValueChangedCallback(settingVariable, function(_, setting, value)
            if PartyTranslatorDB then
                PartyTranslatorDB[dbKey] = value
            end
            if callback then callback(value, setting) end
        end)
    end

    local function AddCheckbox(key, variable, name, description, defaultValue, onChanged)
        local setting = Settings.RegisterAddOnSetting(
            category,
            "PartyTranslator_" .. variable,
            key,
            PartyTranslatorDB,
            type(defaultValue),
            name,
            defaultValue
        )
        Settings.CreateCheckbox(category, setting, description)
        RegisterLiveCallback("PartyTranslator_" .. variable, key, onChanged)
        return setting
    end

    local function AddSlider(key, variable, name, description, defaultValue, minValue, maxValue, step, onChanged)
        local setting = Settings.RegisterAddOnSetting(
            category,
            "PartyTranslator_" .. variable,
            key,
            PartyTranslatorDB,
            type(defaultValue),
            name,
            defaultValue
        )
        local options = Settings.CreateSliderOptions(minValue, maxValue, step)
        if options and options.SetLabelFormatter and MinimalSliderWithSteppersMixin and MinimalSliderWithSteppersMixin.Label then
            options:SetLabelFormatter(MinimalSliderWithSteppersMixin.Label.Right)
        end
        Settings.CreateSlider(category, setting, options, description)
        RegisterLiveCallback("PartyTranslator_" .. variable, key, onChanged)
        return setting
    end

    if layout and CreateSettingsListSectionHeaderInitializer then
        layout:AddInitializer(CreateSettingsListSectionHeaderInitializer("Основные настройки"))
    end

    AddCheckbox(
        "enabled",
        "Enabled",
        "Включить переводчик",
        "Включает локальный перевод английских сообщений на русский.",
        true
    )

    AddCheckbox(
        "showOriginal",
        "ShowOriginal",
        "Показывать оригинальное сообщение",
        "Используется только когда отдельное окно переводов выключено. В режиме отдельного окна стандартный чат всегда остаётся оригинальным.",
        true
    )

    if layout and CreateSettingsListSectionHeaderInitializer then
        layout:AddInitializer(CreateSettingsListSectionHeaderInitializer("Окно переводчика"))
    end

    AddCheckbox(
        "separateWindow",
        "SeparateWindow",
        "Показывать переводы в отдельном окне",
        "Оригинальные сообщения остаются без изменений в стандартном чате WoW. Русский перевод выводится только в отдельное окно PartyTranslator.",
        true
    )

    AddCheckbox(
        "autoShowWindow",
        "AutoShowWindow",
        "Автоматически показывать окно переводчика",
        "Если окно скрыто, оно появится при новом переводимом сообщении. Открыть вручную можно командой /pt window.",
        true
    )


    AddCheckbox(
        "showMinimizeButton",
        "ShowMinimizeButton",
        "Показывать кнопку сворачивания",
        "Показывает небольшую кнопку – в правом верхнем углу окна. При нажатии окно сворачивается в компактную кнопку в своём правом нижнем углу.",
        true,
        function()
            if PT.ApplyWindowControlSettings then PT.ApplyWindowControlSettings() end
        end
    )

    AddCheckbox(
        "autoMinimize",
        "AutoMinimize",
        "Автоматически сворачивать окно",
        "Если в чате нет активности указанное время, окно автоматически сворачивается. Новое сообщение снова разворачивает окно, если включён автоматический показ.",
        false,
        function()
            if PT.TouchWindowActivity then PT.TouchWindowActivity(false) end
            if PT.ApplyWindowControlSettings then PT.ApplyWindowControlSettings() end
        end
    )

    do
        local defaultValue = 2.0
        local setting = Settings.RegisterAddOnSetting(
            category,
            "PartyTranslator_AutoMinimizeDelay",
            "autoMinimizeDelay",
            PartyTranslatorDB,
            type(defaultValue),
            "Сворачивать через",
            defaultValue
        )

        local function GetDelayOptions()
            local container = Settings.CreateControlTextContainer()
            for i = 1, 20 do
                local value = i * 0.5
                local label
                if value == 0.5 then
                    label = "0,5 мин"
                elseif value == math.floor(value) then
                    label = string.format("%d мин", value)
                else
                    label = string.format("%.1f мин", value):gsub("%.", ",")
                end
                container:Add(value, label)
            end
            return container:GetData()
        end

        Settings.CreateDropdown(
            category,
            setting,
            GetDelayOptions,
            "Время без входящих или исходящих сообщений перед автоматическим сворачиванием: от 0,5 до 10 минут."
        )
        RegisterLiveCallback("PartyTranslator_AutoMinimizeDelay", "autoMinimizeDelay", function()
            if PT.TouchWindowActivity then PT.TouchWindowActivity(false) end
        end)
    end

    if layout and CreateSettingsListSectionHeaderInitializer then
        layout:AddInitializer(CreateSettingsListSectionHeaderInitializer("Внешний вид окна"))
    end

    do
        local defaultValue = 1
        local setting = Settings.RegisterAddOnSetting(
            category,
            "PartyTranslator_TranslationColor",
            "translationColor",
            PartyTranslatorDB,
            type(defaultValue),
            "Цвет перевода",
            defaultValue
        )

        local function GetColorOptions()
            local container = Settings.CreateControlTextContainer()
            local colors = PT.TranslationColors or {}
            for i = 1, #colors do
                local color = colors[i]
                container:Add(i, "|cff" .. color.hex .. color.name .. "|r")
            end
            return container:GetData()
        end

        Settings.CreateDropdown(
            category,
            setting,
            GetColorOptions,
            "Меняет цвет перевода в окне PartyTranslator."
        )
        RegisterLiveCallback("PartyTranslator_TranslationColor", "translationColor", ApplyAppearanceNow)
    end

    if layout and CreateSettingsButtonInitializer then
        layout:AddInitializer(CreateSettingsButtonInitializer(
            "Цвет фона окна",
            "Открыть палитру",
            function()
                if PT.OpenBackgroundColorPicker then
                    PT.OpenBackgroundColorPicker()
                end
            end,
            "Открывает стандартный выбор цвета Blizzard с полями R, G, B и прозрачностью для фона окна PartyTranslator.",
            true
        ))
    end


    if layout and CreateSettingsButtonInitializer then
        layout:AddInitializer(CreateSettingsButtonInitializer(
            "Цвет активной вкладки",
            "Открыть палитру",
            function()
                if PT.OpenTabColorPicker then
                    PT.OpenTabColorPicker("active")
                end
            end,
            "Цвет вкладки, в которую сейчас будет отправлено сообщение по Enter.",
            true
        ))

        layout:AddInitializer(CreateSettingsButtonInitializer(
            "Цвет неактивных вкладок",
            "Открыть палитру",
            function()
                if PT.OpenTabColorPicker then
                    PT.OpenTabColorPicker("inactive")
                end
            end,
            "Цвет остальных вкладок группы и личных сообщений.",
            true
        ))
    end

    AddSlider(
        "fontSize",
        "FontSize",
        "Размер шрифта",
        "Меняет размер текста в окне переводчика.",
        14,
        11,
        22,
        1,
        ApplyAppearanceNow
    )

    AddSlider(
        "windowAlpha",
        "WindowAlpha",
        "Прозрачность окна",
        "Меняет прозрачность фона окна PartyTranslator.",
        0.38,
        0.10,
        0.95,
        0.05,
        ApplyAppearanceNow
    )


    AddSlider(
        "windowWidth",
        "WindowWidth",
        "Ширина окна",
        "Меняет базовую ширину окна PartyTranslator.",
        366,
        150,
        900,
        10,
        function(value)
            if PT.SetWindowBaseSize then
                PT.SetWindowBaseSize(value, nil)
            end
        end
    )

    AddSlider(
        "windowHeight",
        "WindowHeight",
        "Высота окна",
        "Меняет базовую высоту окна PartyTranslator.",
        196,
        150,
        700,
        10,
        function(value)
            if PT.SetWindowBaseSize then
                PT.SetWindowBaseSize(nil, value)
            end
        end
    )

    if layout and CreateSettingsListSectionHeaderInitializer then
        layout:AddInitializer(CreateSettingsListSectionHeaderInitializer("Каналы чата"))
    end

    AddCheckbox(
        "party",
        "PartyChat",
        "Переводить чат группы",
        "Party и Party Leader.",
        true
    )

    AddCheckbox(
        "instance",
        "InstanceChat",
        "Переводить чат подземелья",
        "Instance Chat и Instance Leader — основной вариант для случайных групп и ключей.",
        true
    )

    AddCheckbox(
        "raid",
        "RaidChat",
        "Переводить рейдовый чат",
        "Raid и Raid Leader. По умолчанию выключено.",
        false
    )

    AddCheckbox(
        "whisper",
        "WhisperChat",
        "Переводить личные сообщения",
        "Входящие обычные Whisper и личные сообщения Battle.net: английский → русский.",
        true
    )

    if layout and CreateSettingsListSectionHeaderInitializer then
        layout:AddInitializer(CreateSettingsListSectionHeaderInitializer("Тест сообщений"))
    end

    if layout and CreateSettingsButtonInitializer then
        layout:AddInitializer(CreateSettingsButtonInitializer(
            "Тест сообщения группы",
            "Отправить тест",
            function()
                if PT.TestIncomingMessage then
                    PT.TestIncomingMessage("GROUP")
                end
            end,
            "Имитирует входящее английское сообщение в группе. Проверяет EN→RU перевод, историю группы, непрочитанные сообщения и уведомление свернутого окна.",
            true
        ))

        layout:AddInitializer(CreateSettingsButtonInitializer(
            "Тест личного сообщения",
            "Отправить тест",
            function()
                if PT.TestIncomingMessage then
                    PT.TestIncomingMessage("WHISPER")
                end
            end,
            "Имитирует входящее личное сообщение и создаёт тестовую вкладку Testfriend. Работает даже если персонаж сейчас не находится в группе.",
            true
        ))

        layout:AddInitializer(CreateSettingsButtonInitializer(
            "Как сообщить об ошибке перевода",
            "Показать",
            function()
                if PT.ShowFirstRunHelp then
                    PT.ShowFirstRunHelp(true)
                end
            end,
            "Повторно показывает инструкцию: как отметить неверный входящий/исходящий перевод и какой SavedVariables-файл передать разработчику.",
            true
        ))
    end

    if layout and CreateSettingsListSectionHeaderInitializer then
        layout:AddInitializer(CreateSettingsListSectionHeaderInitializer("Исходящие сообщения"))
    end

    AddCheckbox(
        "outgoing",
        "OutgoingTranslation",
        "Включить перевод Русский → Английский",
        "Позволяет писать по-русски через /tr или отдельное окно PartyTranslator и отправлять английский перевод прямо в Party / Instance / Raid или ответом в личку.",
        true
    )

    Settings.RegisterAddOnCategory(category)
    PT.settingsRegistered = true
end

function PT.OpenSettings()
    if not PT.settingsRegistered and PT.RegisterSettings then
        PT.RegisterSettings()
    end

    if Settings and Settings.OpenToCategory and PT.settingsCategory then
        local id = PT.settingsCategory.GetID and PT.settingsCategory:GetID() or PT.settingsCategory.ID
        if id then
            Settings.OpenToCategory(id)
            return true
        end
    end
    return false
end
