/**
 * Copyright (c) 2025 Huawei Technologies Co., Ltd.
 * This program is free software, you can redistribute it and/or modify it under the terms and conditions of
 * CANN Open Software License Agreement Version 2.0 (the "License").
 * Please refer to the License for details. You may not use this file except in compliance with the License.
 * 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 FITNESS FOR A PARTICULAR PURPOSE.
 * See LICENSE in the root of the software repository for the full text of the License.
 */

#ifndef ACL_PROFI_REPORTER_H_
#define ACL_PROFI_REPORTER_H_

#include "acl/acl_base.h"
#include "aprof_pub.h"

#define ACL_RT_PROF_TYPE_START_OFFSET 0x000000U

namespace acl {
    enum AclProfType {
        // start with 0x030000U
        AclRtProfTypeStart = MSPROF_REPORT_ACL_RUNTIME_BASE_TYPE + ACL_RT_PROF_TYPE_START_OFFSET,
        AclmdlRIExecuteAsync,
        AclmdlRIDestroy,
        AclmdlRICaptureBegin,
        AclmdlRICaptureGetInfo,
        AclmdlRICaptureEnd,
        AclmdlRIDebugPrint,
        AclmdlRIDebugJsonPrint,
        AclmdlRICaptureThreadExchangeMode,
        AclmdlRICaptureTaskGrpBegin,
        AclmdlRICaptureTaskGrpEnd,
        AclmdlRICaptureTaskUpdateBegin,
        AclmdlRICaptureTaskUpdateEnd,
        AclCreateDataBuffer,
        AclrtLaunchCallback,
        AclrtProcessReport,
        AclrtCreateContext,
        AclrtDestroyContext,
        AclrtSetCurrentContext,
        AclrtGetCurrentContext,
        AclrtSetDevice,
        AclrtSetDeviceWithoutTsdVXX,
        AclrtResetDevice,
        AclrtResetDeviceForce,
        AclrtResetDeviceWithoutTsdVXX,
        AclrtSynchronizeDevice,
        AclrtSynchronizeDeviceWithTimeout,
        AclrtSetTsDevice,
        AclrtCreateEvent,
        AclrtCreateEventWithFlag,
        AclrtCreateEventExWithFlag,
        AclrtDestroyEvent,
        AclrtRecordEvent,
        AclrtResetEvent,
        AclrtQueryEvent,
        AclrtQueryEventStatus,
        AclrtQueryEventWaitStatus,
        AclrtSynchronizeEvent,
        AclrtSetOpWaitTimeout,
        AclrtSetOpExecuteTimeOut,
        AclrtSetOpExecuteTimeOutWithMs,
        AclrtSetGroup,
        AclrtGetGroupCount,
        AclrtGetAllGroupInfo,
        AclrtGetGroupInfoDetail,
        AclMallocMemInner,
        AclrtMallocCached,
        AclrtMemFlush,
        AclrtMemInvalidate,
        AclrtFree,
        AclrtMallocHost,
        AclrtFreeHost,
        AclrtMemcpy,
        AclrtMemset,
        AclrtMemcpyAsync,
        AclrtMemcpyAsyncWithCondition,
        AclrtMemsetAsync,
        AclrtDeviceCanAccessPeer,
        AclrtDeviceEnablePeerAccess,
        AclrtDeviceDisablePeerAccess,
        AclrtGetMemInfo,
        AclrtMemcpy2d,
        AclrtMemcpy2dAsync,
        AclrtCreateStream,
        AclrtCreateStreamWithConfig,
        AclrtDestroyStream,
        AclrtDestroyStreamForce,
        AclrtSynchronizeStream,
        AclrtSynchronizeStreamWithTimeout,
        AclrtStreamQuery,
        AclrtStreamWaitEvent,
        AclrtAllocatorCreateDesc,
        AclrtAllocatorDestroyDesc,
        AclrtCtxGetSysParamOpt,
        AclrtCtxSetSysParamOpt,
        AclrtGetOverflowStatus,
        AclrtResetOverflowStatus,
        AclrtGetDeviceCount,
        AclrtGetDevice,
        AclrtMalloc,
        AclrtSetStreamFailureMode,
        AclrtQueryDeviceStatus,
        AclrtReserveMemAddress,
        AclrtReleaseMemAddress,
        AclrtMallocPhysical,
        AclrtFreePhysical,
        AclrtMapMem,
        AclrtUnmapMem,
        AclrtLaunchKernel,
        AclrtMemExportToShareableHandle,
        AclrtMemImportFromShareableHandle,
        AclrtMemSetPidToShareableHandle,
        AclrtMemGetAllocationGranularity,
        AclrtDeviceGetBareTgid,
        AclrtGetMemUceInfo,
        AclrtDeviceTaskAbort,
        AclrtMemUceRepair,
        AclrtCmoAsync,
        AclrtStreamAbort,
        AclrtMemcpyAsyncWithDesc,
        AclrtBinaryLoadFromFile,
        AclrtLaunchKernelWithConfig,
        AclrtKernelArgsAppend,
        AclrtKernelArgsAppendPlaceHolder,
        AclrtKernelArgsParaUpdate,
        AclrtKernelArgsGetMemSize,
        AclrtKernelArgsGetHandleMemSize,
        AclrtKernelArgsGetPlaceHolderBuffer,
        AclrtMallocWithCfg,
        AclrtMallocForTaskScheduler,
        AclrtMallocHostWithCfg,
        AclrtGetThreadLastTaskId,
        AclrtStreamGetId,
        AclrtPointerGetAttributes,
        AclrtHostRegister,
        AclrtHostUnregister,
        AclrtValueWrite,
        AclrtValueWait,
        AclrtGetStreamAvailableNum,
        AclrtSetStreamAttribute,
        AclrtGetStreamAttribute,
        AclrtCreateNotify,
        AclrtDestroyNotify,
        AclrtRecordNotify,
        AclrtWaitAndResetNotify,
        AclrtGetNotifyId,
        AclrtGetEventId,
        AclrtGetEventAvailNum,
        AclrtGetDeviceInfo,
        AclrtDeviceGetStreamPriorityRange,
        AclrtGetDeviceCapability,
        AclrtCtxGetCurrentDefaultStream,
        AclmdlRIBuildBegin,
        AclmdlRIBindStream,
        AclmdlRIEndTask,
        AclmdlRIBuildEnd,
        AclmdlRIUnbindStream,
        AclmdlRIExecute,
        AclrtReduceAsync,
        AclrtGetDeviceResLimit,
        AclrtSetDeviceResLimit,
        AclrtResetDeviceResLimit,
        AclrtGetStreamResLimit,
        AclrtSetStreamResLimit,
        AclrtResetStreamResLimit,
        AclrtUseStreamResInCurrentThread,
        AclrtUnuseStreamResInCurrentThread,
        AclrtGetResInCurrentThread,
        AclrtCreateLabel,
        AclrtSetLabel,
        AclrtDestroyLabel,
        AclrtCreateLabelList,
        AclrtDestroyLabelList,
        AclrtSwitchLabelByIndex,
        AclrtActiveStream,
        AclrtSwitchStream,
        AclrtGetFunctionName,
        AclmdlRISetName,
        AclmdlRIGetName,
        AclrtGetBufFromChain,
        AclrtGetBufChainNum,
        AclrtAppendBufChain,
        AclrtCopyBufRef,
        AclrtGetBufUserData,
        AclrtSetBufUserData,
        AclrtGetBufData,
        AclrtGetBufDataLen,
        AclrtSetBufDataLen,
        AclrtFreeBuf,
        AclrtAllocBuf,
        AclrtBinaryLoadFromData,
        AclrtRegisterCpuFunc,
        AclrtCmoAsyncWithBarrier,
        AclrtCmoWaitBarrier,
        AclrtGetDevicesTopo,
        AclrtMemcpyBatch,
        AclrtMemcpyBatchAsync,
        AclrtIpcMemGetExportKey,
        AclrtIpcMemClose,
        AclrtIpcMemImportByKey,
        AclrtIpcMemSetImportPid,
        AclrtNotifyBatchReset,
        AclrtNotifyGetExportKey,
        AclrtNotifyImportByKey,
        AclrtNotifySetImportPid,
        AclrtCheckMemType,
        AclrtGetLogicDevIdByUserDevId,
        AclrtGetUserDevIdByLogicDevId,
        AclrtGetLogicDevIdByPhyDevId,
        AclrtGetPhyDevIdByLogicDevId,
        AclrtProfTrace,
        AclrtLaunchKernelV2,
        AclrtLaunchKernelWithHostArgs,
        AclrtCtxGetFloatOverflowAddr,     
        AclrtGetFloatOverflowStatus,            
        AclrtResetFloatOverflowStatus,          
        AclrtNpuGetFloatOverFlowStatus,        
        AclrtNpuClearFloatOverFlowStatus,  
        AclrtLaunchHostFunc,   
        AclrtGetHardwareSyncAddr,
        AclrtRandomNumAsync,
        AclrtRegStreamStateCallback,
        AclrtRegDeviceStateCallback,
        AclrtSetDeviceTaskAbortCallback,
        AclrtGetOpExecuteTimeout,
        AclrtDevicePeerAccessStatus,
        AclrtStreamStop,
        AclrtTaskUpdateAsync,
        AclrtCntNotifyCreate,
        AclrtCntNotifyDestroy,
        AclrtIpcMemSetAttr,
        AclrtIpcMemImportPidInterServer,
        AclrtNotifySetImportPidInterServer,
        AclrtMemcpyAsyncWithOffset,
        AclrtGetOpExecuteTimeOut,
        AclrtCheckArchCompatibility,
        AclrtCmoGetDescSize,
        AclrtCmoSetDesc,
        AclrtCmoAsyncWithDesc,
        AclmdlRIAbort,
        AclrtMemExportToShareableHandleV2,
        AclrtMemImportFromShareableHandleV2,
        AclrtMemSetPidToShareableHandleV2,
        AclrtCntNotifyRecord,
        AclrtCntNotifyWaitWithTimeout,
        AclrtCntNotifyReset,
        AclrtCntNotifyGetId,
        AclrtPersistentTaskClean,
        AclrtGetErrorVerbose,
        AclrtRepairError,
        AclrtSnapShotProcessLock,
        AclrtSnapShotProcessUnlock,
        AclrtSnapShotProcessBackup,
        AclrtSnapShotProcessRestore,
        AclrtBinaryGetDevAddress,
        AclrtStreamWaitEventWithTimeout,
        AclrtMemSetAccess,
        AclrtSetOpExecuteTimeOutV2,
        AclrtGetOpTimeOutInterval,
        AclrtDeviceGetUuid,
        AclrtMemGetAccess,
        AclrtFreeWithDevSync,
        AclrtFreeHostWithDevSync,
        AclrtCacheLastTaskOpInfo,
        AclrtGetFunctionAttribute,
        AclrtIpcGetEventHandle,
        AclrtIpcOpenEventHandle,
        AclrtMemRetainAllocationHandle,
        AclrtMemGetAllocationPropertiesFromHandle,
        AclrtStreamGetPriority,
        AclrtStreamGetFlags,
        AclrtGetMemUsageInfo,
        AclrtHostRegisterV2,
        AclrtHostGetDevicePointer,
        // this is the end, can not add after AclRtProfTypeEnd
        AclRtProfTypeEnd
    };

    class ACL_FUNC_VISIBILITY AclProfilingReporter {
    public:
        explicit AclProfilingReporter(const AclProfType apiId);
        virtual ~AclProfilingReporter() noexcept;
        static bool profRun;
    private:
        uint64_t startTime_ = 0UL;
        const AclProfType aclApi_;
    };

} // namespace acl
#define ACL_PROFILING_REG(apiId) \
    const acl::AclProfilingReporter profilingReporter(apiId)
#endif // ACL_PROFI_REPORTER_H_