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

#include "DawnPokerGame.hpp"

using namespace Dawn;

std::shared_ptr<Material> material;
std::shared_ptr<TestBackgroundShader> shader;

DawnGame::DawnGame(DawnHost &host) :
  host(host),
  renderManager(*this),
  inputManager(*this)
{
}

int32_t DawnGame::init() {
  this->assetManager.init();
  this->renderManager.init();

  this->scene = std::make_shared<Scene>(*this);

  auto cameraObject = this->scene->createSceneItem();
  auto camera = cameraObject->addComponent<Camera>();
  camera->type = CAMERA_TYPE_ORTHONOGRAPHIC;
  camera->orthoLeft = 0.0f;
  camera->orthoRight = 1.0f;
  camera->orthoTop = 0.0f;
  camera->orthoBottom = 1.0f;
  camera->transform.lookAt(glm::vec3(0, 0, 10), glm::vec3(0, 0, 0));
  // camera->transform.lookAt(glm::vec3(50, 50, 50), glm::vec3(0, 0, 0));

  auto quad = this->scene->createSceneItem();
  auto meshRenderer = quad->addComponent<MeshRenderer>();
  meshRenderer->mesh = std::make_shared<Mesh>();
  meshRenderer->mesh->createBuffers(QUAD_VERTICE_COUNT, QUAD_INDICE_COUNT);
  QuadMesh::bufferQuadMesh(meshRenderer->mesh.get(),
    glm::vec2(0, 0), glm::vec2(0, 0),
    glm::vec2(1.0f, 1.0f), glm::vec2(1.0f, 1.0f),
    0, 0
  );

  shader = std::make_shared<TestBackgroundShader>();
  shader->compile();
  material = quad->addComponent<Material>();
  material->setShader(shader);
  
  return DAWN_GAME_INIT_RESULT_SUCCESS;
}

int32_t DawnGame::update(float_t delta) {
  this->assetManager.update();
  this->inputManager.update();
  this->timeManager.update(delta);

  if(this->scene != nullptr) this->scene->update();

  material->floatValues[shader->paramTime] = this->timeManager.time;
  
  this->renderManager.update();
  return DAWN_GAME_UPDATE_RESULT_SUCCESS;
}

DawnGame::~DawnGame() {
  
}