#ifndef _BASE_CIRCLE_HPP_
#define _BASE_CIRCLE_HPP_

// ------------------------------------------------------------------------------------------------
#include "Config.hpp"
#include "Base/Vector2f.hpp"

// ------------------------------------------------------------------------------------------------
namespace SqMod {

/* ------------------------------------------------------------------------------------------------
 * ...
*/
struct Circle
{
    // --------------------------------------------------------------------------------------------
    typedef SQFloat Value;
    // --------------------------------------------------------------------------------------------
    static const Circle NIL;
    static const Circle MIN;
    static const Circle MAX;
    // --------------------------------------------------------------------------------------------
    static SQChar Delim;
    // --------------------------------------------------------------------------------------------
    Vector2f    pos;
    Value       rad;
    // --------------------------------------------------------------------------------------------
    Circle() noexcept;
    Circle(Value r) noexcept;
    Circle(const Vector2f & p) noexcept;
    Circle(const Vector2f & p, Value r) noexcept;
    Circle(Value x, Value y, Value r) noexcept;
    // --------------------------------------------------------------------------------------------
    Circle(const Circle & c) noexcept;
    Circle(Circle && c) noexcept;
    // --------------------------------------------------------------------------------------------
    ~Circle();
    // --------------------------------------------------------------------------------------------
    Circle & operator = (const Circle & c) noexcept;
    Circle & operator = (Circle && c) noexcept;
    // --------------------------------------------------------------------------------------------
    Circle & operator = (Value r) noexcept;
    Circle & operator = (const Vector2f & p) noexcept;
    // --------------------------------------------------------------------------------------------
    Circle & operator += (const Circle & c) noexcept;
    Circle & operator -= (const Circle & c) noexcept;
    Circle & operator *= (const Circle & c) noexcept;
    Circle & operator /= (const Circle & c) noexcept;
    Circle & operator %= (const Circle & c) noexcept;
    // --------------------------------------------------------------------------------------------
    Circle & operator += (Value r) noexcept;
    Circle & operator -= (Value r) noexcept;
    Circle & operator *= (Value r) noexcept;
    Circle & operator /= (Value r) noexcept;
    Circle & operator %= (Value r) noexcept;
    // --------------------------------------------------------------------------------------------
    Circle & operator += (const Vector2f & p) noexcept;
    Circle & operator -= (const Vector2f & p) noexcept;
    Circle & operator *= (const Vector2f & p) noexcept;
    Circle & operator /= (const Vector2f & p) noexcept;
    Circle & operator %= (const Vector2f & p) noexcept;
    // --------------------------------------------------------------------------------------------
    Circle & operator ++ () noexcept;
    Circle & operator -- () noexcept;
    // --------------------------------------------------------------------------------------------
    Circle operator ++ (int) noexcept;
    Circle operator -- (int) noexcept;
    // --------------------------------------------------------------------------------------------
    Circle operator + (const Circle & c) const noexcept;
    Circle operator - (const Circle & c) const noexcept;
    Circle operator * (const Circle & c) const noexcept;
    Circle operator / (const Circle & c) const noexcept;
    Circle operator % (const Circle & c) const noexcept;
    // --------------------------------------------------------------------------------------------
    Circle operator + (Value r) const noexcept;
    Circle operator - (Value r) const noexcept;
    Circle operator * (Value r) const noexcept;
    Circle operator / (Value r) const noexcept;
    Circle operator % (Value r) const noexcept;
    // --------------------------------------------------------------------------------------------
    Circle operator + (const Vector2f & p) const noexcept;
    Circle operator - (const Vector2f & p) const noexcept;
    Circle operator * (const Vector2f & p) const noexcept;
    Circle operator / (const Vector2f & p) const noexcept;
    Circle operator % (const Vector2f & p) const noexcept;
    // --------------------------------------------------------------------------------------------
    Circle operator + () const noexcept;
    Circle operator - () const noexcept;
    // --------------------------------------------------------------------------------------------
    bool operator == (const Circle & c) const noexcept;
    bool operator != (const Circle & c) const noexcept;
    bool operator < (const Circle & c) const noexcept;
    bool operator > (const Circle & c) const noexcept;
    bool operator <= (const Circle & c) const noexcept;
    bool operator >= (const Circle & c) const noexcept;
    // --------------------------------------------------------------------------------------------
    SQInteger Cmp(const Circle & c) const noexcept;
    // --------------------------------------------------------------------------------------------
    const SQChar * ToString() const noexcept;
    // --------------------------------------------------------------------------------------------
    void Set(Value nr) noexcept;
    void Set(const Circle & nc) noexcept;
    void Set(const Vector2f & np) noexcept;
    void Set(const Vector2f & np, Value nr) noexcept;
    // --------------------------------------------------------------------------------------------
    void Set(Value nx, Value ny) noexcept;
    void Set(Value nx, Value ny, Value nr) noexcept;
    // --------------------------------------------------------------------------------------------
    void Set(const SQChar * values, SQChar delim) noexcept;
    // --------------------------------------------------------------------------------------------
    void Generate() noexcept;
    void Generate(Value min, Value max, bool r) noexcept;
    void Generate(Value xmin, Value xmax, Value ymin, Value ymax) noexcept;
    void Generate(Value xmin, Value xmax, Value ymin, Value ymax, Value rmin, Value rmax) noexcept;
    // --------------------------------------------------------------------------------------------
    void Clear() noexcept { pos.Clear(); rad = 0.0; }
    // --------------------------------------------------------------------------------------------
    Circle Abs() const noexcept;
};

} // Namespace:: SqMod

#endif // _BASE_CIRCLE_HPP_