local system = script.Parent.Parent.Parent
local mic = script.Parent.WallMic["Mic Enclosure"].AudioListener
local buttons = {}
local led = script.Parent.LED
local ptt = false
pttButton = script.Parent.WallMic["Mic Enclosure"].CD
local zones = {}
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

for i, e in ipairs(system.Tones:GetChildren()) do tones[e.Name] = e end
for i, e in ipairs(system.Zones:GetChildren()) do zones[e.Name] = e end
local zone = zones[script.Parent.Zone.Value]

function checkZones()
	while true do
		if zone.ZoneInput.Wire.Connected and not ptt then
			led.Material = Enum.Material.Neon
			led.Color = Color3.new(1, 0, 0)
		elseif not ptt then
			led.Material = Enum.Material.SmoothPlastic
			led.Color = Color3.new(163/255, 162/255, 165/255)
		end
		wait(0)
	end
end
function checkReady()
	local ready = true
	while true do
		if ptt then
			ready = true

			-- print("checking " .. zone)
			led.Material = Enum.Material.Neon
			local thisTone = tones[zone.PageTone.Value]
			if thisTone.TimeLength == 0 then
				-- Empty audio, stop playing it
				thisTone:Stop()
			end
			if waiting or thisTone.IsPlaying then
				led.Color = Color3.new(1, 1, 0)
				ready = false
			else
				led.Color = Color3.new(0, 1, 0)
			end
		else
			ready = false
		end
		wait()
	end
end



function togglePTT()

	-- print("toggling ptt")
	if ptt then
		ptt = false
		thisTimeout = nil
		-- print("off")
		task.spawn(function()
			local thisTone = tones[zone.EndTone.Value]
			zone.ZoneInput.Wire.SourceInstance = thisTone
			thisTone:Play()
			wait(thisTone.TimeLength)
			zone.ZoneInput.Wire.SourceInstance = nil
			smoothTransition(zone.BGM.Volume, script.Parent.BGMUp.Value, 1, function(value)
				zone.BGM.Volume = value
			end)
		end)
	else
		if zone.ZoneInput.Wire.Connected then return end 
		ptt = true
		task.spawn(function()
			local thisTone = tones[zone.PageTone.Value]
			waiting = true
			smoothTransition(zone.BGM.Volume, script.Parent.BGMDown.Value, 1, function(value)
				zone.BGM.Volume = value
			end)
			waiting = false
			zone.ZoneInput.Wire.SourceInstance = thisTone
			thisTone:Play()
			wait(thisTone.TimeLength)
			if (ptt) then
				-- We havent stopped PTT before page tone done, hit it
				zone.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

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

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