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

#include "GameCamera.hpp"
#include "game/DawnGame.hpp"

using namespace Dawn;

GameCamera::GameCamera(SceneItem *i) : SceneItemComponent(i) {}

std::vector<SceneItemComponent*> GameCamera::getDependencies() {
  return {
    (this->camera = item->getComponent<Camera>())
  };
}

void GameCamera::onStart() {
  assertNotNull(this->camera);
  assertNotNull(this->player);

  useEvent([&]{
    glm::vec3 lookOffset = player->transform->getLocalRotation() * glm::vec3(0, 0, 1.0f);
    glm::vec2 target = glm::vec2(lookOffset.x, lookOffset.z) * lookOffsetScale;
    slowTarget += (target - slowTarget) * getGame()->timeManager.delta * movementScrollSpeed;
  }, this->player->transform->eventTransformUpdated);

  useEvent([&](float_t delta){
    if(current != slowTarget) {
      float_t m = 6.0f;
      float_t s = delta * 3.0f;
      current += glm::vec2(
        mathClamp<float_t>((slowTarget.x - current.x) * s, -m, m),
        mathClamp<float_t>((slowTarget.y - current.y) * s, -m, m)
      );
    }

    glm::vec3 current3 = glm::vec3(current.x, 0, current.y);
    glm::vec3 t0 = player->transform->getLocalPosition();
    camera->transform->lookAt(t0 + current3 + zoomOffset, t0 + current3);
  }, getScene()->eventSceneUpdate);
}