-- Цветовая схема (в стиле остальных интерфейсов)
local PLUGIN = PLUGIN

local COLOR_BG_DARK = Color(3, 5, 4)
local COLOR_BG_MEDIUM = Color(8, 12, 10)
local COLOR_BG_LIGHT = Color(12, 18, 14)
local COLOR_PRIMARY = Color(27, 94, 32)
local COLOR_PRIMARY_HOVER = Color(33, 110, 38)
local COLOR_ACCENT = Color(56, 102, 35)
local COLOR_ACCENT_HOVER = Color(66, 120, 45)
local COLOR_BORDER = Color(46, 125, 50, 80)
local COLOR_TEXT_PRIMARY = Color(165, 214, 167)
local COLOR_TEXT_SECONDARY = Color(129, 199, 132)
local COLOR_TEXT_DIM = Color(100, 150, 105)

-- Хук для камеры во время анимации
function PLUGIN:CalcView(ply, pos, angles, fov)
    local str = ply:GetNW2String('TauntAnim')
    if str != "" then
        if GetConVar("rp_taunt_firstperson"):GetBool() then
            local eye_id = ply:LookupAttachment('eyes')
            local att = eye_id > 0 and ply:GetAttachment(eye_id) or nil

            if not att then return end

            local ang1 = angles
            if GetConVar("rp_taunt_realistic_firstperson"):GetBool() then
                ang1 = att.Ang
            end
            local view = {
                origin = att.Pos,
                angles = ang1,
                fov = fov,
                drawviewer = true
            }
            return view
        else
            local view = {
                origin = pos - (angles:Forward() * 100),
                angles = angles,
                fov = fov,
                drawviewer = true
            }
            return view
        end
    end
end

function PLUGIN:ShouldDrawLocalPlayer(ply)
    local str = ply:GetNW2String('TauntAnim')
    if str != "" and not GetConVar("rp_taunt_firstperson"):GetBool() then
        return true
    end
end

-- Подсказка на экране
function PLUGIN:HUDPaint()
    local ply = LocalPlayer()
    local str = ply:GetNW2String('TauntAnim')
    if str != "" then
        draw.SimpleTextOutlined("Нажмите SHIFT, чтобы убрать анимацию.", "Trebuchet18", ScrW()/2, ScrH()-250, color_white, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER, 1, color_black)
    end
end

-- Таблица анимаций (импортируем из существующего аддона)
local AnimationCategories = {
    {
        name = "ЖЕСТЫ",
        anims = {
            {id = 1, name = "Помахать руками"},
            {id = 2, name = "Помахать рукой"},
            {id = 3, name = "Показать пальцем вперед"},
            {id = 4, name = "Показать пальцем назад"},
            {id = 5, name = "Поправить галстук"},
        }
    },
    {
        name = "СПОРТ",
        anims = {
            {id = 6, name = "Приседания"},
            {id = 7, name = "Отжимания"},
            {id = 8, name = "Подъем корпуса"},
            {id = 9, name = "Берпи"},
        }
    },
    {
        name = "ПОЗЫ",
        anims = {
            {id = 10, name = "Стоять злобно"},
            {id = 11, name = "Стоять напуганно"},
            {id = 12, name = "Стоять, сложив руки"},
            {id = 13, name = "Стоять, руки на поясе"},
            {id = 14, name = "Стоять, держась за пояс"},
            {id = 15, name = "Сидеть, рука на колене"},
            {id = 16, name = "Сидеть в позе лотоса"},
            {id = 17, name = "Сидеть в сонном состоянии"},
            {id = 18, name = "Лежать в плохом состоянии"},
        }
    },
    {
        name = "ТАНЦЫ",
        anims = {
            {id = 19, name = "Танец 1"},
            {id = 20, name = "Танец 2"},
            {id = 21, name = "Танец 3"},
            {id = 22, name = "Танец 4"},
            {id = 33, name = "Танец в присядь"},
        }
    },
    {
        name = "ДЕЙСТВИЯ",
        anims = {
            {id = 23, name = "Согласие"},
            {id = 24, name = "Несогласие"},
            {id = 25, name = "Позвать с собой"},
            {id = 26, name = "Поклониться"},
            {id = 27, name = "Отдать честь"},
            {id = 28, name = "Пить кофе"},
            {id = 29, name = "Смотреть на объект"},
            {id = 30, name = "Записывать в блокнот"},
            {id = 31, name = "Спать"},
            {id = 32, name = "Воинское приветствие"},
        }
    }
}

local animMenu = nil
local animMenuOpen = false

-- Функция создания меню анимаций
local function CreateAnimationMenu()
    if IsValid(animMenu) then
        animMenu:Remove()
    end
    
    -- Невидимая панель на весь экран для перехвата ввода
    local basePanel = vgui.Create("DPanel")
    basePanel:SetSize(ScrW(), ScrH())
    basePanel:SetPos(0, 0)
    basePanel:MakePopup()
    basePanel.Paint = function() end -- Полностью прозрачная
    
    -- Меню в правом верхнем углу
    local menuWidth = 320
    local menuHeight = 500
    local padding = 20
    
    local menu = vgui.Create("DPanel", basePanel)
    menu:SetSize(menuWidth, menuHeight)
    menu:SetPos(ScrW() - menuWidth - padding, padding)
    menu.Paint = function(s, w, h)
        -- Основной фон
        draw.RoundedBox(8, 0, 0, w, h, COLOR_BG_DARK)
        
        -- Заголовок
        draw.RoundedBoxEx(8, 0, 0, w, 45, COLOR_BG_MEDIUM, true, true, false, false)
        surface.SetDrawColor(COLOR_BORDER)
        surface.DrawLine(0, 45, w, 45)
        
        -- Текст заголовка
        draw.SimpleText("АНИМАЦИИ", "DermaLarge", w/2, 22, COLOR_TEXT_PRIMARY, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
        
        -- Декоративная линия
        surface.SetDrawColor(COLOR_ACCENT)
        surface.DrawRect(10, 43, w-20, 2)
        
        -- Внешняя граница
        surface.SetDrawColor(COLOR_BORDER)
        surface.DrawOutlinedRect(0, 0, w, h, 1)
        
        -- Подсказка внизу
        draw.SimpleText("C - Закрыть | SHIFT - Остановить анимацию", "DermaDefault", w/2, h-15, COLOR_TEXT_DIM, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
    end
    
    -- Кнопка закрытия
    local closeBtn = vgui.Create("DButton", menu)
    closeBtn:SetPos(menuWidth - 35, 8)
    closeBtn:SetSize(28, 28)
    closeBtn:SetText("")
    closeBtn.Paint = function(s, w, h)
        local col = s:IsHovered() and COLOR_ACCENT_HOVER or COLOR_ACCENT
        draw.RoundedBox(4, 0, 0, w, h, col)
        draw.SimpleText("×", "DermaLarge", w/2, h/2-2, COLOR_TEXT_PRIMARY, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
    end
    closeBtn.DoClick = function()
        basePanel:Remove()
        animMenuOpen = false
    end
    
    -- Скролл панель для категорий
    local scroll = vgui.Create("DScrollPanel", menu)
    scroll:SetPos(10, 55)
    scroll:SetSize(menuWidth - 20, menuHeight - 90)
    
    local sbar = scroll:GetVBar()
    sbar:SetWide(6)
    sbar.Paint = function(s, w, h)
        draw.RoundedBox(3, 0, 0, w, h, COLOR_BG_MEDIUM)
    end
    sbar.btnGrip.Paint = function(s, w, h)
        draw.RoundedBox(3, 0, 0, w, h, COLOR_ACCENT)
    end
    sbar.btnUp.Paint = function() end
    sbar.btnDown.Paint = function() end
    
    -- Создаем категории с анимациями
    for _, category in ipairs(AnimationCategories) do
        -- Заголовок категории
        local catHeader = vgui.Create("DPanel", scroll)
        catHeader:Dock(TOP)
        catHeader:DockMargin(0, 5, 0, 3)
        catHeader:SetTall(28)
        catHeader.Paint = function(s, w, h)
            draw.RoundedBox(4, 0, 0, w, h, COLOR_PRIMARY)
            surface.SetDrawColor(COLOR_BORDER)
            surface.DrawOutlinedRect(0, 0, w, h, 1)
            draw.SimpleText(category.name, "DermaDefaultBold", 10, h/2, COLOR_TEXT_PRIMARY, TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER)
        end
        
        -- Анимации в категории
        for _, anim in ipairs(category.anims) do
            local animBtn = vgui.Create("DButton", scroll)
            animBtn:Dock(TOP)
            animBtn:DockMargin(3, 2, 3, 0)
            animBtn:SetTall(32)
            animBtn:SetText("")
            
            animBtn.Paint = function(s, w, h)
                local col = COLOR_BG_MEDIUM
                if s:IsHovered() then
                    col = COLOR_PRIMARY_HOVER
                    -- Акцентная линия слева
                    surface.SetDrawColor(COLOR_ACCENT)
                    surface.DrawRect(0, 0, 3, h)
                end
                
                draw.RoundedBox(4, 0, 0, w, h, col)
                surface.SetDrawColor(COLOR_BORDER)
                surface.DrawOutlinedRect(0, 0, w, h, 1)
                
                -- Иконка
                draw.SimpleText("▶", "DermaDefault", 12, h/2, COLOR_TEXT_SECONDARY, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
                
                -- Название анимации
                draw.SimpleText(anim.name, "DermaDefault", 28, h/2, COLOR_TEXT_PRIMARY, TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER)
            end
            
            animBtn.DoClick = function()
                RunConsoleCommand("rp_set_taunt", tostring(anim.id))
                surface.PlaySound("buttons/button15.wav")
                basePanel:Remove()
                animMenuOpen = false
            end
        end
    end
    
    -- Обработка закрытия по нажатию вне меню
    basePanel.OnMousePressed = function(s, keyCode)
        if keyCode == MOUSE_LEFT then
            -- Проверяем, кликнули ли вне меню
            local mx, my = input.GetCursorPos()
            local x, y = menu:GetPos()
            local w, h = menu:GetSize()
            
            if mx < x or mx > x + w or my < y or my > y + h then
                basePanel:Remove()
                animMenuOpen = false
            end
        end
    end
    
    -- Меню рации в левом верхнем углу
    local radioWidth = 320
    local radioHeight = 200
    
    local radioMenu = vgui.Create("DPanel", basePanel)
    radioMenu:SetSize(radioWidth, radioHeight)
    radioMenu:SetPos(padding, padding)
    radioMenu.Paint = function(s, w, h)
        -- Основной фон
        draw.RoundedBox(8, 0, 0, w, h, COLOR_BG_DARK)
        
        -- Заголовок
        draw.RoundedBoxEx(8, 0, 0, w, 45, COLOR_BG_MEDIUM, true, true, false, false)
        surface.SetDrawColor(COLOR_BORDER)
        surface.DrawLine(0, 45, w, 45)
        
        -- Текст заголовка
        draw.SimpleText("ЧАСТОТА РАЦИИ", "DermaLarge", w/2, 22, COLOR_TEXT_PRIMARY, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
        
        -- Декоративная линия
        surface.SetDrawColor(COLOR_ACCENT)
        surface.DrawRect(10, 43, w-20, 2)
        
        -- Внешняя граница
        surface.SetDrawColor(COLOR_BORDER)
        surface.DrawOutlinedRect(0, 0, w, h, 1)
    end
    
    -- Получаем плагин рации
    local radioPlugin = ix.plugin.list["radio"]
    if not radioPlugin then
        radioMenu:SetVisible(false)
    else
        local currentFreq = radioPlugin:GetFrequency(LocalPlayer())
        
        -- Текущая частота
        local freqLabel = vgui.Create("DLabel", radioMenu)
        freqLabel:SetPos(20, 60)
        freqLabel:SetSize(radioWidth - 40, 25)
        freqLabel:SetText("Текущая частота: " .. string.format("%0." .. radioPlugin.frequencyPrecision .. "f", currentFreq))
        freqLabel:SetFont("DermaDefault")
        freqLabel:SetTextColor(COLOR_TEXT_PRIMARY)
        
        -- Слайдер частоты
        local freqSlider = vgui.Create("DNumSlider", radioMenu)
        freqSlider:SetPos(10, 90)
        freqSlider:SetSize(radioWidth - 20, 40)
        freqSlider:SetText("")
        freqSlider:SetMin(radioPlugin.minFrequency)
        freqSlider:SetMax(radioPlugin.maxFrequency)
        freqSlider:SetDecimals(radioPlugin.frequencyPrecision)
        freqSlider:SetValue(currentFreq)
        
        freqSlider.Label:SetTextColor(COLOR_TEXT_SECONDARY)
        freqSlider.Label:SetFont("DermaDefault")
        freqSlider.TextArea:SetTextColor(COLOR_TEXT_PRIMARY)
        freqSlider.TextArea:SetFont("DermaDefault")
        freqSlider.TextArea:SetEditable(true)
        freqSlider.TextArea:SetNumeric(true)
        freqSlider.TextArea.Paint = function(panel, w, h)
            draw.RoundedBox(4, 0, 0, w, h, COLOR_BG_MEDIUM)
            surface.SetDrawColor(COLOR_BORDER)
            surface.DrawOutlinedRect(0, 0, w, h, 1)
            panel:DrawTextEntryText(COLOR_TEXT_PRIMARY, COLOR_ACCENT, COLOR_TEXT_PRIMARY)
        end
        
        -- Обработчик ввода вручную
        freqSlider.TextArea.OnEnter = function(panel)
            local val = tonumber(panel:GetValue())
            if val then
                val = math.Clamp(val, radioPlugin.minFrequency, radioPlugin.maxFrequency)
                freqSlider:SetValue(val)
            end
        end
        
        freqSlider.Slider.Paint = function(panel, w, h)
            draw.RoundedBox(4, 0, h/2-2, w, 4, COLOR_BG_MEDIUM)
            local progress = (freqSlider:GetValue() - freqSlider:GetMin()) / (freqSlider:GetMax() - freqSlider:GetMin())
            draw.RoundedBox(4, 0, h/2-2, w * progress, 4, COLOR_ACCENT)
        end
        
        freqSlider.Slider.Knob.Paint = function(s, w, h)
            draw.RoundedBox(w/2, 0, 0, w, h, COLOR_PRIMARY)
            if s:IsHovered() then
                draw.RoundedBox(w/2, 2, 2, w-4, h-4, COLOR_ACCENT_HOVER)
            end
        end
        
        freqSlider.OnValueChanged = function(_, value)
            local format = "%0." .. radioPlugin.frequencyPrecision .. "f"
            freqLabel:SetText("Текущая частота: " .. string.format(format, value))
        end
        
        -- Кнопка применения
        local btnWidth = (radioWidth - 50) / 2
        local applyBtn = vgui.Create("DButton", radioMenu)
        applyBtn:SetPos(20, 150)
        applyBtn:SetSize(btnWidth, 35)
        applyBtn:SetText("")
        applyBtn.Paint = function(s, w, h)
            local col = s:IsHovered() and COLOR_PRIMARY_HOVER or COLOR_PRIMARY
            draw.RoundedBox(6, 0, 0, w, h, col)
            
            surface.SetDrawColor(COLOR_BORDER)
            surface.DrawOutlinedRect(0, 0, w, h, 2)
            
            draw.SimpleText("ПРИМЕНИТЬ", "DermaDefaultBold", w/2, h/2, COLOR_TEXT_PRIMARY, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
        end
        applyBtn.DoClick = function()
            net.Start("ixRadioSetFrequency")
                net.WriteFloat(freqSlider:GetValue())
            net.SendToServer()
            
            LocalPlayer():Notify("Частота рации изменена на: " .. string.format("%0." .. radioPlugin.frequencyPrecision .. "f", freqSlider:GetValue()))
        end
        
        -- Кнопка ручного ввода
        local manualBtn = vgui.Create("DButton", radioMenu)
        manualBtn:SetPos(30 + btnWidth, 150)
        manualBtn:SetSize(btnWidth, 35)
        manualBtn:SetText("")
        manualBtn.Paint = function(s, w, h)
            local col = s:IsHovered() and COLOR_ACCENT_HOVER or COLOR_ACCENT
            draw.RoundedBox(6, 0, 0, w, h, col)
            
            surface.SetDrawColor(COLOR_BORDER)
            surface.DrawOutlinedRect(0, 0, w, h, 2)
            
            draw.SimpleText("ВВЕСТИ", "DermaDefaultBold", w/2, h/2, COLOR_TEXT_PRIMARY, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
        end
        manualBtn.DoClick = function()
            Derma_StringRequest(
                "Ввод частоты",
                "Введите частоту рации (от " .. radioPlugin.minFrequency .. " до " .. radioPlugin.maxFrequency .. "):",
                tostring(currentFreq),
                function(text)
                    local freq = tonumber(text)
                    if freq then
                        freq = math.Clamp(freq, radioPlugin.minFrequency, radioPlugin.maxFrequency)
                        
                        net.Start("ixRadioSetFrequency")
                            net.WriteFloat(freq)
                        net.SendToServer()
                        
                        freqSlider:SetValue(freq)
                        LocalPlayer():Notify("Частота рации изменена на: " .. string.format("%0." .. radioPlugin.frequencyPrecision .. "f", freq))
                    else
                        LocalPlayer():Notify("Неверный формат частоты!")
                    end
                end,
                function() end
            )
        end
    end
    
    -- Кнопки включения/выключения рации (справа от меню рации)
    if radioPlugin then
        local controlsWidth = 150
        local controlsHeight = 200
        
        local controlsPanel = vgui.Create("DPanel", basePanel)
        controlsPanel:SetSize(controlsWidth, controlsHeight)
        controlsPanel:SetPos(padding + radioWidth + 10, padding)
        controlsPanel.Paint = function(s, w, h)
            -- Основной фон
            draw.RoundedBox(8, 0, 0, w, h, COLOR_BG_DARK)
            
            -- Заголовок
            draw.RoundedBoxEx(8, 0, 0, w, 45, COLOR_BG_MEDIUM, true, true, false, false)
            surface.SetDrawColor(COLOR_BORDER)
            surface.DrawLine(0, 45, w, 45)
            
            -- Текст заголовка
            draw.SimpleText("РАЦИЯ", "DermaDefault", w/2, 22, COLOR_TEXT_PRIMARY, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
            
            -- Декоративная линия
            surface.SetDrawColor(COLOR_ACCENT)
            surface.DrawRect(10, 43, w-20, 2)
            
            -- Внешняя граница
            surface.SetDrawColor(COLOR_BORDER)
            surface.DrawOutlinedRect(0, 0, w, h, 1)
        end
        
        -- Кнопка включения прослушивания
        local listenBtn = vgui.Create("DButton", controlsPanel)
        listenBtn:SetPos(10, 60)
        listenBtn:SetSize(controlsWidth - 20, 40)
        listenBtn:SetText("")
        listenBtn.Paint = function(s, w, h)
            local isListening = radioPlugin:IsListening(LocalPlayer())
            local col = isListening and COLOR_ACCENT or COLOR_BG_MEDIUM
            if s:IsHovered() then
                col = isListening and COLOR_ACCENT_HOVER or COLOR_PRIMARY_HOVER
            end
            
            draw.RoundedBox(6, 0, 0, w, h, col)
            surface.SetDrawColor(COLOR_BORDER)
            surface.DrawOutlinedRect(0, 0, w, h, 2)
            
            local status = isListening and "ВКЛ" or "ВЫКЛ"
            draw.SimpleText("Прослушивание", "DermaDefault", w/2, h/2 - 7, COLOR_TEXT_PRIMARY, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
            draw.SimpleText(status, "DermaDefaultBold", w/2, h/2 + 7, COLOR_TEXT_SECONDARY, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
        end
        listenBtn.DoClick = function()
            net.Start("ixRadioToggleListen")
            net.SendToServer()
            
            timer.Simple(0.1, function()
                local status = radioPlugin:IsListening(LocalPlayer()) and "включено" or "выключено"
                LocalPlayer():Notify("Прослушивание рации " .. status)
            end)
        end
        
        -- Кнопка включения передачи
        local transmitBtn = vgui.Create("DButton", controlsPanel)
        transmitBtn:SetPos(10, 110)
        transmitBtn:SetSize(controlsWidth - 20, 40)
        transmitBtn:SetText("")
        transmitBtn.Paint = function(s, w, h)
            local isTransmitting = radioPlugin:IsTransmitting(LocalPlayer())
            local col = isTransmitting and COLOR_ACCENT or COLOR_BG_MEDIUM
            if s:IsHovered() then
                col = isTransmitting and COLOR_ACCENT_HOVER or COLOR_PRIMARY_HOVER
            end
            
            draw.RoundedBox(6, 0, 0, w, h, col)
            surface.SetDrawColor(COLOR_BORDER)
            surface.DrawOutlinedRect(0, 0, w, h, 2)
            
            local status = isTransmitting and "ВКЛ" or "ВЫКЛ"
            draw.SimpleText("Передача", "DermaDefault", w/2, h/2 - 7, COLOR_TEXT_PRIMARY, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
            draw.SimpleText(status, "DermaDefaultBold", w/2, h/2 + 7, COLOR_TEXT_SECONDARY, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
        end
        transmitBtn.DoClick = function()
            net.Start("ixRadioToggleTransmit")
            net.SendToServer()
            
            timer.Simple(0.1, function()
                local status = radioPlugin:IsTransmitting(LocalPlayer()) and "включена" or "выключена"
                LocalPlayer():Notify("Передача рации " .. status)
            end)
        end
    end
    
    animMenu = basePanel
    animMenuOpen = true
end

-- Блокировка стандартного Context Menu и открытие нашего
hook.Add("OnContextMenuOpen", "AnimationMenuOverride", function()
    -- Проверка на Alt+C для администраторов (открывает стандартное меню)
    if input.IsKeyDown(KEY_LALT) or input.IsKeyDown(KEY_RALT) then
        local client = LocalPlayer()
        if IsValid(client) and client:GetCharacter() then
            -- Проверка на права администратора
            if client:IsAdmin() or client:IsSuperAdmin() then
                return -- Пропускаем и открываем стандартное меню
            end
        end
    end
    
    if not animMenuOpen then
        CreateAnimationMenu()
    end
    return false -- Блокируем стандартное меню
end)

-- Закрытие меню при закрытии Context Menu
hook.Add("OnContextMenuClose", "AnimationMenuClose", function()
    if animMenuOpen and IsValid(animMenu) then
        animMenu:Remove()
        animMenuOpen = false
    end
end)

-- Подсказка на HUD
--hook.Add("HUDPaint", "AnimationMenuHint", function()
--    if not animMenuOpen then
--        draw.SimpleTextOutlined("C - Открыть меню (анимации + рация)", "DermaDefault", ScrW() - 10, ScrH() - 30, COLOR_TEXT_DIM, TEXT_ALIGN_RIGHT, TEXT_ALIGN_CENTER, 1, Color(0, 0, 0, 200))
--    end
--end)
