import { type coresdk } from '@temporalio/proto';
import { type SinkCall } from '@temporalio/workflow';
import { type WorkflowCreateOptions } from '@temporalio/workflow/lib/interfaces';

export { WorkflowCreateOptions };

export interface Workflow {
  /**
   * Activate the Workflow.
   *
   * This method should return a completion after processing a single activation.
   * It is guaranteed that only a single activation will be processed concurrently for a Workflow execution.
   */
  activate(
    activation: coresdk.workflow_activation.IWorkflowActivation
  ): Promise<coresdk.workflow_completion.IWorkflowActivationCompletion>;

  /**
   * Gets any sink calls recorded during an activation.
   *
   * This is separate from `activate` so it can be called even if activation fails
   * in order to extract all logs and metrics from the Workflow context.
   */
  getAndResetSinkCalls(): Promise<SinkCall[]>;

  /**
   * Dispose this instance, and release its resources.
   *
   * Do not use this Workflow instance after this method has been called.
   */
  dispose(): Promise<void>;
}

export interface WorkflowCreator {
  /**
   * Create a Workflow for the Worker to activate
   *
   * Note: this needs to be async because of the ThreadedWorkflowCreator.
   */
  createWorkflow(options: WorkflowCreateOptions): Promise<Workflow>;

  /**
   * Destroy and cleanup any resources
   */
  destroy(): Promise<void>;
}
