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

#include "TimelineCaptureCommandHandler.hpp"

#include <string>
#include <armnn/Logging.hpp>
namespace armnn
{

namespace timelinedecoder
{

//Array of member functions, the array index matches the decl_id
const TimelineCaptureCommandHandler::ReadFunction TimelineCaptureCommandHandler::m_ReadFunctions[]
{
    &TimelineCaptureCommandHandler::ReadLabel,              // Label decl_id = 0
    &TimelineCaptureCommandHandler::ReadEntity,             // Entity decl_id = 1
    &TimelineCaptureCommandHandler::ReadEventClass,         // EventClass decl_id = 2
    &TimelineCaptureCommandHandler::ReadRelationship,       // Relationship decl_id = 3
    &TimelineCaptureCommandHandler::ReadEvent               // Event decl_id = 4
};

void TimelineCaptureCommandHandler::ParseData(const armnn::profiling::Packet& packet)
{
    uint32_t offset = 0;
    m_PacketLength = packet.GetLength();

    // We are expecting TimelineDirectoryCaptureCommandHandler to set the thread id size
    // if it not set in the constructor
    if (m_ThreadIdSize == 0)
    {
        ARMNN_LOG(error) << "TimelineCaptureCommandHandler: m_ThreadIdSize has not been set";
        return;
    }

    if (packet.GetLength() < 8)
    {
        return;
    }

    const unsigned char* data = reinterpret_cast<const unsigned char*>(packet.GetData());

    uint32_t declId = 0;

    while ( offset < m_PacketLength )
    {
        declId = profiling::ReadUint32(data, offset);
        offset += uint32_t_size;

        (this->*m_ReadFunctions[declId])(data, offset);
    }
}

void TimelineCaptureCommandHandler::ReadLabel(const unsigned char* data, uint32_t& offset)
{
    ITimelineDecoder::Label label;
    label.m_Guid = profiling::ReadUint64(data, offset);
    offset += uint64_t_size;

    uint32_t nameLength = profiling::ReadUint32(data, offset);
    offset += uint32_t_size;

    uint32_t i = 0;
    // nameLength - 1 to account for null operator \0
    for ( i = 0; i < nameLength - 1; ++i )
    {
        label.m_Name += static_cast<char>(profiling::ReadUint8(data, offset + i));
    }
    // Shift offset past nameLength
    uint32_t uint32WordAmount = (nameLength / uint32_t_size) + (nameLength % uint32_t_size != 0 ? 1 : 0);
    offset += uint32WordAmount * uint32_t_size;

    m_TimelineDecoder.CreateLabel(label);
}

void TimelineCaptureCommandHandler::ReadEntity(const unsigned char* data, uint32_t& offset)
{
    ITimelineDecoder::Entity entity;
    entity.m_Guid = profiling::ReadUint64(data, offset);
    offset += uint64_t_size;
    m_TimelineDecoder.CreateEntity(entity);
}

void TimelineCaptureCommandHandler::ReadEventClass(const unsigned char* data, uint32_t& offset)
{
    ITimelineDecoder::EventClass eventClass;
    eventClass.m_Guid = profiling::ReadUint64(data, offset);
    offset += uint64_t_size;
    m_TimelineDecoder.CreateEventClass(eventClass);
}

void TimelineCaptureCommandHandler::ReadRelationship(const unsigned char* data, uint32_t& offset)
{
    ITimelineDecoder::Relationship relationship;
    relationship.m_RelationshipType =
        static_cast<ITimelineDecoder::RelationshipType>(profiling::ReadUint32(data, offset));
    offset += uint32_t_size;

    relationship.m_Guid = profiling::ReadUint64(data, offset);
    offset += uint64_t_size;

    relationship.m_HeadGuid = profiling::ReadUint64(data, offset);
    offset += uint64_t_size;

    relationship.m_TailGuid = profiling::ReadUint64(data, offset);
    offset += uint64_t_size;

    relationship.m_AttributeGuid = profiling::ReadUint64(data, offset);
    offset += uint64_t_size;

    m_TimelineDecoder.CreateRelationship(relationship);
}

void TimelineCaptureCommandHandler::ReadEvent(const unsigned char* data, uint32_t& offset)
{
    ITimelineDecoder::Event event;
    event.m_TimeStamp = profiling::ReadUint64(data, offset);
    offset += uint64_t_size;

    if ( m_ThreadIdSize == 4 )
    {
        event.m_ThreadId = profiling::ReadUint32(data, offset);
    }
    else if ( m_ThreadIdSize == 8 )
    {
        event.m_ThreadId = profiling::ReadUint64(data, offset);
    }

    offset += m_ThreadIdSize;

    event.m_Guid = profiling::ReadUint64(data, offset);
    offset += uint64_t_size;

    m_TimelineDecoder.CreateEvent(event);
}

void TimelineCaptureCommandHandler::SetThreadIdSize(uint32_t size)
{
    m_ThreadIdSize = size;
}

void TimelineCaptureCommandHandler::operator()(const profiling::Packet& packet)
{
    ParseData(packet);
}

} //namespace gatordmock

} //namespace armnn
