local system = script.Parent.Parent.Parent
local zones = {}
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 tones = {}
local thisTimeout = nil
local systemReady = true
local systemOverride = script.Parent.override.Value
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 checkZones()
	while true do
		systemReady = true
		for i,e in pairs(zones) do
			if e.ZoneInput.Wire.Connected then
				if not systemOverride then
					systemReady = false
				end
			end
		end
		if not ptt then
			if not systemReady then
				led.Material = Enum.Material.Neon
				led.Color = Color3.new(1,0,0)
			else
				led.Material = Enum.Material.SmoothPlastic
				led.Color = Color3.new(202/255, 203/255, 209/255)
			end
		end
		wait(0)
	end
end
function checkReady()
	while true do
		ready = true
		for i,e in pairs(zones) do
			local thisTone = tones[e.PageTone.Value]
			if thisTone.TimeLength == 0 then
				-- Empty audio, stop playing it
				thisTone:Stop()
			end
			if thisTone.IsPlaying or waiting then
				ready = false
			end
		end
		if ready and ptt then
			-- set led to green
			led.Material = Enum.Material.Neon
			led.Color = Color3.new(0,1,0)
		elseif ptt then
			-- set led to solid yellow
			led.Material = Enum.Material.Neon
			led.Color = Color3.new(1,1,0)
		end
		wait()
	end
end
function togglePTT()
	print(ready)
	print("toggling ptt")
	if ptt then
		ptt = false
		print("off")
		thisTimeout = nil
		for i,e in pairs(zones) 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
		if not systemReady then return end
		ptt = true
		for i,e in pairs(zones) 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


pttButton.MouseClick:Connect(function()
	togglePTT()
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(checkReady)