local system = script.Parent.Parent.Parent
local zones = {}
local mic = script.Parent["Panel Mic"].mic.AudioListener
local buttons = {}
local leds = {}
local ptt = false
pttButton = script.Parent["Panel Mic"].mic.CD
local selectedZones = {}
local tones = {}
local thisTimeout = nil
local TweenService = game:GetService("TweenService")
local waiting = false
function smoothTransition(startValue, endValue, duration, updateFunction)
	local finished = false
	-- Create a temporary NumberValue to tween
	local numberValue = Instance.new("NumberValue")
	numberValue.Value = startValue

	-- Create TweenInfo
	local tweenInfo = TweenInfo.new(
		duration,          -- Duration of the tween
		Enum.EasingStyle.Linear, -- Easing style
		Enum.EasingDirection.InOut, -- Easing direction
		0,                 -- Number of times to repeat
		false,             -- Whether to reverse the tween
		0                  -- Delay time before starting the tween
	)

	-- Create tween goal
	local tweenGoal = {Value = endValue}

	-- Create the tween
	local tween = TweenService:Create(numberValue, tweenInfo, tweenGoal)

	-- Connect the update function to the Changed event
	local connection
	connection = numberValue.Changed:Connect(function()
		-- Call the update function with the current value
		updateFunction(numberValue.Value)
	end)

	-- Play the tween
	tween:Play()

	-- Cleanup after tween completes
	tween.Completed:Connect(function()
		-- Ensure the final value is set to endValue
		updateFunction(endValue)
		-- Disconnect the event and remove the NumberValue instance
		connection:Disconnect()
		numberValue:Destroy()
		finished = true
	end)
	repeat wait() until finished
	finished = false
end

function toggleZone(zoneNumber)
	if ptt then return end -- We're transmitting, don't toggle zones
	if selectedZones[zoneNumber] then
		selectedZones[zoneNumber] = nil
		leds[zoneNumber].Color = Color3.new(202/255, 203/255, 209/255)
		leds[zoneNumber].Material = Enum.Material.SmoothPlastic
	else
		if zones[zoneNumber].ZoneInput.Wire.Connected then
			-- Nothing, in use
		else
			selectedZones[zoneNumber] = zones[zoneNumber]
		end
	end
end

function flashSelected()
	local state = false
	while true do
		while not ptt do
			for i,e in pairs(selectedZones) do
				if state then
					leds[i].Material = Enum.Material.SmoothPlastic
					leds[i].Color = Color3.new(202/255, 203/255, 209/255)
				else
					leds[i].Material = Enum.Material.Neon
					leds[i].Color = Color3.new(1,1,0)
				end
			end
			state = not state
			wait(.2)
		end
		wait()
	end
end

function checkZones()
	while true do
		for i,e in pairs(leds) do
			if not selectedZones[e.Name] then
				if zones[e.Name].ZoneInput.Wire.Connected then
					e.Material = Enum.Material.Neon
					e.Color = Color3.new(1,0,0)
				else
					e.Material = Enum.Material.SmoothPlastic
					e.Color = Color3.new(202/255, 203/255, 209/255)
				end
			elseif not ptt and selectedZones[e.Name] and zones[e.Name].ZoneInput.Wire.Connected then
				-- Someone else took the zone, drop it from selections
				toggleZone(e.Name)
			end 
		end
		wait(0)
	end
end
function checkReady()
	local ready = true
	while true do
		if ptt then
			ready = true
			for i,e in pairs(selectedZones) do
				print("checking " .. e.Name)
				leds[e.Name].Material = Enum.Material.Neon
				local thisTone = tones[e.PageTone.Value]
				if thisTone.TimeLength == 0 then
					-- Empty audio, stop playing it
					thisTone:Stop()
				end
				if waiting or thisTone.IsPlaying then
					leds[e.Name].Color = Color3.new(1,1,0)
					ready = false
				else
					leds[e.Name].Color = Color3.new(0,1,0)
				end
			end
		else
			ready = false
		end
		wait()
	end
end
function togglePTT()
	print("toggling ptt")
	if ptt then
		ptt = false
		print("off")
		thisTimeout = nil
		for i,e in pairs(selectedZones) do
			task.spawn(function()
				local thisTone = tones[zones[e.Name].EndTone.Value]
				zones[e.Name].ZoneInput.Wire.SourceInstance = thisTone
				thisTone:Play()
				wait(thisTone.TimeLength)
				zones[e.Name].ZoneInput.Wire.SourceInstance = nil
				smoothTransition(zones[e.Name].BGM.Volume,script.Parent.BGMUp.Value, 1, function(value)
					zones[e.Name].BGM.Volume = value
				end)
			end)
		end
	else
		local ready = false
		for i,e in pairs(selectedZones) do
			ready = true
			print("we have a zone, continue")
		end
		if not ready then return end
		ptt = true
		for i,e in pairs(selectedZones) do
			task.spawn(function()
				local thisTone = tones[zones[e.Name].PageTone.Value]
				waiting = true
				smoothTransition(zones[e.Name].BGM.Volume, script.Parent.BGMDown.Value, 1, function(value)
					zones[e.Name].BGM.Volume = value
				end)
				waiting = false
				zones[e.Name].ZoneInput.Wire.SourceInstance = thisTone
				thisTone:Play()
				wait(thisTone.TimeLength)
				if(ptt) then
					-- We havent stopped PTT before page tone done, hit it
					zones[e.Name].ZoneInput.Wire.SourceInstance = script.Parent.StationOutput
					thisTimeout = math.random(1,1000000)
					task.spawn(function()
						local myTimeout = tonumber(tostring(thisTimeout))
						wait(script.Parent.TimeoutSeconds.Value)
						if myTimeout == thisTimeout then
							togglePTT()
						end
					end)
				end
			end)	
		end
	end

end


for i,e in ipairs(script.Parent.Buttons:GetChildren()) do
	buttons[e.Name] = e
	print("Adding button " .. e.Name)
	e.CD.MouseClick:Connect(function()
		toggleZone(e.Name)
		print("button pressed " .. e.Name)
	end)
end

pttButton.MouseClick:Connect(function()
	togglePTT()
end)

for i,e in ipairs(script.Parent.Leds:GetChildren()) do
	leds[e.Name] = e
end

for i,e in ipairs(system.Zones:GetChildren()) do
	zones[e.Name] = e
end

for i,e in ipairs(system.Tones:GetChildren()) do
	tones[e.Name] = e
end

task.spawn(checkZones)
task.spawn(flashSelected)
task.spawn(checkReady)