/***************************************************************************
*                                                                          *
*  Copyright (C) Golaem S.A.  All Rights Reserved.                         *
*                                                                          *
***************************************************************************/

#pragma once

#include "glmSDKAPI.h"

//golaem core includes
#include <glmTypes.h>
#include <glmAngle.h>

namespace glm
{
/**
	* \brief This POD-style class describe the configuration of a path follower.
	* \see glm::PathFollower
	*
	* \ingroup PathFollower
	*
	* \author Golaem <dev@golaem.com>
	*/
class GLM_SDK_API PathFollowerConfiguration
{
  public:
    /**
		* \brief The enumeration containing the different path follower types.
		*/
    class Type
    {
      public:
        enum Value
        {
            NAIVE,                                         // NaivePathFollower
            PLATTER_LIFT_MINIMIZING_DISTANCE_TO_OBSTACLES, // PlatterLiftPathFollower
            PLATTER_LIFT_MAXIMIZING_DISTANCE_TO_OBSTACLES, // PlatterLiftPathFollower
            END
        };
    };

  public:
    /**
		* \brief Access to the default configuration.
		*/
    static PathFollowerConfiguration& defaultConfiguration();

  public:
    /**
		* \brief Default constructor
		*/
    PathFollowerConfiguration();

    /**
		* \brief Destructor
		*/
    ~PathFollowerConfiguration();

  public:
    int _constructionType;
    float _targetUpdateDistanceThreshold;  // The distance under which the path follower local target is updated.
    Time _targetUpdateInterval;            // The maximum time interval between two path follower's local target update.
    float _dichotomicSearchRange;          // The number of search steps for the local target dichotomic search.
    float _dichotomicSearchStopDistance;   // The stop distance for the local target dichotomic search.
    unsigned int _dichotomicSearchNbSteps; // The number of search steps for the local target dichotomic search.
    float _targetReachedDistanceThreshold; // The distance to target under which the path follower clear the current target.

    bool _forbidReversing; // this one is determined at runtime based on pin mode
	bool _allowCollisionAtStart;
	bool _bypassReversingCheck; // this one is static and allow to bypass the check
};
} // namespace glm
