#pragma once

#include <iostream>
#include <SDL3/SDL.h>

#define DISABLE_COPY(Class) \
    Class(const Class&) = delete; \
    Class& operator=(const Class&) = delete;

#define DISABLE_MOVE(Class) \
    Class(Class&&) = delete; \
    Class& operator=(Class&&) = delete;

#define DISABLE_COPY_AND_MOVE(Class) \
    DISABLE_COPY(Class) \
    DISABLE_MOVE(Class)

#define LOG(Msg) \
    std::cout << "\033[0m[LOG] " << __PRETTY_FUNCTION__ << ' ' << Msg << '\n';

#define WARN(Msg) \
    std::cout << "\033[33m[WARN] " << __PRETTY_FUNCTION__ << ' ' << Msg << "\033[0m\n";

#define ERROR(Msg) \
    std::cout << "\033[31m[ERROR] " << __PRETTY_FUNCTION__ << ' ' << Msg << "\033[0m\n";

#define PLNIMP(Msg) \
    std::cout << "\033[92m" << Msg << "\033[0m\n";

#define GAME_ENTITY(ClassName) \
    class ClassName : public Object::Entity { \
        using Object::Entity::Entity; \
        public: \
            ~ClassName() override = default; \
            void start() override; \
            void update(float deltaTime) override;

#define END_GAME_ENTITY() \
    };

#define RUNNING_TIME() \
    SDL_GetTicks() / 1000.f

#define PI 3.14159265358979323846f
#define UNIVERSAL_SCALE_COEFFICIENT 0.25f
#define TARGET_FPS 60
#define TARGET_UPDATE_RATE 120
#define ENABLE_LOW_LATENCY_VSYNC 1
#define VSYNC_FPS_OFFSET 2