#include "Vector2i.hpp"
#include "Vector2.hpp"
#include "Vector3.hpp"
#include "Vector4.hpp"
#include <cmath>

TSE::Vector2i::Vector2i() { }

TSE::Vector2i::Vector2i(int _x, int _y)
{
    x = _x;
    y = _y;
}

TSE::Vector2i::Vector2i(const Vector2i &other)
{
    x = other.x;
    y = other.y;
}

TSE::Vector2i::Vector2i(const Vector2 &other)
{
    x = other.x;
    y = other.y;
}

TSE::Vector2i::Vector2i(const Vector3 &other)
{
    x = other.x;
    y = other.y;
}

TSE::Vector2i::Vector2i(const Vector4 &other)
{
    x = other.x;
    y = other.y;
}

bool TSE::Vector2i::IsValid() const
{
    return !std::isnan(x) && !std::isnan(y);
}

TSE::string TSE::Vector2i::ToString() const
{
    return "(" + std::to_string(x) + "|" + std::to_string(y) + ")";
}

TSE::Vector2 TSE::Vector2i::ToVector2() const
{
    return Vector2();
}

TSE::Vector3 TSE::Vector2i::ToVector3() const
{
    return Vector3(x,y,0);
}

TSE::Vector4 TSE::Vector2i::ToVector4() const
{
    return Vector4(x,y,0,0);
}

TSE::Vector2i TSE::Vector2i::operator+(const Vector2i &other) const
{
    return Vector2i(x + other.x, y + other.y);
}

TSE::Vector2i TSE::Vector2i::operator+=(const Vector2i &other)
{
    *this = *this + other;
    return *this;
}

TSE::Vector2i TSE::Vector2i::operator-(const Vector2i &other) const
{
    return Vector2i(x - other.x, y - other.y);
}

TSE::Vector2i TSE::Vector2i::operator-=(const Vector2i &other)
{
    *this = *this - other;
    return *this;
}

TSE::Vector2i TSE::Vector2i::operator*(const Vector2i &other) const
{
    return Vector2i(x * other.x, y * other.y);
}

TSE::Vector2i TSE::Vector2i::operator*=(const Vector2i &other)
{
    *this = *this * other;
    return *this;
}

TSE::Vector2i TSE::Vector2i::operator/(const Vector2i &other) const
{
    return Vector2i(x / other.x, y / other.y);
}

TSE::Vector2i TSE::Vector2i::operator/=(const Vector2i &other)
{
    *this = *this / other;
    return *this;
}

TSE::Vector2i TSE::Vector2i::operator*(const float other) const
{
    return Vector2i(x * other, y * other);
}

TSE::Vector2i TSE::Vector2i::operator*=(const float other)
{
    *this = *this * other;
    return *this;
}

TSE::Vector2i TSE::Vector2i::operator/(const float other) const
{
    return Vector2i(x / other, y / other);
}

TSE::Vector2i TSE::Vector2i::operator/=(const float other)
{
    *this = *this / other;
    return *this;
}

bool TSE::Vector2i::operator==(const Vector2i &other) const
{
    return x == other.x && y == other.y;
}

bool TSE::Vector2i::operator!=(const Vector2i &other) const
{
    return !(*this == other);
}