#ifndef _H_CAMERA_H
#define _H_CAMERA_H

#include "gameplay/entity.h"

class Camera {
public:
  Camera(float viewPortW, float viewPortH)
      : position(glm::vec3(0.0f, 0.0f, 0.0f)),
        front(glm::vec3(0.0f, 0.0f, -1.0f)), up(glm::vec3(0.0f, 1.0f, 0.0f)),
        viewPortW(viewPortW), viewPortH(viewPortH) {};

  void setPosition(const glm::vec3 &position) { this->position = position; }

  const Entity *getTarget() const { return target; }
  const glm::vec3 getCenterPos() const {
    return glm::vec3(position.x + (viewPortW / 2.f),
                     position.y + (viewPortH / 2.f), 0.0f);
  }
  void setTarget(Entity *target) { this->target = target; }
  void unsetTarget() { target = nullptr; }
  bool isTargeting() { return (target != nullptr); }

  void update(double deltaTime);
  void setViewportSize(float width, float height);

  const glm::vec3 worldToLocal(const glm::vec3 &worldCoordinates);

  glm::mat4 getViewMatrix();
  glm::mat4 getProjectionMatrix();
  const glm::vec3 getPosition() const { return position; }

private:
  Entity *target = nullptr;

  glm::vec3 position;
  glm::vec3 front;
  glm::vec3 up;

  float viewPortW, viewPortH;

  float speed = 300.0f;
};

#endif // _H_CAMERA_H
