#include "def.h"
#include "pilot.h"
#include "log.h"
#include "player.h"

Pilot* player = NULL;
static unsigned int player_flags = PLAYER_FLAG_NULL;

static FP player_turn = 0.;
static FP player_acc  = 0.;

// To be used in pilot.c
void player_think(Pilot* player, const FP dt) {
  player->solid->dir_vel = 0.;
  if(player_turn)
    player->solid->dir_vel -= player->ship->turn*player_turn/(FP)(1<<15);
#if 0
  if(player_isFlag(PLAYER_FLAG_MOV_LEFT))
    player->solid->dir_vel += player->ship->turn;
  if(player_isFlag(PLAYER_FLAG_MOV_RIGHT))
    player->solid->dir_vel -= player->ship->turn;
#endif

  player->solid->force = player->ship->thrust*player_acc/(FP)(1<<15);
}

// Flag manipulationz.
int player_isFlag(unsigned int flag) {
  return player_flags & flag;
}

void player_setFlag(unsigned int flag) {
  if(!player_isFlag(flag))
    player_flags |= flag;
}

void player_rmFlag(unsigned int flag) {
  if(player_isFlag(flag))
    player_flags ^= flag;
}

// --Events--

// Joystick.
static void handle_joyaxis(int axis, int value) {
  switch(axis) {
    case 0:
      player_turn = (FP)value;
      break;
    case 1:
      if(value <= 0)
        player_acc = (FP)-value;
      break;
  }
}

static void handle_joybutton(int button) {
  switch(button) {
    case 0:
      break;
    case 1:
      break;
  }
}

// Keyboard.
static void handle_keydown(SDLKey key) {
  SDL_Event quit;
  switch(key) {
    case SDLK_ESCAPE:
      quit.type = SDL_QUIT;
      SDL_PushEvent(&quit);
      break;
    case SDLK_LEFT:
    case SDLK_a:
      player_turn -= (FP)(1<<15);
      break;
    case SDLK_RIGHT:
    case SDLK_d:
      player_turn += (FP)(1<<15);
      break;
    case SDLK_UP:
    case SDLK_w:
      player_acc += (FP)(1<<15);
      break;
    default:
      break;
  }
}

static void handle_keyup(SDLKey key) {
  switch(key) {
    case SDLK_LEFT:
    case SDLK_a:
      player_turn += (FP)(1<<15);
      break;
    case SDLK_RIGHT:
    case SDLK_d:
      player_turn -= (FP)(1<<15);
      break;
    case SDLK_UP:
    case SDLK_w:
      player_acc -= (FP)(1<<15);
      //break;
    default:
      break;
  }
}

// Global input.
void handle_input(SDL_Event* event) {
  switch(event->type) {
    case SDL_JOYAXISMOTION:
      handle_joyaxis(event->jaxis.axis, event->jaxis.value);
      break;
    case SDL_JOYBUTTONDOWN:
      handle_joybutton(event->jbutton.button);
      break;
    case SDL_KEYDOWN:
      handle_keydown(event->key.keysym.sym);
      break;
    case SDL_KEYUP:
      handle_keyup(event->key.keysym.sym);
      break;
  }
}