require "app/bounce.rb"

BOUNCE_ACCL = 1.02
GRAVITY = 0.5

MIN_GRAVITY = 0.1
MAX_GRAVITY = 2.0
STEP_GRAVITY = 0.02

MIN_BOUNCE = 1.0
MAX_BOUNCE = 1.1
STEP_BOUNCE = 0.0011

CX = 636
CY = 399
CR = 205

def tick args
  # INIT
  # circle
  cx = CX
  cy = CY
  cr = CR
  # pause
  if args.state.paused.nil?
    args.state.paused = true
    args.state.ball = {
      x: 500,
      y: 500,
    }
    args.state.ball_vector = {
      x: 0,
      y: 0
    }
    args.state.bounce = BOUNCE_ACCL
    args.state.gravity = GRAVITY
  end

  # INPUT
  if args.inputs.keyboard.key_up.space
    args.state.paused = !args.state.paused
    if !args.state.paused
      #REINIT with inputs
      args.state.ball = {
        x: 500+Math.rand(150),
        y: 400+Math.rand(50),
      }
      args.state.ball_vector = {
        x: 0,
        y: 0
      }
    end
  end
  # MENU CONTROLS
  if args.inputs.right && args.state.paused
    args.state.gravity += STEP_GRAVITY if args.state.gravity < MAX_GRAVITY
  elsif args.inputs.left && args.state.paused
    args.state.gravity -= STEP_GRAVITY if args.state.gravity > MIN_GRAVITY
  end

  if args.inputs.up && args.state.paused
    args.state.bounce += STEP_BOUNCE if args.state.bounce < MAX_BOUNCE
  elsif args.inputs.down && args.state.paused
    args.state.bounce -= STEP_BOUNCE if args.state.bounce > MIN_BOUNCE
  end
  # LOOP
  if !args.state.paused
    #ball vector
    move_x = args.state.ball_vector[:x]
    move_y = args.state.ball_vector[:y]
    # apply gravity
    move_y = move_y - args.state.gravity
    args.state.ball_vector[:x] = move_x
    args.state.ball_vector[:y] = move_y

    # bounce
    x = args.state.ball[:x]
    y = args.state.ball[:y]
    new_x = x + move_x
    new_y = y + move_y
    if bouncing?(new_x,new_y,cx,cy,cr)
      new_move_x, new_move_y = reflection_vector(x,y,cx,cy,move_x,move_y)
      args.state.ball_vector[:x] = new_move_x * args.state.bounce
      args.state.ball_vector[:y] = new_move_y * args.state.bounce
      # play sound
      sound = Math.rand(3)+1
      args.outputs.sounds << "sounds/bounce#{sound}.wav"
    end

    # move the ball
    move_x = args.state.ball_vector[:x]
    move_y = args.state.ball_vector[:y]
    args.state.ball[:x] = args.state.ball[:x] + move_x
    args.state.ball[:y] = args.state.ball[:y] + move_y
  end

  # END?
  if !args.state.paused
    if too_fast?(move_x, move_y, cr)
      #RESET state and pause
      args.state.ball = {
        x: 500,
        y: 500,
      }
      args.state.ball_vector = {
        x: 0,
        y: 0
      }
      args.state.paused = true
    end
  end


  # RENDER
  #
  # BG
  bg = args.state.paused ? 'sprites/BG1_menu.png' : 'sprites/BG1.png'
  args.outputs.sprites << {
    x: 0,
    y: 0,
    w: 1280,
    h: 720,
    path: bg }

  if  args.state.paused
    # Render menu
    args.outputs.labels  << [640, 40, "Press <space> to start the game", 6, 1]
    # min_x = 440
    # mid = 615
    # max_x = 780
    # l = 340
    gravity_x = 440 + args.state.gravity * 179
    args.outputs.sprites << {
      x: gravity_x,
      y: 445,
      w: 32,
      h: 32,
      path: 'sprites/slider.png'
    }
    bounce_x = 440 + (args.state.bounce - 1)*3400
    args.outputs.sprites << {
      x: bounce_x,
      y: 325,
      w: 32,
      h: 32,
      path: 'sprites/slider.png'
    }
  end

  # BALL

  args.outputs.sprites << {
    x: args.state.ball[:x]-16,
    y: args.state.ball[:y]-16,
    w: 32,
    h: 32,
    path: 'sprites/ball.png' } if !args.state.paused
end
