#pragma once

#include "core/defaults.hpp"

// Aliases utilitzats per simplificar lectures freqüents de Defaults::

namespace Constants {
    // Límits de objectes
    constexpr int MAX_ORNIS = Defaults::Entities::MAX_ORNIS;
    constexpr int MAX_BALES = Defaults::Entities::MAX_BALES;

    // Matemàtiques
    constexpr float PI = Defaults::Math::PI;

    // Helpers per comprovar límits de zona
    inline auto isInPlayArea(float x, float y) -> bool {
        const SDL_FPoint POINT = {x, y};
        return SDL_PointInRectFloat(&POINT, &Defaults::Zones::PLAYAREA);
    }

    inline void getPlayAreaBounds(float& min_x, float& max_x, float& min_y, float& max_y) {
        const auto& zona = Defaults::Zones::PLAYAREA;
        min_x = zona.x;
        max_x = zona.x + zona.w;
        min_y = zona.y;
        max_y = zona.y + zona.h;
    }

    // Obtenir límits segurs (compensant radi de l'entidad)
    inline void getSafePlayAreaBounds(float radi, float& min_x, float& max_x, float& min_y, float& max_y) {
        const auto& zona = Defaults::Zones::PLAYAREA;
        constexpr float MARGE_SEGURETAT = 10.0F;  // Safety margin

        min_x = zona.x + radi + MARGE_SEGURETAT;
        max_x = zona.x + zona.w - radi - MARGE_SEGURETAT;
        min_y = zona.y + radi + MARGE_SEGURETAT;
        max_y = zona.y + zona.h - radi - MARGE_SEGURETAT;
    }

    // Obtenir centro de l'àrea de juego
    inline void getPlayAreaCenter(float& centre_x, float& centre_y) {
        const auto& zona = Defaults::Zones::PLAYAREA;
        centre_x = zona.x + (zona.w / 2.0F);
        centre_y = zona.y + (zona.h / 2.0F);
    }
}  // namespace Constants
