Keybind = {}

Keybind.move = {}
Keybind.move.left = { demo = "move_left"}
Keybind.move.right = { demo = "move_right"}
Keybind.move.up = { demo = "move_up"}
Keybind.move.down = { demo = "move_down"}
Keybind.move.jump = { demo = "move_jump"}
Keybind.move.hook = { demo = "move_hook"}
Keybind.move.dash = { demo = "move_dash"}

Keybind.menu = {}
Keybind.menu.pause = { demo = "menu_pause"}
Keybind.menu.confirm = { demo = "menu_confirm"}

Keybind.debug = {}
Keybind.editor = {}
Keybind.generic = {}

function Keybind:CheckDown(action)
  if DemoPlayback then
    for _, demo_action in pairs(DemoAction[CurrentDemoFrame]) do
      if demo_action == action.demo then
        return true
      end
    end
    return false
  else
    for _, keyname in pairs(action.keys) do
      local check = false
      if type(keyname) == "string" then
        check = love.keyboard.isDown(keyname)
      else
        check = love.mouse.isDown(keyname)
      end
      if check then
        if action.demo ~= nil then
          Demo:RecordAction(action.demo)
        end
        return true
      end
    end
    return false
  end
end

function Keybind:CheckPressed(action)
  if Keybind:CheckDown(action) then
    if not action.pressed then
      action.pressed = true
      return true
    end
  else
    action.pressed = nil
  end
  return false
end

function Keybind:CheckCollision(cat, key)
  for _, action in pairs(cat) do
    for _, keyname in pairs(action.keys) do
      if key == keyname then return true end
    end
  end
  return false
end

function Keybind:AddKey(action, key)
  table.insert(action.keys, key)
end

function Keybind:ChangeKey(action, position, key)
  action.keys[position] = key
end

function Keybind:RemoveKeys(action)
  action.keys = {}
end

function Keybind:Default()
  --Menu
  Keybind.menu.pause.keys = {"escape"}
  Keybind.menu.confirm.keys = {"z", "space", 1}

  --Move
  Keybind.move.left.keys = {"left", "a"}
  Keybind.move.right.keys = {"right", "d"}
  Keybind.move.up.keys = {"up", "w"}
  Keybind.move.down.keys = {"down", "s"}
  Keybind.move.jump.keys = {"z", "space"}
  Keybind.move.hook.keys = {"x", 1}
  Keybind.move.dash.keys = {"c", 2}

  --Debug
  Keybind.debug.debug = { keys = {"f1"}}
  Keybind.debug.reposition = { keys = {"f2"}}
  Keybind.debug.reload = { keys = {"f3"}}
  Keybind.debug.editor = { keys = {"f4"}}
  Keybind.debug.recording = { keys = {"f5"}}
  Keybind.debug.playback = { keys = {"f6"}}

  -- Editor
  Keybind.editor.palette = { keys = {"tab"}}

  -- Generic
  Keybind.generic.lclick = { keys = {1}}
  Keybind.generic.rclick = { keys = {2}}
  Keybind.generic.lshift = { keys = {"lshift"}}
  Keybind.generic.lctrl = { keys = {"lctrl"}}
end

-- Set default values at start
Keybind:Default()
