/* -------------------------------------------------------------------------
 * Copyright (c) 2025 Huawei Technologies Co., Ltd.
 * This file is part of the MindStudio project.
 *
 * MindStudio is licensed under Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *
 *    http://license.coscl.org.cn/MulanPSL2
 *
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 * -------------------------------------------------------------------------*/

#include "analysis/csrc/domain/entities/hal/include/hal_track.h"
#include <algorithm>
#include <map>

namespace Analysis {
namespace Domain {
namespace {
const uint16_t STEP_START_TAG = 60000;
const uint16_t STEP_END_TAG = 60001;
const uint16_t PAIR = 2;
}

std::unordered_map<uint16_t, std::vector<HalTrackData*>> GetFlipData(std::vector<HalTrackData>& trackData)
{
    std::unordered_map<uint16_t, std::vector<HalTrackData*>> trackDataMap;
    for (auto& data : trackData) {
        if (data.type == TS_TASK_FLIP) {
            trackDataMap[data.hd.taskId.streamId].push_back(&data);
        }
    }
    return trackDataMap;
}

std::vector<HalTrackData> GetTrackDataByType(std::vector<HalTrackData>& trackData, HalTrackType type)
{
    std::vector<HalTrackData> trackDataRefer;
    for (auto& data : trackData) {
        if (data.type == type) {
            trackDataRefer.push_back(data);
        }
    }
    return trackDataRefer;
}

StepTraceDataVectorFormat GenerateStepTime(std::vector<HalTrackData>& halTraceTasks)
{
    StepTraceDataVectorFormat processedData;
    std::map<uint32_t, std::vector<HalTrackData>> stepTime;
    std::vector<HalTrackData> halTraceTasksBackup = halTraceTasks;
    std::sort(halTraceTasksBackup.begin(), halTraceTasksBackup.end(),
              [](const HalTrackData& t1, const HalTrackData& t2) {
        return t1.stepTrace.timestamp < t2.stepTrace.timestamp;
    });
    for (auto trackData : halTraceTasksBackup) {
        if (trackData.stepTrace.tagId == STEP_START_TAG || trackData.stepTrace.tagId == STEP_END_TAG) {
            stepTime[trackData.stepTrace.indexId].emplace_back(trackData);
        }
    }
    for (auto &it : stepTime) {
        if (it.second.size() != PAIR) {
            continue;
        }
        processedData.emplace_back(it.first, it.second[0].stepTrace.modelId, it.second[0].stepTrace.timestamp,
                                   it.second[1].stepTrace.timestamp, it.first);
    }
    return processedData;
}
}
}