local love = love

local draw = love.draw
local update = love.update
local mousepressed = love.mousepressed
local keypressed = love.keypressed
local mousemoved = love.mousemoved
local ExitMenu

options = options or {}
local options = options
local optionList = {}
local option

if not options.initialized then
  options.initialized = true

  local keyBindCallback = function(self, code)
    self.value = code or self.value
  end

  options.optionValues = {
    { name = "options",
      value = "",
      callback = function(self)
      end
    },
    
    { name = "fullscreen",
      value = false,
      callback = function(self)
        self.value = not(self.value)
        love.window.setFullscreen( self.value )
        love.event.push( "resize", love.graphics.getWidth(), love.graphics.getHeight() )
      end
    },

    { name = "high contrast",  
      value = false,
      callback = function(self, code)
        if code == "backspace" then return end
        self.value = not( self.value )
        return false
      end
    },

    { name = "volume",
      value = 1.0,
      callback = function(self, code)

        local isIncreasing 
        if (code == "left" or code == "a") then isIncreasing = -1
        elseif (code == "right" or code == "d") then isIncreasing = 1
        else return false end
        self.value = math.max( 0, math.min( 2,
            self.value + (isIncreasing * 0.05 )))
        love.audio.setVolume( self.value )
        return true
      end

    },

    { name = "left",
      value = "a",
      callback = keyBindCallback
    },

    { name = "right",
      value = "d",
      callback = keyBindCallback
    },

    { name = "up",
      value = "w",
      callback = keyBindCallback
    },

    { name = "down",
      value = "s",
      callback = keyBindCallback
    }
  }

  do 
    for i, ov in ipairs( options.optionValues ) do
      options[ ov.name ] = ov
    end
  end

end

local optionIdx = 1
local isAwaitingKey = false

local font = love.graphics.newFont( 32 )
local function Draw()
  love.graphics.setColor( 1,1,1,1 )
  if options["high contrast"].value then
    love.graphics.setColor( 0, 0, 0, 1 )  
  end
  for i, option in ipairs( options.optionValues ) do
    love.graphics.printf( option.name, font, 100, i * 50, 1000, "left")
    love.graphics.printf( tostring( option.value ), font, -100, i * 50, love.graphics.getWidth(), "right")


  end

  local w = love.graphics.getWidth()

  love.graphics.setColor( 1,1,1,0.5 )
  if isAwaitingKey then
    love.graphics.rectangle( "fill", w - 200, optionIdx * 50, 100, 48, 10, 10 )
  else
    love.graphics.rectangle( "fill", 100, optionIdx * 50, 250, 48, 10, 10 )
  end

end

local function SelectNextOption()
  optionIdx = math.min( #options.optionValues, optionIdx + 1 )
  option = options.optionValues[ optionIdx]
end

local function SelectPreviousOption()
  optionIdx = math.max( 1, optionIdx - 1 )
  option = options.optionValues[ optionIdx]
end

local function MouseMoved( x, y )
  optionIdx =
    math.min( #options.optionValues, 
      math.max( 1,
        math.floor( y / 50 )
      ))
  option = options.optionValues[ optionIdx]
  
  if ( x > love.graphics.getWidth() - 200 ) then
    isAwaitingKey = true
  else
    isAwaitingKey = false
  end
end



local function KeyPress(key, code, isRepeat)

  if not( isAwaitingKey ) then
    
    if code == "backspace" then 
      return ExitMenu() end
    if optionIdx and 
      code == "return" or
      code == "right" then 
      isAwaitingKey = true
      return 
    end
    
    if code == "down" then return SelectNextOption() end
    if code == "up" then return SelectPreviousOption() end
    
  else

    if code == "backspace" then isAwaitingKey = false end
    if code == "escape" then return end
    isAwaitingKey = (options.optionValues[optionIdx]):callback( code )

  end


end


local function MousePressed( )
  return KeyPress( )
end

local function EnterMenu()
  draw = love.draw
  update = love.update
  mousepressed = love.mousepressed
  keypressed = love.keypressed
  mousemoved = love.mousemoved
  love.mouse.setRelativeMode( false )
  
  love.draw = Draw
  love.keypressed = KeyPress
  love.update = function() end
  love.mousemoved = MouseMoved
  love.mousepressed = MousePressed
end

function ExitMenu()
  love.mouse.setRelativeMode( true )
  love.mousemoved = mousemoved
  love.keypressed = keypressed
  love.mousepressed = mousepressed
  love.update = update
  love.draw = draw
end

options.EnterMenu = EnterMenu
options.ExitMenu = ExitMenu

return options