local Rojo = script:FindFirstAncestor("Rojo")
local Plugin = Rojo.Plugin
local Packages = Rojo.Packages

local Roact = require(Packages.Roact)
local Highlighter = require(Packages.Highlighter)
Highlighter.matchStudioSettings()

local e = Roact.createElement

local Theme = require(Plugin.App.Theme)

local CodeLabel = Roact.PureComponent:extend("CodeLabel")

function CodeLabel:init()
	self.labelRef = Roact.createRef()
	self.highlightsRef = Roact.createRef()
end

function CodeLabel:didMount()
	Highlighter.highlight({
		textObject = self.labelRef:getValue(),
	})
	self:updateHighlights()
end

function CodeLabel:didUpdate()
	self:updateHighlights()
end

function CodeLabel:updateHighlights()
	local highlights = self.highlightsRef:getValue()
	if not highlights then
		return
	end

	for _, lineLabel in highlights:GetChildren() do
		local lineNum = tonumber(string.match(lineLabel.Name, "%d+") or "0")
		lineLabel.BackgroundColor3 = self.props.lineBackground
		lineLabel.BorderSizePixel = 0
		lineLabel.BackgroundTransparency = if self.props.markedLines[lineNum] then 0.25 else 1
	end
end

function CodeLabel:render()
	return Theme.with(function(theme)
		return e("TextLabel", {
			Size = self.props.size,
			Position = self.props.position,
			Text = self.props.text,
			BackgroundTransparency = 1,
			FontFace = theme.Font.Code,
			TextSize = theme.TextSize.Code,
			TextXAlignment = Enum.TextXAlignment.Left,
			TextYAlignment = Enum.TextYAlignment.Top,
			TextColor3 = Color3.fromRGB(255, 255, 255),
			[Roact.Ref] = self.labelRef,
		}, {
			SyntaxHighlights = e("Folder", {
				[Roact.Ref] = self.highlightsRef,
			}),
		})
	end)
end

return CodeLabel
