/* -------------------------------------------------------------------------
 * 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/application/summary/summary_factory.h"
#include "analysis/csrc/application/summary/op_summary_assembler.h"
#include "analysis/csrc/application/summary/npu_memory_assembler.h"
#include "analysis/csrc/application/summary/npu_module_mem_assembler.h"
#include "analysis/csrc/application/summary/api_statistic_assembler.h"
#include "analysis/csrc/application/summary/fusion_op_assembler.h"
#include "analysis/csrc/application/summary/task_time_assembler.h"
#include "analysis/csrc/application/summary/summary_step_trace_assembler.h"
#include "analysis/csrc/application/summary/comm_statistic_assembler.h"
#include "analysis/csrc/application/summary/op_statistic_assembler.h"


namespace Analysis {
namespace Application {
using namespace Utils;
std::unordered_map<std::string, AssemblerCreator> SummaryFactory::assemblerTable_{
    {PROCESSOR_OP_SUMMARY, [](const std::string& profPath, std::shared_ptr<SummaryAssembler>& assembler) {
        MAKE_SHARED0_NO_OPERATION(assembler, OpSummaryAssembler, PROCESSOR_OP_SUMMARY, profPath);}},
    {PROCESSOR_NAME_NPU_MEM, [](const std::string& profPath, std::shared_ptr<SummaryAssembler>& assembler) {
        MAKE_SHARED0_NO_OPERATION(assembler, NpuMemoryAssembler, PROCESSOR_NAME_NPU_MEM, profPath);}},
    {PROCESSOR_NAME_NPU_MODULE_MEM, [](const std::string& profPath, std::shared_ptr<SummaryAssembler>& assembler) {
            MAKE_SHARED0_NO_OPERATION(assembler, NpuModuleMemAssembler, PROCESSOR_NAME_NPU_MODULE_MEM, profPath);}},
    {PROCESSOR_NAME_API, [](const std::string& profPath, std::shared_ptr<SummaryAssembler>& assembler) {
        MAKE_SHARED0_NO_OPERATION(assembler, ApiStatisticAssembler, PROCESSOR_NAME_API, profPath);}},
    {PROCESSOR_NAME_FUSION_OP, [](const std::string& profPath, std::shared_ptr<SummaryAssembler>& assembler) {
        MAKE_SHARED0_NO_OPERATION(assembler, FusionOpAssembler, PROCESSOR_NAME_FUSION_OP, profPath);}},
    {PROCESSOR_TASK_TIME_SUMMARY, [](const std::string& profPath, std::shared_ptr<SummaryAssembler>& assembler) {
        MAKE_SHARED0_NO_OPERATION(assembler, TaskTimeAssembler, PROCESSOR_TASK_TIME_SUMMARY, profPath);}},
    {PROCESSOR_NAME_STEP_TRACE, [](const std::string& profPath, std::shared_ptr<SummaryAssembler>& assembler) {
        MAKE_SHARED0_NO_OPERATION(assembler, SummaryStepTraceAssembler, PROCESSOR_NAME_STEP_TRACE, profPath);}},
    {PROCESSOR_NAME_COMM_STATISTIC, [](const std::string& profPath, std::shared_ptr<SummaryAssembler>& assembler) {
        MAKE_SHARED0_NO_OPERATION(assembler, CommStatisticAssembler, PROCESSOR_NAME_COMM_STATISTIC, profPath);}},
    {PROCESSOR_NAME_OP_STATISTIC, [](const std::string& profPath, std::shared_ptr<SummaryAssembler>& assembler) {
        MAKE_SHARED0_NO_OPERATION(assembler, OpStatisticAssembler, PROCESSOR_NAME_OP_STATISTIC, profPath);}},
};

std::shared_ptr<SummaryAssembler> SummaryFactory::GetAssemblerByName(const std::string& processName,
                                                                     const std::string& profPath)
{
    std::shared_ptr<SummaryAssembler> assembler{nullptr};
    auto it = assemblerTable_.find(processName);
    if (it != assemblerTable_.end()) {
        it->second(profPath, assembler);
    }
    return assembler;
}
}
}