--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| 	Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]

local PANEL = {}
local PLUGIN = PLUGIN

local titlePushDown = SScaleMin(85 / 3)
local fixHeight = SScaleMin(55 / 3)
local scale780 = SScaleMin(780 / 3)
local scale120 = SScaleMin(120 / 3)

function PANEL:Init()
	ix.gui.skills = self

	local margin = SScaleMin(10 / 3)
	local topPushDown = SScaleMin(150 / 3)

	self:SetWide(ScrW() - (topPushDown * 2))

	local sizeXtitle, sizeYtitle = self:GetWide(), scale120
	local sizeXcontent, sizeYcontent = self:GetWide(), (scale780) - fixHeight

	self.titlePanel = self:Add("Panel")
	self.titlePanel:SetSize(sizeXtitle, sizeYtitle)
	self.titlePanel:SetPos(self:GetWide() * 0.5 - self.titlePanel:GetWide() * 0.5)

	self.contentPanel = self:Add("Panel")
	self.contentPanel:SetSize(sizeXcontent, sizeYcontent)
	self.contentPanel:SetPos(self:GetWide() * 0.5 - self.contentPanel:GetWide() * 0.5, titlePushDown)

	self:SetTall(scale120 + scale780 - fixHeight + titlePushDown)
	self:Center()

	local skillsIcon = self.titlePanel:Add("DImage")
	skillsIcon:SetImage("willardnetworks/tabmenu/navicons/crafting.png")
	skillsIcon:SetSize(SScaleMin(18 / 3), SScaleMin(18 / 3))
	skillsIcon:SetPos(0, SScaleMin(3 / 3))

	local skillsTitle = self.titlePanel:Add("DLabel")
	skillsTitle:SetFont("TitlesFontNoClamp")
	skillsTitle:SetText(LocalPlayer():Name() .. "")
	skillsTitle:SetPos(SScaleMin(26 / 3))
	skillsTitle:SizeToContents()

	local skillsDesc = self.titlePanel:Add("DLabel")
	skillsDesc:SetFont("MenuFontLargerNoClamp")
	skillsDesc:SetText("Rappel : le niveau maximal combiné est de " .. ix.config.Get("MaxTotalSkill", 0) .. ".")
	skillsDesc:SetTextColor(Color(200, 200, 200, 255))
	skillsDesc:SetPos(0, SScaleMin(25 / 3) + margin * 0.7)
	skillsDesc:SizeToContents()

	local skillsDesc2 = self.titlePanel:Add("DLabel")
	skillsDesc2:SetFont("MenuFontLargerBoldNoFix")
	skillsDesc2:SetTextColor(Color(255, 78, 69, 255))
	skillsDesc2:SetText("Niveaux actuels : " .. LocalPlayer():GetCharacter():GetTotalSkillLevel() .. "/" .. ix.config.Get("MaxTotalSkill", 0))
	skillsDesc2:SetPos(0, SScaleMin(42 / 3) + margin * 0.7)
	skillsDesc2:SizeToContents()

	self:CreateAttributesPanel()

	self.panels = {}

	hook.Run("CreateSkillPanels", self.panels) -- Create subpanels for example Crafting

	self:CreateSkills()
end

function PANEL:CreateSkills()
	if (self.skillPanels) then
		for _, v in ipairs(self.skillPanels) do
			v:Remove()
		end
	end

	self.skillPanels = {}

	local character = LocalPlayer():GetCharacter()

	self.skillGrid = self.contentPanel:Add("DGrid")
	self.skillGrid:Dock(FILL)
	self.skillGrid:SetCols( 3 )
	self.skillGrid:SetColWide( self.contentPanel:GetWide() / 3 )
	self.skillGrid:SetRowHeight( self.contentPanel:GetTall() / 3 )

	for skillID, skillInfo in SortedPairs(ix.skill.list) do
		if character:GetFaction() != FACTION_VORT and skillInfo.name == "Vortessence" then
			continue
		end

		self.skillPanels[skillID] = self:CreateSkillPanel(skillID, skillInfo)
	end
end

function PANEL:CreateSkillPanel(skillID, skillInfo)
	local bottomPanelH = SScaleMin(35 / 3)
	local character = LocalPlayer():GetCharacter()

	local skillPanel = vgui.Create("Panel")
	skillPanel:SetSize((self.contentPanel:GetWide() / 3) - SScaleMin(10 / 3), (self.contentPanel:GetTall() / 3) - SScaleMin(10 / 3))
	skillPanel:Center()
	skillPanel.Paint = function(_, w, h)
		surface.SetDrawColor(color_white)
		surface.SetMaterial(ix.util.GetMaterial(skillInfo.image))
		surface.DrawTexturedRect(0, 0, w, h - bottomPanelH)

		surface.SetDrawColor(ColorAlpha(color_black, 100))
		surface.DrawRect(0, h - bottomPanelH, w, bottomPanelH)

		surface.SetDrawColor(Color(116, 113, 130, 255))
		surface.DrawOutlinedRect(0, 0, w, h)

		surface.DrawLine(0, h - bottomPanelH, w, h - bottomPanelH)
	end

	-- Bottom Panel
	local dPadding = SScaleMin(5 / 3)
	local bottomPanel = skillPanel:Add("Panel")
	bottomPanel:Dock(BOTTOM)
	bottomPanel:SetTall(bottomPanelH)

	local skillName = bottomPanel:Add("DLabel")
	self:CreateSkillLabel(skillName, skillInfo.name, "TitlesFontNoClamp", dPadding * 4, dPadding * 2)

	skillPanel.skillLevel = bottomPanel:Add("DLabel")
	self:CreateSkillLabel(skillPanel.skillLevel, "Niveau : " .. character:GetSkillLevel(skillID) .. "/" .. ix.skill.MAX_SKILL, "MenuFontLargerNoClamp", 0, 0, Color(255, 204, 0, 255))

	local experiencePanel = bottomPanel:Add("Panel")
	experiencePanel:Dock(RIGHT)
	experiencePanel:SetWide(SScaleMin(200 / 3))
	experiencePanel:DockMargin(dPadding * 2, dPadding, dPadding * 4, dPadding)
	experiencePanel:DockPadding(dPadding, dPadding, dPadding, dPadding)
	experiencePanel.Paint = function(_, w, h)
		surface.SetDrawColor(ColorAlpha(color_black, 100))
		surface.DrawRect(0, 0, w, h)

		surface.SetDrawColor(Color(116, 113, 130, 255))
		surface.DrawOutlinedRect(0, 0, w, h)
	end

	local skillProgress = math.Clamp(character:GetSkillStoredExp(skillID) / 1000, 0, 1)

	skillPanel.progressBar = experiencePanel:Add("Panel")
	skillPanel.progressBar:Dock(FILL)
	skillPanel.progressBar.progress = skillProgress
	skillPanel.progressBar.Paint = function(panel, w, h)
		surface.SetDrawColor(Color(255, 78, 70, 255))
		surface.DrawRect(0, 0, w * panel.progress, h)
	end

	skillPanel.processLabel = skillPanel.progressBar:Add("DLabel")
	skillPanel.processLabel.skillID = skillID
	skillPanel.processLabel.SetupText = function(panel, char)
		if (char:GetSkill(skillID) == ix.skill.MAX_SKILL) then
			panel:SetText("NIVEAU MAX")
		elseif (char:GetTotalSkillLevel() == ix.config.Get("MaxTotalSkill")) then
			panel:SetText("NIVEAU MAX TOTAL")
		elseif (char:CanLevelSkill(panel.skillID)) then
			panel:SetText("NIVEAU SUPÉRIEUR")
		else
			local skillProg = math.Clamp(character:GetSkillStoredExp(panel.skillID) / 1000, 0, 1)
			panel:SetText((skillProg * 100) .. "%")
		end
	end

	skillPanel.processLabel:SetupText(character)
	skillPanel.processLabel:SetFont("MenuFontLargerNoClamp")
	skillPanel.processLabel:SetContentAlignment(5)
	skillPanel.processLabel:Dock(FILL)

	local levelUp = skillPanel.progressBar:Add("DButton")
	levelUp:Dock(FILL)
	levelUp:SetText("")
	levelUp.Paint = nil
	levelUp.DoClick = function()
		if character:CanLevelSkill(skillID) then
			surface.PlaySound("helix/ui/press.wav")

			net.Start("ixSkillLevelUp")
			net.WriteString(skillID)
			net.SendToServer()
		end
	end

	local imagePanel = skillPanel:Add("Panel")
	imagePanel:Dock(FILL)

	local boostPanel = imagePanel:Add("Panel")
	boostPanel:SetSize(skillPanel:GetWide(), skillPanel:GetTall() - bottomPanelH)
	boostPanel:DockPadding(dPadding * 4, dPadding * 3, dPadding * 4, dPadding * 4)
	boostPanel.Paint = self.CoolHover

	local skillButton = imagePanel:Add("DButton")
	skillButton:Dock(FILL)
	skillButton:SetText("")
	skillButton:DockPadding(dPadding * 4, dPadding * 4, dPadding * 4, dPadding * 4)
	skillButton.Paint = nil

	skillButton.OnCursorEntered = function()
		surface.PlaySound("helix/ui/rollover.wav")
		boostPanel.Paint = nil
	end

	skillButton.OnCursorExited = function()
		boostPanel.Paint = self.CoolHover
	end

	skillButton.DoClick = function()
		surface.PlaySound("helix/ui/press.wav")
		self:OpenSkillPanel(skillInfo)
	end

	self:CreateBoostInfo(boostPanel, skillInfo)
	self:CheckForCurrent(skillInfo)

	local autoLevel = skillButton:Add("DButton")
	skillPanel.autoLevel = autoLevel

	autoLevel.autoLevel = character:GetSkillAutoLevel(skillID)
	autoLevel:Dock(BOTTOM)
	autoLevel:SetTall(SScaleMin(20 / 3))
	autoLevel:SetContentAlignment(4)
	autoLevel:SetText("UP Automatique")
	autoLevel:SetFont("MenuFontBoldNoClamp")
	autoLevel:SetTextInset(SScaleMin(30 / 3), 0)
	autoLevel:DockMargin(0, 0, skillPanel:GetWide() * 0.63, 0)
	autoLevel.Paint = function(panel, w, h)
		surface.SetDrawColor(color_white)
		surface.DrawOutlinedRect(0, 0, SScaleMin(20 / 3), h)

		if panel.autoLevel then
			surface.SetMaterial(ix.util.GetMaterial("willardnetworks/tabmenu/skills_v2/tick.png"))
			surface.DrawTexturedRect(SScaleMin(20 / 3) * 0.5 - SScaleMin(15 / 3) * 0.5, SScaleMin(20 / 3) * 0.5 - SScaleMin(10 / 3) * 0.5, SScaleMin(15 / 3), SScaleMin(11 / 3))
		end
	end

	autoLevel.DoClick = function()
		surface.PlaySound("helix/ui/press.wav")
		net.Start("ixSkillSetAutoLevel")
		net.WriteString(skillID)
		net.SendToServer()

		autoLevel.autoLevel = !autoLevel.autoLevel
	end

	if skillInfo.name == "Bartering" then
		experiencePanel:SetVisible(false)
		skillPanel.skillLevel:SetText("Vous avez " .. (istable(character:GetPermits()) and table.Count(character:GetPermits()) or "0") .. " permis actifs.")
		skillPanel.skillLevel:SizeToContents()
		autoLevel:SetVisible(false)
	end

	self.skillGrid:AddItem( skillPanel )
	return skillPanel
end

function PANEL:OpenSkillPanel(skill)
	surface.PlaySound("helix/ui/press.wav")
	if self.panels[skill.uniqueID] then
		if (self.contentPanel) then
			self.contentPanelOriginX, self.contentPanelOriginY = self.contentPanel:GetPos()
			self.contentPanel:MoveTo(ScrW(), self.contentPanelOriginY, 1, 0)
		end

		for k, v in pairs(self.panels) do
			if k == skill.uniqueID then
				self:CreateNewContent(v, skill.uniqueID)
			end
		end
	end
end

function PANEL:CheckForCurrent(skill)
	if self.panels[skill.uniqueID] then
		if self.contentPanel then
			if LocalPlayer().lastSelectedSkill then
				if LocalPlayer().lastSelectedSkill == skill.uniqueID then
					self.contentPanelOriginX, self.contentPanelOriginY = self.contentPanel:GetPos()

					self.contentPanel:SetPos(ScrW(), self.contentPanelOriginY)

					for k, v in pairs(self.panels) do
						if k == skill.uniqueID then
							self:CreateNewContent(v, skill.uniqueID)
						end
					end
				end
			end
		end
	end
end

function PANEL.CoolHover(self, w, h)
	surface.SetDrawColor(Color(0, 0, 0, 150))
	surface.DrawRect(0, 0, w, h)
end

function PANEL:CreateBoostInfo(boostPanel, skill)
	local character = LocalPlayer():GetCharacter()
	local attributes = ix.special.list or {}
	local skillAttributes = {}

	-- Find the attributes that boost the skill
	for _, v in pairs(attributes) do
		if v.skills then
			if v.skills[skill.uniqueID] then
				skillAttributes[v.skills[skill.uniqueID]] = v
			end
		end
	end

	if skillAttributes[2] then
		local boostedByLabel = boostPanel:Add("DLabel")
		boostedByLabel:SetText("Boost majeur avec : " .. skillAttributes[2].name)
		boostedByLabel:SetFont("MenuFontBoldNoClamp")
		boostedByLabel:SetContentAlignment(4)
		boostedByLabel:SizeToContents()
		boostedByLabel:Dock(TOP)
	end

	if skillAttributes[1] then
		local boostedByLabel = boostPanel:Add("DLabel")
		boostedByLabel:SetText("Boost mineur avec : " .. skillAttributes[1].name)
		boostedByLabel:SetFont("MenuFontBoldNoClamp")
		boostedByLabel:SetContentAlignment(4)
		boostedByLabel:SizeToContents()
		boostedByLabel:Dock(TOP)
	end

	local varBoostLevel = character:GetSkillBoostLevels(skill.uniqueID)
	local varNeedsLevel, reducedHunger, reducedThirst, reducedGas, reducedHealth = character:GetSkillNeedsReducing(skill.uniqueID)

	if (varBoostLevel > 0) then
		-- ATLE HAPPY
		local boostedLevels = boostPanel:Add("DLabel")
		boostedLevels:Dock(TOP)
		boostedLevels:SetContentAlignment(4)
		boostedLevels:SetFont("MenuFontLargerBoldNoFix")
		boostedLevels:SetTextColor(Color(75, 238, 75))
		boostedLevels:SetText("Niveau boosté : + " .. varBoostLevel)
		boostedLevels:SizeToContents()
	end

	if (varNeedsLevel > 0) then
		if (reducedHunger) then
			local hungerReducing = boostPanel:Add("DLabel")
			hungerReducing:Dock(TOP)
			hungerReducing:SetContentAlignment(4)
			hungerReducing:SetFont("MenuFontLargerBoldNoFix")
			hungerReducing:SetTextColor(Color(238, 75, 75))
			hungerReducing:SetText("-" .. math.Round(reducedHunger, 1) .. " niveau à cause de la faim")
			hungerReducing:SizeToContents()
		end
		
		if (reducedThirst) then
			local thirstReducing = boostPanel:Add("DLabel")
			thirstReducing:Dock(TOP)
			thirstReducing:SetContentAlignment(4)
			thirstReducing:SetFont("MenuFontLargerBoldNoFix")
			thirstReducing:SetTextColor(Color(238, 75, 75))
			thirstReducing:SetText("-" .. math.Round(reducedThirst, 1) .. " niveau à cause de la soif")
			thirstReducing:SizeToContents()
		end

		if (reducedGas) then
			local gasReducing = boostPanel:Add("DLabel")
			gasReducing:Dock(TOP)
			gasReducing:SetContentAlignment(4)
			gasReducing:SetFont("MenuFontLargerBoldNoFix")
			gasReducing:SetTextColor(Color(238, 75, 75))
			gasReducing:SetText("-" .. math.Round(reducedGas, 1) .. " niveau à cause des germes")
			gasReducing:SizeToContents()
		end

		if (reducedHealth) then
			local healthReducing = boostPanel:Add("DLabel")
			healthReducing:Dock(TOP)
			healthReducing:SetContentAlignment(4)
			healthReducing:SetFont("MenuFontLargerBoldNoFix")
			healthReducing:SetTextColor(Color(238, 75, 75))
			healthReducing:SetText("-" .. math.Round(reducedHealth, 1) .. " niveau à cause des blessures")
			healthReducing:SizeToContents()
		end

		local needsReducing = boostPanel:Add("DLabel")
		needsReducing:Dock(TOP)
		needsReducing:SetContentAlignment(4)
		needsReducing:SetFont("MenuFontLargerBoldNoFix")
		needsReducing:SetTextColor(Color(238, 75, 75))
		needsReducing:SetText("Niveaux réduits totaux : -" .. varNeedsLevel)
		needsReducing:SizeToContents()
	end
end

function PANEL:CreateSkillLabel(parent, text, font, leftMargin, rightMargin, color)
	parent:Dock(LEFT)
	parent:SetFont(font)
	parent:SetText(text or "")
	parent:SetContentAlignment(4)
	parent:DockMargin(leftMargin, 0, rightMargin, 0)
	parent:SizeToContents()
	parent:SetTextColor(color or color_white)
end

function PANEL:CreateNewContent(v, name)
	local newContent = self:Add("Panel")
	newContent:SetSize(self.contentPanel:GetSize())
	newContent:SetPos(self:GetWide() * 0.5 - self.contentPanel:GetWide() * 0.5, titlePushDown)
	local x, y = newContent:GetPos()

	if !LocalPlayer().lastSelectedSkill then
		newContent:SetPos(0 - ScrW(), y)
		newContent:MoveTo(x, y, 1, 0)
	else
		newContent:SetPos(x, y)
	end

	LocalPlayer().lastSelectedSkill = name

	if self.chosenSkillPanel then
		self.chosenSkillPanel:Remove()
	end

	if self.backButton then
		self.backButton:Remove()
	end

	self.chosenSkillPanel = v(newContent)

	self.attributesButton:SetVisible(false)

	self.backButton = self.titlePanel:Add("DButton")
	self.backButton:Dock(RIGHT)
	self.backButton:SetText("Retourner au menu")
	self.backButton:SetFont("TitlesFontNoClamp")
	self.backButton:SetContentAlignment(6)
	self.backButton:SetAlpha(0)
	self.backButton:AlphaTo(255, 1, 0)
	self.backButton:SizeToContents()
	self.backButton:DockMargin(0, self.titlePanel:GetTall() * 0.3 - self.backButton:GetTall(), 0, self.titlePanel:GetTall() * 0.5 - self.backButton:GetTall() * 0.5)
	self.backButton.Paint = function(_, w, h) end

	self.backButton.OnCursorEntered = function()
		self.backButton:SetTextColor(Color(200, 200, 200, 255))
		surface.PlaySound("willardnetworks/charactercreation/hover.wav")
	end

	self.backButton.OnCursorExited = function()
		self.backButton:SetTextColor(Color(255, 255, 255, 255))
	end

	self.backButton.DoClick = function()
		surface.PlaySound("helix/ui/press.wav")
		self.backButton:AlphaTo(0, 1, 0, function()
			self.attributesButton:SetVisible(true)
			self.attributesButton:SetAlpha(0)
			self.attributesButton:AlphaTo(255, 0.5, 0)
		end)
		newContent:MoveTo(0 - ScrW(), y, 1, 0)
		self.contentPanel:MoveTo(self:GetWide() * 0.5 - self.contentPanel:GetWide() * 0.5, self.contentPanelOriginY, 1, 0)
		LocalPlayer().lastSelectedSkill = nil
	end
end

function PANEL:CreateAttributesPanel()
	self.attributesButton = self.titlePanel:Add("DButton")
	self.attributesButton:Dock(RIGHT)
	self.attributesButton:DockMargin(0, SScaleMin(25 / 3), 0, SScaleMin(63 / 3))
	self.attributesButton:SetText("Boost de vos attributs")
	self.attributesButton:SetFont("MenuFontBoldNoClamp")
	self.attributesButton:SetWide(SScaleMin(170 / 3))
	self.attributesButton.Paint = function(_, w, h)
		surface.SetDrawColor(0, 0, 0, 100)
		surface.DrawRect(0, 1, w - 2, h - 1)

		surface.SetDrawColor(Color(111, 111, 136, (255 / 100 * 30)))
		surface.DrawOutlinedRect(0, 0, w, h)
	end

	self.attributesButton.DoClick = function()
		surface.PlaySound("helix/ui/press.wav")
		self:CreateAttributePopup()
	end
end

local attributePadding = SScaleMin(10 / 3)

function PANEL:CreateAttributeBar(parent, attributeID)
	local character = LocalPlayer():GetCharacter()
	local special = tonumber(character:GetSpecial(attributeID)) or 0
	local attribute = ix.special:Find(attributeID)
	local icon = attribute.icon or ""
	local boost = tonumber(character:GetBoostedAttribute(attributeID)) or 0
	local specialBoost = character:GetSpecialBoost()[attributeID] or {}

	parent:SetTall(SScaleMin(100 / 3))
	parent:Dock(TOP)
	parent:DockMargin(attributePadding * 2, 0, attributePadding * 2, attributePadding)

	local barPanel = parent:Add("Panel")
	barPanel:Dock(TOP)
	barPanel:SetTall(SScaleMin(27 / 3))

	-- icon
	local iconImage = barPanel:Add("DImage")
	iconImage:Dock(LEFT)
	iconImage:SetWide(SScaleMin(20 / 3))
	iconImage:SetImage(icon)
	iconImage:DockMargin(0, SScaleMin(2 / 3), attributePadding * 2, SScaleMin(2 / 3))

	local backgroundBar = barPanel:Add("Panel")
	backgroundBar:Dock(FILL)
	backgroundBar.Paint = function(_, w, h)
		surface.SetDrawColor(Color(0, 0, 0, 100))
		surface.DrawRect(0, 0, w, h)

		surface.SetDrawColor(Color(111, 111, 136, (255 / 100 * 30)))
		surface.DrawOutlinedRect(0, 0, w, h)
	end

	local positivePoints = 0
	local negativePoints = 0

	for _, v in pairs(specialBoost) do
		if v.level > 0 then
			positivePoints = positivePoints + v.level
		elseif v.level < 0 then
			negativePoints = negativePoints - v.level
		end
	end

	local green = Color(138, 200, 97, 255)
	local grey = Color(200, 200, 200, 255)
	local red = Color(200, 97, 97, 255)

	local baseBar = backgroundBar:Add("Panel")
	baseBar:SetSize(SScaleMin(360 / 3), barPanel:GetTall())
	baseBar.Paint = function(_, w, h)
		if positivePoints > 0 then
			surface.SetDrawColor(green)
			surface.DrawRect(0, 0, (positivePoints + special) * (w / 10), h)
		end

		if special > 0 then
			surface.SetDrawColor(Color(200, 200, 200, 255))
			surface.DrawRect(0, 0, (special * w) / 10, h)
		end

		if negativePoints > 0 then
			surface.SetDrawColor(red)
			surface.DrawRect(math.max((positivePoints + special) - negativePoints, 0) * (w / 10), 0, negativePoints, h)
		end
	end

	local attributeAmount = barPanel:Add("DLabel")
	attributeAmount:Dock(RIGHT)
	attributeAmount:SetText(boost .. "/10")
	attributeAmount:SetTextColor((boost > special and green) or (boost < special and red) or grey)
	attributeAmount:DockMargin(attributePadding * 2 + ((boost == 10 and SScaleMin(3 / 3)) or SScaleMin(11 / 3)), 0, 0, 0)
	attributeAmount:SetFont("MenuFontNoClamp")
	attributeAmount:SizeToContents()

	if specialBoost.long then
		local level = specialBoost.long.level
		local longBoost = parent:Add("DLabel")
		longBoost:Dock(TOP)
		if (level != 0) then
			local change = level > specialBoost.long.target and "diminue" or "augmente"
			local sign = level > 0 and "+" or ""
			longBoost:SetText(string.format("Actuellement %s%d boost de nourriture, %s par 1 dans %d minutes", sign, level, change, specialBoost.long.time))
		elseif (specialBoost.long.time) then
			local sign = specialBoost.long.target > 0 and "+" or "-"
			longBoost:SetText(string.format("%s1 boost grâce à la nourriture | Actif dans : %d minutes", sign, specialBoost.long.time))
		end
		longBoost:SetContentAlignment(5)
		longBoost:SetFont("MenuFontNoClamp")
		longBoost:DockMargin(0, attributePadding, 0, attributePadding)
		longBoost:SizeToContents()
	end

	if specialBoost.short then
		local level = specialBoost.short.level
		local shortBoost = parent:Add("DLabel")
		shortBoost:Dock(TOP)
		if (level != 0) then
			local change = level > specialBoost.short.target and "diminue" or "augmente"
			local sign = level > 0 and "+" or ""
			shortBoost:SetText(string.format("Actuellement %s%d boost de drogue, %s par 1 dans %d secondes", sign, level, change, specialBoost.short.time))
		elseif (specialBoost.short.time) then
			local sign = specialBoost.short.target > 0 and "+" or "-"
			shortBoost:SetText(string.format("%s1 boost grâce à la drogue | Actif dans : %d secondes", sign, specialBoost.short.time))
		end
		shortBoost:SetContentAlignment(5)
		shortBoost:SetFont("MenuFontNoClamp")
		shortBoost:DockMargin(0, attributePadding, 0, 0)
		shortBoost:SizeToContents()
	end

	if specialBoost.neg then
		local negativeBoost = parent:Add("DLabel")
		negativeBoost:Dock(TOP)
		negativeBoost:SetText("-" .. specialBoost.neg.level .. " à cause de la faim & la soif")
		negativeBoost:SetContentAlignment(5)
		negativeBoost:SetFont("MenuFontNoClamp")
		negativeBoost:DockMargin(0, attributePadding, 0, 0)
		negativeBoost:SizeToContents()
	end
end

function PANEL:CreateAttributePopup()
	if ix.gui.attributeFrame then
		ix.gui.attributeFrame:Remove()
	end

	ix.gui.attributeFrame = vgui.Create("Panel")
	local attributeFrame = ix.gui.attributeFrame
	attributeFrame:SetSize(SScaleMin(500 / 3), SScaleMin(507 / 3))
	attributeFrame:SetAlpha(0)
	attributeFrame:AlphaTo(255, 0.5, 0)
	attributeFrame:Center()
	attributeFrame:MakePopup()
	attributeFrame.Paint = function(panel, w, h)
		local blur = Material("pp/blurscreen")

		local x, y = panel:LocalToScreen(0, 0)
		surface.SetDrawColor( 255, 255, 255 )
		surface.SetMaterial( blur )

		for i = 1, 6 do
			blur:SetFloat( "$blur", (i / 6 ) * ( 3 ) )
			blur:Recompute()
			render.UpdateScreenEffectTexture()
			surface.DrawTexturedRect( x * -1, y * -1, ScrW(), ScrH() )
		end

		surface.SetDrawColor(Color(0, 0, 0, 100))
		surface.DrawRect(0, 0, w, h)

		surface.SetDrawColor(Color(111, 111, 136, (255 / 100 * 30)))
		surface.DrawOutlinedRect(0, 0, w, h)
	end

	attributeFrame.Think = function()
		if !IsValid(PLUGIN.SkillsMenu) then
			ix.gui.attributeFrame:Remove()
		end

		if ix.gui.attributeFrame then
			ix.gui.attributeFrame:MoveToFront()
		end
	end

	local topbar = attributeFrame:Add("Panel")
	topbar:SetSize(attributeFrame:GetWide(), SScaleMin(50 / 3))
	topbar:Dock(TOP)
	topbar:DockMargin(0, 0, 0, attributePadding)
	topbar.Paint = function( _, w, h )
		surface.SetDrawColor(0, 0, 0, 130)
		surface.DrawRect(0, 0, w, h)
	end

	local titleText = topbar:Add("DLabel")
	titleText:SetFont("CharCreationBoldTitleNoClamp")
	titleText:Dock(LEFT)
	titleText:SetText("Boost des attributs")
	titleText:DockMargin(attributePadding, 0, 0, 0)
	titleText:SetContentAlignment(4)
	titleText:SizeToContents()

	local exit = topbar:Add("DImageButton")
	exit:SetImage("willardnetworks/tabmenu/navicons/exit.png")
	exit:SetSize(SScaleMin(20 / 3), SScaleMin(20 / 3))
	exit:DockMargin(0, SScaleMin(15 / 3), attributePadding, SScaleMin(15 / 3))
	exit:Dock(RIGHT)
	exit.DoClick = function()
		if !IsValid(self) then
			return
		end

		if attributeFrame then
			attributeFrame:Remove()
		end

		surface.PlaySound("helix/ui/press.wav")
	end

	local strength = attributeFrame:Add("Panel")
	self:CreateAttributeBar(strength, "strength")

	local intelligence = attributeFrame:Add("Panel")
	self:CreateAttributeBar(intelligence, "intelligence")

	local perception = attributeFrame:Add("Panel")
	self:CreateAttributeBar(perception, "perception")

	local agility = attributeFrame:Add("Panel")
	self:CreateAttributeBar(agility, "agility")
end

vgui.Register("WNSkillPanel", PANEL, "EditablePanel")

hook.Add("CreateMenuButtons", "WNSkillPanel", function(tabs)
	tabs["skills"] = {
		RowNumber = 2,
		Width = 18,
		Height = 18,
		Icon = "willardnetworks/tabmenu/navicons/crafting.png",
		Create = function(info, container)
			if PLUGIN.SkillsMenu then
				PLUGIN.SkillsMenu:Remove()
			end

			PLUGIN.SkillsMenu = container:Add("WNSkillPanel")
		end
	}
end)
