/********************************************************************************
*                                                                               *
*   Copyright (C) Golaem S.A.  All Rights Reserved.                             *
*                                                                               *
*   Original code & license:                                                    *
*                                                                               *
*   OpenPerchOn -- PerchOning Behaviors for Autonomous Characters                   *
*                                                                               *
*   Copyright (c) 2002-2003, Sony Computer Entertainment America                *
*   Original author: Craig Reynolds <craig_reynolds@playstation.sony.com>       *
*                                                                               *
*   Permission is hereby granted, free of charge, to any person obtaining a     *
*   copy of this software and associated documentation files (the "Software"),  *
*   to deal in the Software without restriction, including without limitation   *
*   the rights to use, copy, modify, merge, publish, distribute, sublicense,    *
*   and/or sell copies of the Software, and to permit persons to whom the       *
*   Software is furnished to do so, subject to the following conditions:        *
*                                                                               *
*   The above copyright notice and this permission notice shall be included in  *
*   all copies or substantial portions of the Software.                         *
*                                                                               *
*   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR  *
*   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,    *
*   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL    *
*   THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER  *
*   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING     *
*   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER         *
*   DEALINGS IN THE SOFTWARE.                                                   *
*                                                                               *
********************************************************************************/

#pragma once

#include "glmSDKAPI.h"
#include <glmAbstractUserBehavior.h>
#include <glmEntity.h>
#include <glmAbstractFlockPerchingSupport.h>

namespace glm
{
    class BoidEntityComponent;
    class BoidContext;

    class GLM_SDK_API BoidPerchOnBehavior : public AbstractUserBehavior
    {
    public:
        glm::PODArray<AbstractFlockPerchingSupport*> _perchingSupports;
        bool _randomOrientationPerching;

        struct PerchStopAction
        {
            enum Value
            {
                TAKE_OFF,
                STAY,
                END
            };
        };

        PerchStopAction::Value _stopAction;

    private:
        BoidContext* _boidContext;

    public:
        GLM_CLASS_STAT_ID( glm::MemoryStatIds::Simulation)

        BoidPerchOnBehavior();
        virtual ~BoidPerchOnBehavior();

        // type checking - value derived from this type
        virtual bool isThisType(const AbstractBehavior* value) const override;

    protected:
        // cloning
        friend class CloneFactory;
        inline virtual BoidPerchOnBehavior* create() const override;

        virtual void doInit(BehaviorGraph& graph) override;
        virtual void doStart(int64_t index, BehaviorGraph& graph) override;
        virtual void doUpdate(int64_t index, BehaviorGraph& graph, Time dt) override;
        virtual AbstractBehavior::ResultStatus::Value doStop(int64_t index, BehaviorGraph& graph, Time dt) override;

    private:
        GLM_DISALLOW_COPY_AND_ASSIGN(BoidPerchOnBehavior);
    };

    //-------------------------------------------------------------------------
    inline BoidPerchOnBehavior* BoidPerchOnBehavior::create() const
    {
        BoidPerchOnBehavior* myNewBoidPerchOnBehavior = GLM_NEW(BoidPerchOnBehavior, myNewBoidPerchOnBehavior, getClassMemoryStatId());
        return myNewBoidPerchOnBehavior;
    }
} // namespace glm
