local ConfigScene = Scene:extend()

ConfigScene.title = "Input Config"

require 'load.save'

local configurable_inputs = {
	"menu_decide",
	"menu_back",
	"left",
	"right",
	"up",
	"down",
	"rotate_left",
	"rotate_left2",
	"rotate_right",
	"rotate_right2",
	"rotate_180",
	"hold",
	"retry",
}

local function newSetInputs()
	local set_inputs = {}
	for i, input in ipairs(configurable_inputs) do
		set_inputs[input] = false
	end
	return set_inputs
end

function ConfigScene:new()
	self.input_state = 1
	self.set_inputs = newSetInputs()
	self.new_input = {}

	DiscordRPC:update({
		details = "In menus",
		state = "Changing input config",
	})
end

function ConfigScene:update()
end

function ConfigScene:render()
	love.graphics.setColor(1, 1, 1, 1)
	love.graphics.draw(
		backgrounds["input_config"],
		0, 0, 0,
		0.5, 0.5
	)

	love.graphics.setFont(font_3x5_2)
	for i, input in ipairs(configurable_inputs) do
		love.graphics.printf(input, 40, 50 + i * 20, 200, "left")
		if self.set_inputs[input] then
			love.graphics.printf(self.set_inputs[input], 240, 50 + i * 20, 300, "left")
		end
	end
	if self.input_state > table.getn(configurable_inputs) then
		love.graphics.print("press enter to confirm, delete/backspace to retry" .. (config.input and ", escape to cancel" or ""))
	else
		love.graphics.print("press key or joystick input for " .. configurable_inputs[self.input_state] .. ", tab to skip" .. (config.input and ", escape to cancel" or ""), 0, 0)
		love.graphics.print("enter, delete, backspace, tab, arrows, and escape can't be changed", 0, 20)
	end
end

local function addJoystick(input, name)
	if not input.joysticks then
		input.joysticks = {}
	end
	if not input.joysticks[name] then
		input.joysticks[name] = {}
	end
end

function ConfigScene:onInputPress(e)
	if e.type == "key" then
		-- enter, delete, backspace, tab, arrows, and escape are reserved and can't be remapped
		if e.scancode == "escape" and config.input then
			scene = TitleScene()
		elseif self.input_state > table.getn(configurable_inputs) then
			if e.scancode == "return" then
				-- save new input, then load next scene
				config.input = self.new_input
				saveConfig()
				scene = TitleScene()
			elseif e.scancode == "delete" or e.scancode == "backspace" then
				-- retry
				self.input_state = 1
				self.set_inputs = newSetInputs()
				self.new_input = {}
			elseif e.scancode == "escape" and config.input then
				-- cancel only if there was an input config already
				scene = TitleScene()
			end
		elseif
			e.scancode ~= "delete" and
			e.scancode ~= "backspace" and
			e.scancode ~= "return" and
			e.scancode ~= "left" and
			e.scancode ~= "right" and
			e.scancode ~= "up" and
			e.scancode ~= "down"
		then
			if e.scancode == "tab" then
				self.set_inputs[configurable_inputs[self.input_state]] = "skipped"
				self.input_state = self.input_state + 1
			else
				if not self.new_input.keys then
					self.new_input.keys = {}
				end
				self.set_inputs[configurable_inputs[self.input_state]] = "key " .. love.keyboard.getKeyFromScancode(e.scancode) .. " (" .. e.scancode .. ")"
				self.new_input.keys[e.scancode] = configurable_inputs[self.input_state]
				self.input_state = self.input_state + 1
			end
		end
	elseif string.sub(e.type, 1, 3) == "joy" then
		if self.input_state <= table.getn(configurable_inputs) then
			if e.type == "joybutton" then
				addJoystick(self.new_input, e.name)
				if not self.new_input.joysticks[e.name].buttons then
					self.new_input.joysticks[e.name].buttons = {}
				end
				self.set_inputs[configurable_inputs[self.input_state]] =
					"jbtn " ..
					e.button ..
					" " .. string.sub(e.name, 1, 10) .. (string.len(e.name) > 10 and "..." or "")
				self.new_input.joysticks[e.name].buttons[e.button] = configurable_inputs[self.input_state]
				self.input_state = self.input_state + 1
			elseif e.type == "joyaxis" then
				if math.abs(e.value) >= 0.5 then
					addJoystick(self.new_input, e.name)
					if not self.new_input.joysticks[e.name].axes then
						self.new_input.joysticks[e.name].axes = {}
					end
					if not self.new_input.joysticks[e.name].axes[e.axis] then
						self.new_input.joysticks[e.name].axes[e.axis] = {}
					end
					self.set_inputs[configurable_inputs[self.input_state]] =
						"jaxis " ..
						(e.value >= 0.5 and "+" or "-") .. e.axis ..
						" " .. string.sub(e.name, 1, 10) .. (string.len(e.name) > 10 and "..." or "")
					self.new_input.joysticks[e.name].axes[e.axis][e.value >= 0.5 and "positive" or "negative"] = configurable_inputs[self.input_state]
					self.input_state = self.input_state + 1
				end
			elseif e.type == "joyhat" then
				if e.direction ~= "c" then
					addJoystick(self.new_input, e.name)
					if not self.new_input.joysticks[e.name].hats then
						self.new_input.joysticks[e.name].hats = {}
					end
					if not self.new_input.joysticks[e.name].hats[e.hat] then
						self.new_input.joysticks[e.name].hats[e.hat] = {}
					end
					self.set_inputs[configurable_inputs[self.input_state]] =
						"jhat " ..
						e.hat .. " " .. e.direction ..
						" " .. string.sub(e.name, 1, 10) .. (string.len(e.name) > 10 and "..." or "")
					self.new_input.joysticks[e.name].hats[e.hat][e.direction] = configurable_inputs[self.input_state]
					self.input_state = self.input_state + 1
				end
			end
		end
	end
end

return ConfigScene
