/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/

namespace EMotionFX
{
    class AnimGraph
    {
    public:
        //void RecursiveReinit();
        //bool InitAfterLoading();
        //void UpdateUniqueData();
        MOCK_CONST_METHOD0(GetFileName, const char*());
        //const AZStd::string& GetFileNameString() const;
        //void SetFileName(const char* fileName);
        //AnimGraphStateMachine* GetRootStateMachine() const;
        //void SetRootStateMachine(AnimGraphStateMachine* stateMachine);
        //AnimGraphNode* RecursiveFindNodeByName(const char* nodeName) const;
        //bool IsNodeNameUnique(const AZStd::string& newNameCandidate, const AnimGraphNode* forNode) const;
        MOCK_CONST_METHOD1(RecursiveFindNodeById, AnimGraphNode*(AnimGraphNodeId));
        MOCK_CONST_METHOD1(RecursiveFindTransitionById, AnimGraphStateTransition*(AnimGraphConnectionId));
        MOCK_CONST_METHOD2(RecursiveCollectNodesOfType, void(const AZ::TypeId& nodeType, AZStd::vector<AnimGraphNode*>* outNodes));
        MOCK_CONST_METHOD2(RecursiveCollectTransitionConditionsOfType, void(const AZ::TypeId& conditionType, MCore::Array<AnimGraphTransitionCondition*>* outConditions));
        MOCK_METHOD2(RecursiveCollectObjectsOfType, void(const AZ::TypeId& objectType, AZStd::vector<AnimGraphObject*>& outObjects));
        MOCK_METHOD2(RecursiveCollectObjectsAffectedBy, void(AnimGraph* animGraph, AZStd::vector<AnimGraphObject*>& outObjects));
        //uint32 RecursiveCalcNumNodes() const;
        //void RecursiveCalcStatistics(Statistics& outStatistics) const;
        //uint32 RecursiveCalcNumNodeConnections() const;
        //void DecreaseInternalAttributeIndices(uint32 decreaseEverythingHigherThan);
        //AZStd::string GenerateNodeName(const AZStd::unordered_set<AZStd::string>& nameReserveList, const char* prefix = "Node") const;
        MOCK_CONST_METHOD0(GetNumParameters, size_t());
        MOCK_CONST_METHOD0(GetNumValueParameters, size_t());
        MOCK_CONST_METHOD1(FindParameter, const Parameter*(size_t index));
        MOCK_CONST_METHOD1(FindValueParameter, const ValueParameter*(size_t index));
        MOCK_CONST_METHOD0(RecursivelyGetGroupParameters, GroupParameterVector());
        MOCK_CONST_METHOD0(RecursivelyGetValueParameters, const ValueParameterVector&());
        MOCK_CONST_METHOD0(GetChildParameters, const ParameterVector&());
        MOCK_CONST_METHOD0(GetChildValueParameters, ValueParameterVector());
        MOCK_CONST_METHOD1(FindParameterByName, const Parameter*(const AZStd::string& paramName));
        MOCK_CONST_METHOD1(FindValueParameterByName, const ValueParameter*(const AZStd::string& paramName));
        MOCK_CONST_METHOD1(FindGroupParameterByName, const GroupParameter*(const AZStd::string& groupName));
        MOCK_CONST_METHOD1(FindParentGroupParameter, const GroupParameter*(const Parameter* parameter));
        MOCK_CONST_METHOD1(FindParameterIndexByName, AZ::Outcome<size_t>(const AZStd::string& paramName));
        MOCK_CONST_METHOD1(FindValueParameterIndexByName, AZ::Outcome<size_t>(const AZStd::string& paramName));
        //MOCK_CONST_METHOD1(FindParameterIndex, AZ::Outcome<size_t>(const Parameter* parameter));
        MOCK_CONST_METHOD1(FindParameterIndex, AZ::Outcome<size_t>(Parameter* parameter));
        MOCK_CONST_METHOD1(FindValueParameterIndex, AZ::Outcome<size_t>(const ValueParameter* parameter));
        MOCK_CONST_METHOD1(FindRelativeParameterIndex, AZ::Outcome<size_t>(const Parameter* parameter));
        MOCK_METHOD2(AddParameter, bool(Parameter* parameter, const GroupParameter* parent));
        MOCK_METHOD3(InsertParameter, bool(size_t index, Parameter* parameter, const GroupParameter* parent));
        MOCK_METHOD2(RenameParameter, bool(Parameter* parameter, const AZStd::string& newName));
        MOCK_METHOD1(RemoveParameter, bool(Parameter* parameter));
        MOCK_METHOD1(TakeParameterFromParent, bool(const Parameter* parameter));
        MOCK_CONST_METHOD0(GetID, uint32());
        MOCK_METHOD1(SetID, void(uint32 id));
        MOCK_METHOD1(SetDirtyFlag, void(bool dirty));
        MOCK_CONST_METHOD0(GetDirtyFlag, bool());
        //void SetAutoUnregister(bool enabled);
        //bool GetAutoUnregister() const;
        //void SetIsOwnedByRuntime(bool isOwnedByRuntime);
        //bool GetIsOwnedByRuntime() const;
        //void SetIsOwnedByAsset(bool isOwnedByAsset);
        //bool GetIsOwnedByAsset() const;
        //uint32 GetNumNodeGroups() const;
        //AnimGraphNodeGroup* GetNodeGroup(uint32 index) const;
        //AnimGraphNodeGroup* FindNodeGroupByName(const char* groupName) const;
        //uint32 FindNodeGroupIndexByName(const char* groupName) const;
        //void AddNodeGroup(AnimGraphNodeGroup* nodeGroup);
        //void RemoveNodeGroup(uint32 index, bool delFromMem = true);
        //void RemoveAllNodeGroups(bool delFromMem = true);
        //AnimGraphNodeGroup* FindNodeGroupForNode(AnimGraphNode* animGraphNode) const;
        //void FindAndRemoveCycles(AZStd::string* outRemovedConnectionsMessage = nullptr);
        //AnimGraphGameControllerSettings& GetGameControllerSettings();
        //bool GetRetargetingEnabled() const;
        //void SetRetargetingEnabled(bool enabled);
        //void RemoveAllObjectData(AnimGraphObject* object, bool delFromMem);
        //void AddObject(AnimGraphObject* object);
        //void RemoveObject(AnimGraphObject* object);
        //uint32 GetNumObjects() const;
        //AnimGraphObject* GetObject(uint32 index) const;
        //void ReserveNumObjects(uint32 numObjects);
        //uint32 GetNumNodes() const;
        //AnimGraphNode* GetNode(uint32 index) const;
        //void ReserveNumNodes(uint32 numNodes);
        //uint32 CalcNumMotionNodes() const;
        MOCK_CONST_METHOD0(GetNumAnimGraphInstances, size_t());
        MOCK_CONST_METHOD1(GetAnimGraphInstance, AnimGraphInstance*(size_t index));
        MOCK_METHOD1(ReserveNumAnimGraphInstances, void(size_t numInstances));
        MOCK_METHOD1(AddAnimGraphInstance, void(AnimGraphInstance* animGraphInstance));
        MOCK_METHOD1(RemoveAnimGraphInstance, void(AnimGraphInstance* animGraphInstance));
        //void Lock();
        //void Unlock();
        //bool SaveToFile(const AZStd::string& filename, AZ::SerializeContext* context) const;
        //void RemoveInvalidConnections(bool logWarnings=false);
    };
} // namespace EMotionFX