/* -------------------------------------------------------------------------
 * 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.
 * -------------------------------------------------------------------------*/

#ifndef ANALYSIS_DOMAIN_SERVICES_PARSER_PARSER_ITEM_STARS_COMMON_H
#define ANALYSIS_DOMAIN_SERVICES_PARSER_PARSER_ITEM_STARS_COMMON_H

#include <cstdint>

/*
 * 在2023年11月 task id底层存在规则变动,取用了stream id中某位作为标记位,基于标记位进行新的task id计算,具体计算规则为:
 * 1、判断stream id的第13位是否为0,为0则直接返回task id,否则
 * 2、取task id低13位,与stream id高3位,组成一个完整taskId
 *
 * 2024年7月 task id规则变动,新增stream id标记位,扩展新的task id计算规则,变更后如下:
 * 1、判断stream id的第13位是否为0
 * 2、不为0,则取task id低13位,与stream id高3位,组成一个完整taskId
 * 3、为0,则继续判断stream id第14位是否为0,是则直接返回task id;不为0 则交换stream id和task id的低12位
 */

namespace Analysis {
namespace Domain {
const uint16_t STREAM_LOW_OPERATOR = 1u << 11;
const uint16_t STREAM_JUDGE_BIT12_OPERATOR = 0x1000;
const uint16_t STREAM_JUDGE_BIT13_OPERATOR = 0x2000;
const uint16_t STREAM_JUDGE_BIT15_OPERATOR = 0x8000;
const uint16_t TASK_LOW_OPERATOR = 0x1FFF;
const uint16_t STREAM_HIGH_OPERATOR = 0xE000;
const uint16_t COMMON_LOW_OPERATOR = 0x0FFF;
const uint16_t COMMON_HIGH_OPERATOR = 0xF000;
const uint16_t EXPANDING_LOW_OPERATOR = 0x7FFF;
const uint16_t PLACE_HOLDER_SQE = 3;
const uint16_t EVENT_RECORD_SQE = 4;

class StarsCommon {
public:
static uint16_t GetStreamId(uint16_t streamId, uint16_t taskId, uint16_t expandStatus, uint16_t sqeType = 0)
{
    if (expandStatus == 1) {
        if (sqeType == PLACE_HOLDER_SQE || sqeType == EVENT_RECORD_SQE) {
            return streamId & EXPANDING_LOW_OPERATOR;
        }
        if ((streamId & STREAM_JUDGE_BIT15_OPERATOR) != 0) {
            return taskId & EXPANDING_LOW_OPERATOR;
        } else {
            return streamId & EXPANDING_LOW_OPERATOR;
        }
    } else {
        if ((streamId & STREAM_JUDGE_BIT12_OPERATOR) != 0) {
            return streamId % STREAM_LOW_OPERATOR;
        }
        if ((streamId & STREAM_JUDGE_BIT13_OPERATOR) != 0) {
            streamId = taskId & COMMON_LOW_OPERATOR;
        }
        auto res = streamId % STREAM_LOW_OPERATOR;
        return res;
    }
}

static uint16_t GetTaskId(uint16_t streamId, uint16_t taskId, uint16_t expandStatus, uint16_t sqeType = 0)
{
    if (expandStatus == 1) {
        if (sqeType == PLACE_HOLDER_SQE || sqeType == EVENT_RECORD_SQE) {
            return taskId;
        }
        if ((streamId & STREAM_JUDGE_BIT15_OPERATOR) != 0) {
            return (taskId & STREAM_JUDGE_BIT15_OPERATOR) | (streamId & EXPANDING_LOW_OPERATOR);
        } else {
            return taskId;
        }
    } else {
        if ((streamId & STREAM_JUDGE_BIT12_OPERATOR) != 0) {
            taskId = taskId & TASK_LOW_OPERATOR;
            taskId |= (streamId & STREAM_HIGH_OPERATOR);
        } else if ((streamId & STREAM_JUDGE_BIT13_OPERATOR) != 0) {
            taskId = (streamId & COMMON_LOW_OPERATOR) | (taskId & COMMON_HIGH_OPERATOR);
        }
        return taskId;
    }
}
};
}
}
#endif // ANALYSIS_DOMAIN_SERVICES_PARSER_PARSER_ITEM_STARS_COMMON_H