//
// Copyright © 2019 Arm Ltd. All rights reserved.
// SPDX-License-Identifier: MIT
//

#pragma once

#include "armnn/profiling/ISendTimelinePacket.hpp"
#include <armnn/Types.hpp>

namespace armnn
{

namespace profiling
{

class TimelineUtilityMethods
{
public:

    // static factory method which will return a pointer to a timelie utility methods
    // object if profiling is enabled. Otherwise will return a null unique_ptr
    static std::unique_ptr<TimelineUtilityMethods> GetTimelineUtils();

    TimelineUtilityMethods(std::unique_ptr<ISendTimelinePacket>& sendTimelinePacket)
        : m_SendTimelinePacket(std::move(sendTimelinePacket)) {}

    TimelineUtilityMethods(TimelineUtilityMethods&& other)
        : m_SendTimelinePacket(std::move(other.m_SendTimelinePacket)) {}

    TimelineUtilityMethods(const TimelineUtilityMethods& other) = delete;

    TimelineUtilityMethods& operator=(const TimelineUtilityMethods& other) = delete;

    TimelineUtilityMethods& operator=(TimelineUtilityMethods&& other) = default;

    ~TimelineUtilityMethods() = default;

    void SendWellKnownLabelsAndEventClasses();

    ProfilingDynamicGuid CreateNamedTypedEntity(const std::string& name, const std::string& type);

    void CreateNamedTypedEntity(ProfilingGuid entityGuid, const std::string& name, const std::string& type);

    void CreateNamedTypedEntity(ProfilingGuid entityGuid, const std::string& name, ProfilingStaticGuid typeGuid);

    void MarkEntityWithLabel(ProfilingGuid entityGuid, const std::string &labelName, ProfilingStaticGuid labelLinkGuid);

    ProfilingStaticGuid DeclareLabel(const std::string& labelName);

    void NameEntity(ProfilingGuid entityGuid, const std::string& name);

    void TypeEntity(ProfilingGuid entityGuid, const std::string& type);

    ProfilingDynamicGuid CreateNamedTypedChildEntity(ProfilingGuid parentEntityGuid,
                                                     const std::string& entityName,
                                                     const std::string& entityType);

    void CreateNamedTypedChildEntity(ProfilingGuid entityGuid,
                                     ProfilingGuid parentEntityGuid,
                                     const std::string& entityName,
                                     const std::string& entityType);

    void CreateNamedTypedChildEntity(ProfilingGuid entityGuid,
                                     ProfilingGuid parentEntityGuid,
                                     const std::string& entityName,
                                     ProfilingStaticGuid typeGuid);

    ProfilingDynamicGuid CreateRelationship(ProfilingRelationshipType relationshipType,
                                            ProfilingGuid headGuid,
                                            ProfilingGuid tailGuid);

    ProfilingDynamicGuid CreateConnectionRelationship(ProfilingRelationshipType relationshipType,
                                                      ProfilingGuid headGuid,
                                                      ProfilingGuid tailGuid);

    void CreateTypedEntity(ProfilingGuid entityGuid, ProfilingStaticGuid typeGuid);

    void MarkEntityWithType(ProfilingGuid entityGuid, ProfilingStaticGuid typeNameGuid);

    ProfilingDynamicGuid RecordEvent(ProfilingGuid entityGuid, ProfilingStaticGuid eventClassGuid);

    ProfilingDynamicGuid RecordWorkloadInferenceAndStartOfLifeEvent(ProfilingGuid workloadGuid,
                                                                    ProfilingGuid inferenceGuid);

    void RecordEndOfLifeEvent(ProfilingGuid entityGuid);

    void Commit() { m_SendTimelinePacket->Commit(); }

private:
    std::unique_ptr<ISendTimelinePacket> m_SendTimelinePacket;
};

} // namespace profiling

} // namespace armnn
