/**
 * Workflow imports stub module.
 *
 * This module provides stubs for workflow functionality needed by interceptors.
 * When bundled by the workflow bundler, this is replaced with the real
 * implementation via NormalModuleReplacementPlugin.
 *
 * @module
 */
import type {
  inWorkflowContext as inWorkflowContextT,
  workflowInfo as workflowInfoT,
  proxySinks as proxySinksT,
  AsyncLocalStorage as AsyncLocalStorageT,
  ContinueAsNew as ContinueAsNewT,
} from '@temporalio/workflow';
import type { getActivator as getActivatorT } from '@temporalio/workflow/lib/global-attributes';
import type { SdkFlags as SdkFlagsT } from '@temporalio/workflow/lib/flags';

import { IllegalStateError } from '@temporalio/common';

// always returns false since if using this implementation, we are outside of workflow context
export const inWorkflowContext: typeof inWorkflowContextT = () => false;

// All of the following stubs will throw if used
export const workflowInfo: typeof workflowInfoT = () => {
  throw new IllegalStateError('Workflow.workflowInfo(...) may only be used from a Workflow Execution.');
};

export const ContinueAsNew = class ContinueAsNew {} as unknown as typeof ContinueAsNewT;

export const AsyncLocalStorage = class AsyncLocalStorage {} as unknown as typeof AsyncLocalStorageT;

export const getActivator: typeof getActivatorT = () => {
  throw new IllegalStateError('Workflow uninitialized');
};

export const proxySinks: typeof proxySinksT = () => {
  throw new IllegalStateError('Proxied sinks functions may only be used from a Workflow Execution.');
};

export const SdkFlags: typeof SdkFlagsT = {} as typeof SdkFlagsT;
