/**
 * Copyright (c) 2021 Dominic Masters
 * 
 * This software is released under the MIT License.
 * https://opensource.org/licenses/MIT
 */

#include "position.h"

positiondebug_t positionDebugCreate(
  primitive_t *debugPrimitive,
  texture_t *fontTexture, tileset_t *fontTileset
) {
  positiondebug_t debug = {
    .primitive = debugPrimitive,
    .textTexture = fontTexture,
    .textTileset = fontTileset,
    .x = 0, .y = 0, .z = 0,
    .pitch = 0, .yaw = 0, .roll = 0,
    .scaleX = 1, .scaleY = 1, .scaleZ = 1
  };

  debug.textBatch = spriteBatchCreate(POSITION_DEBUG_FONT_CHARS_MAX);

  return debug;
}

void positionDebugRender(shader_t *shader, positiondebug_t *debug) {
  float speed = 0.5;

  // Update values.
  if(inputIsDown(INPUT_DEBUG_FINE)) speed *= 0.1;
  if(inputIsDown(INPUT_DEBUG_UP)) debug->z -= TIME_STATE.delta * speed;
  if(inputIsDown(INPUT_DEBUG_DOWN)) debug->z += TIME_STATE.delta * speed;
  if(inputIsDown(INPUT_DEBUG_LEFT)) debug->x -= TIME_STATE.delta * speed;
  if(inputIsDown(INPUT_DEBUG_RIGHT)) debug->x += TIME_STATE.delta * speed;
  if(inputIsDown(INPUT_DEBUG_LOWER)) debug->y -= TIME_STATE.delta * speed;
  if(inputIsDown(INPUT_DEBUG_RAISE)) debug->y += TIME_STATE.delta * speed;
  if(inputIsDown(INPUT_DEBUG_MINUS)) {
    debug->scaleX -= TIME_STATE.delta * speed;
    debug->scaleY -= TIME_STATE.delta * speed;
    debug->scaleZ -= TIME_STATE.delta * speed;
  }
  if(inputIsDown(INPUT_DEBUG_PLUS)) {
    debug->scaleX += TIME_STATE.delta * speed;
    debug->scaleY += TIME_STATE.delta * speed;
    debug->scaleZ += TIME_STATE.delta * speed;
  }

  // Render object
  shaderUsePositionAndScale(shader,
    debug->x, debug->y, debug->z,
    mathDeg2Rad(debug->pitch),mathDeg2Rad(debug->yaw),mathDeg2Rad(debug->roll),
    debug->scaleX, debug->scaleY, debug->scaleZ
  );
  primitiveDraw(debug->primitive, 0, -1);

  // Render debug text
  char text[POSITION_DEBUG_FONT_CHARS_MAX];
  sprintf(text, "%.2f, %.2f, %.2f\n%.2f, %.2f, %.2f \n%.2f, %.2f, %.2f",
    debug->x, debug->y, debug->z,
    debug->pitch, debug->yaw, debug->roll,
    debug->scaleX, debug->scaleY, debug->scaleZ
  );

  shaderUseTexture(shader, debug->textTexture);
  shaderUsePosition(shader,
    0, 1, 0,
    mathDeg2Rad(-90), mathDeg2Rad(0), 0
  );
  spriteBatchFlush(debug->textBatch);
  fontSpriteBatchBuffer(debug->textBatch, debug->textTileset, text,
    FONT_CENTER_X, FONT_CENTER_Y, 0,
    -1, 0.1
  );
  spriteBatchDraw(debug->textBatch, 0, -1);
}

void positionDebugDispose(positiondebug_t *debug) {
  spriteBatchDispose(debug->textBatch);
}