/******************************************************************************
 * Copyright (c) Huawei Technologies Co., Ltd. 2024. All rights reserved.
 * libkperf licensed under the 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.
 * Author: Mr.Ye
 * Create: 2024-04-03
 * Description: trace point event configuration query
 ******************************************************************************/
#include <fstream>
#include "common.h"
#include "pfm_event.h"
#include "pmu_event.h"
#include "trace.h"

using namespace std;
using namespace KUNPENG_PMU;

static int64_t GetTraceEventConfig(const std::string &name)
{
    const string &traceFolder = GetTraceEventDir();
    if (traceFolder.empty()) {
        return -1;
    }
    size_t colon = name.find(':');
    string systemName = name.substr(0, colon);
    string eventName = name.substr(colon + 1);

    string eventPath = traceFolder + systemName + "/" + eventName + "/id";
    string realPath = GetRealPath(eventPath);
    if (!IsValidPath(realPath)) {
        return -1;
    }
    ifstream typeIn(realPath);
    if (!typeIn.is_open()) {
        return -1;
    }
    string typeStr;
    typeIn >> typeStr;

    return stoi(typeStr);
}

struct PmuEvt* GetKernelTraceEvent(const char* pmuName, int collectType)
{
    int64_t config = GetTraceEventConfig(pmuName);
    if (config == -1) {
        return nullptr;
    }
    auto* pmuEvtPtr = new PmuEvt {0};
    pmuEvtPtr->config = config;
    pmuEvtPtr->name = pmuName;
    pmuEvtPtr->type = PERF_TYPE_TRACEPOINT;
    pmuEvtPtr->pmuType = TRACE_TYPE;
    pmuEvtPtr->collectType = collectType;
    return pmuEvtPtr;
}