// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

import { env } from './env-impl.js';

/**
 * @ignore
 */
export const TRACE = (deviceType: string, label: string) => {
  if (typeof env.trace === 'undefined' ? !env.wasm.trace : !env.trace) {
    return;
  }
  // eslint-disable-next-line no-console
  console.timeStamp(`${deviceType}::ORT::${label}`);
};

const TRACE_FUNC = (msg: string, extraMsg?: string) => {
  const stack = new Error().stack?.split(/\r\n|\r|\n/g) || [];
  let hasTraceFunc = false;
  for (let i = 0; i < stack.length; i++) {
    if (hasTraceFunc && !stack[i].includes('TRACE_FUNC')) {
      let label = `FUNC_${msg}::${stack[i].trim().split(' ')[1]}`;
      if (extraMsg) {
        label += `::${extraMsg}`;
      }
      TRACE('CPU', label);
      return;
    }
    if (stack[i].includes('TRACE_FUNC')) {
      hasTraceFunc = true;
    }
  }
};

/**
 * @ignore
 */
export const TRACE_FUNC_BEGIN = (extraMsg?: string) => {
  if (typeof env.trace === 'undefined' ? !env.wasm.trace : !env.trace) {
    return;
  }
  TRACE_FUNC('BEGIN', extraMsg);
};

/**
 * @ignore
 */
export const TRACE_FUNC_END = (extraMsg?: string) => {
  if (typeof env.trace === 'undefined' ? !env.wasm.trace : !env.trace) {
    return;
  }
  TRACE_FUNC('END', extraMsg);
};

/**
 * @ignore
 */
export const TRACE_EVENT_BEGIN = (extraMsg?: string) => {
  if (typeof env.trace === 'undefined' ? !env.wasm.trace : !env.trace) {
    return;
  }
  // eslint-disable-next-line no-console
  console.time(`ORT::${extraMsg}`);
};

/**
 * @ignore
 */
export const TRACE_EVENT_END = (extraMsg?: string) => {
  if (typeof env.trace === 'undefined' ? !env.wasm.trace : !env.trace) {
    return;
  }
  // eslint-disable-next-line no-console
  console.timeEnd(`ORT::${extraMsg}`);
};
