local config_data = {
	pause_buttons = {Start = false, Select = true, Back = true},
	pause_tap_time = 1,
	pause_debounce_time = .1
}
local pause_press_times = {}
local last_press_buttons = {}
local down_status = {}
local enabled_players = {}
local screen_gameplay = false
local pause_actor = false

local function other_button_down(pn, button)
	for other_pn, status in pairs(down_status) do
		for other_button, down in pairs(status) do
			if down and (other_button ~= button or other_pn ~= pn) then
				return true
			end
		end
	end
	return false
end

local function detect_lr_press(pn)
	return down_status[pn].MenuLeft and down_status[pn].MenuRight
end

local function input(event)
	local pn = event.PlayerNumber
	if not enabled_players[pn] then
		return
	end
	local button = event.button
	local game_button = event.GameButton
	if not game_button then
		return
	end
	if event.type == "InputEventType_Release" then
		down_status[pn][button] = false
		return
	end
	down_status[pn][button] = true
	if button ~= last_press_buttons[pn] then
		last_press_buttons[pn] = nil
	end
	if screen_gameplay:IsPaused() then
		return
	end
	if event.type ~= "InputEventType_FirstPress" then
		return
	end
	if detect_lr_press(pn) then
		MESSAGEMAN:Broadcast("PlayerHitPause", {pn = pn, button = button})
		return
	end
	if not config_data.pause_buttons[button] then
		MESSAGEMAN:Broadcast("HidePausePrompt")
		return
	end
	if last_press_buttons[pn] == button and pause_press_times[pn] and not other_button_down(pn, button) then
		local time_diff = GetTimeSinceStart() - pause_press_times[pn]
		if time_diff > config_data.pause_debounce_time then
			if time_diff < config_data.pause_tap_time then
				if GAMESTATE:GetCurMusicSeconds() > GAMESTATE:GetCurrentSong():GetFirstSecond() then
					gameplay_pause_count = gameplay_pause_count + 1
				end
				last_press_buttons[pn] = nil
				pause_press_times[pn] = nil
				MESSAGEMAN:Broadcast("PlayerHitPause", {pn = pn, button = button})
				return true
			else
				pause_press_times[pn] = GetTimeSinceStart()
				last_press_buttons[pn] = button
				MESSAGEMAN:Broadcast("ShowPausePrompt", {pn = pn, button = button})
			end
		end
	else
		pause_press_times[pn] = GetTimeSinceStart()
		last_press_buttons[pn] = button
		MESSAGEMAN:Broadcast("ShowPausePrompt", {pn = pn, button = button})
	end
end

function pause_controller_actor()
	gameplay_pause_count = 0
	return Def.Actor {
		OnCommand = function(self)
			screen_gameplay = SCREENMAN:GetTopScreen()
			if screen_gameplay:GetName() == "ScreenGameplaySyncMachine" then
				return
			end
			screen_gameplay:AddInputCallback(input)
			enabled_players = GAMESTATE:GetEnabledPlayers()
			for i, pn in ipairs(enabled_players) do
				enabled_players[pn] = true
				down_status[pn] = {}
			end
		end
	}
end
