/**
* @file   llpathfindinglinkset.h
* @brief  Definition of a pathfinding linkset that contains various properties required for havok pathfinding.
* @author Stinson@lindenlab.com
*
* $LicenseInfo:firstyear=2012&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2012, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
* $/LicenseInfo$
*/
#ifndef LL_LLPATHFINDINGLINKSET_H
#define LL_LLPATHFINDINGLINKSET_H

#include <string>

#include "llpathfindingobject.h"

class LLSD;

class LLPathfindingLinkset : public LLPathfindingObject
{
public:
    typedef enum
    {
        kUnknown,
        kWalkable,
        kStaticObstacle,
        kDynamicObstacle,
        kMaterialVolume,
        kExclusionVolume,
        kDynamicPhantom
    } ELinksetUse;

    LLPathfindingLinkset(const LLSD &pTerrainData);
    LLPathfindingLinkset(const std::string &pUUID, const LLSD &pLinksetData);
    LLPathfindingLinkset(const LLPathfindingLinkset& pOther);
    virtual ~LLPathfindingLinkset();

    LLPathfindingLinkset& operator = (const LLPathfindingLinkset& pOther);

    inline bool        isTerrain() const                   {return mIsTerrain;};
    inline U32         getLandImpact() const               {return mLandImpact;};
    bool               isModifiable() const                {return mIsModifiable;};
    bool               isPhantom() const;
    bool               canBeVolume() const                 {return mCanBeVolume;};
    static ELinksetUse getLinksetUseWithToggledPhantom(ELinksetUse pLinksetUse);

    inline ELinksetUse getLinksetUse() const               {return mLinksetUse;};

    inline bool        isScripted() const                  {return mIsScripted;};
    inline bool        hasIsScripted() const               {return mHasIsScripted;};

    inline S32         getWalkabilityCoefficientA() const  {return mWalkabilityCoefficientA;};
    inline S32         getWalkabilityCoefficientB() const  {return mWalkabilityCoefficientB;};
    inline S32         getWalkabilityCoefficientC() const  {return mWalkabilityCoefficientC;};
    inline S32         getWalkabilityCoefficientD() const  {return mWalkabilityCoefficientD;};

    bool               isShowUnmodifiablePhantomWarning(ELinksetUse pLinksetUse) const;
    bool               isShowPhantomToggleWarning(ELinksetUse pLinksetUse) const;
    bool               isShowCannotBeVolumeWarning(ELinksetUse pLinksetUse) const;
    LLSD               encodeAlteredFields(ELinksetUse pLinksetUse, S32 pA, S32 pB, S32 pC, S32 pD) const;

    static const S32 MIN_WALKABILITY_VALUE;
    static const S32 MAX_WALKABILITY_VALUE;

protected:

private:
    typedef enum
    {
        kNavMeshGenerationIgnore,
        kNavMeshGenerationInclude,
        kNavMeshGenerationExclude
    } ENavMeshGenerationCategory;

    void                              parseLinksetData(const LLSD &pLinksetData);
    void                              parsePathfindingData(const LLSD &pLinksetData);

    static bool                       isPhantom(ELinksetUse pLinksetUse);
    static ELinksetUse                getLinksetUse(bool pIsPhantom, ENavMeshGenerationCategory pNavMeshGenerationCategory);
    static ENavMeshGenerationCategory getNavMeshGenerationCategory(ELinksetUse pLinksetUse);
    static LLSD                       convertCategoryToLLSD(ENavMeshGenerationCategory pNavMeshGenerationCategory);
    static ENavMeshGenerationCategory convertCategoryFromLLSD(const LLSD &llsd);

    bool         mIsTerrain;
    U32          mLandImpact;
    bool         mIsModifiable;
    bool         mCanBeVolume;
    bool         mIsScripted;
    bool         mHasIsScripted;
    ELinksetUse  mLinksetUse;
    S32          mWalkabilityCoefficientA;
    S32          mWalkabilityCoefficientB;
    S32          mWalkabilityCoefficientC;
    S32          mWalkabilityCoefficientD;
};

#endif // LL_LLPATHFINDINGLINKSET_H