#pragma once

#include <frostbite2D/event/event.h>
#include <frostbite2D/types/type_math.h>
#include <SDL2/SDL_touch.h>

namespace frostbite2D {

class TouchEvent : public Event {
public:
  TouchEvent(EventType type, uint32 timestamp, int64 touchId, int64 fingerId, 
             const Vec2& position, const Vec2& delta, float pressure)
    : Event(timestamp)
    , type_(type)
    , touchId_(touchId)
    , fingerId_(fingerId)
    , position_(position)
    , delta_(delta)
    , pressure_(pressure) {}
  
  EventType getType() const override {
    return type_;
  }
  
  int64 getTouchId() const { return touchId_; }
  int64 getFingerId() const { return fingerId_; }
  const Vec2& getPosition() const { return position_; }
  const Vec2& getDelta() const { return delta_; }
  float getPressure() const { return pressure_; }
  
private:
  EventType type_;
  int64 touchId_;
  int64 fingerId_;
  Vec2 position_;
  Vec2 delta_;
  float pressure_;
};

class TouchDownEvent : public TouchEvent {
public:
  TouchDownEvent(uint32 timestamp, int64 touchId, int64 fingerId, 
                 const Vec2& position, float pressure)
    : TouchEvent(EventType::TouchDown, timestamp, touchId, fingerId, 
                 position, Vec2(0, 0), pressure) {}
};

class TouchUpEvent : public TouchEvent {
public:
  TouchUpEvent(uint32 timestamp, int64 touchId, int64 fingerId, 
               const Vec2& position, float pressure)
    : TouchEvent(EventType::TouchUp, timestamp, touchId, fingerId, 
                 position, Vec2(0, 0), pressure) {}
};

class TouchMoveEvent : public TouchEvent {
public:
  TouchMoveEvent(uint32 timestamp, int64 touchId, int64 fingerId, 
                 const Vec2& position, const Vec2& delta, float pressure)
    : TouchEvent(EventType::TouchMove, timestamp, touchId, fingerId, 
                 position, delta, pressure) {}
};

}
