import type ExecuteController from '../../tts-controller'

import type { TaskExecuteContext } from '../types'

interface InterfaceHandler<O = unknown, R = unknown> {

  /**
   * 下一个处理器
   * 链表中的下一个处理器，如果是链表中的最后一个处理器，则为null。
   */
  nextHandler: InterfaceHandler<R, unknown> | null

  /**
   * 上一个处理器
   * 链表中的上一个处理器，如果是链表中的第一个处理器，则为null。
   */
  prevHandler: InterfaceHandler<unknown, O> | null

  /**
   * 当前处理器状态
   */
  handlerStatus: any

  /**
   * 设置处理器链表，用于设置上一个或者下一个处理器
   *
   * @param handler 处理器
   */
  linkHandler: (handler: InterfaceHandler<R, unknown>) => void

  /**
   * 处理器是否首次执行任务
   */
  isFirstExecute: boolean

  /**
   * 处理器执行上下文
   */
  executeController: ExecuteController | null

  /**
   * 设置处理器执行上下文
   *
   * @param executeController 执行上下文
   */
  setExecuteController: (executeController: ExecuteController) => void

  /**
   * 是否为第一个处理器
   */
  isFirstHandler: boolean

  /**
   * 是否为最后一个处理器
   */
  isLastHandler: boolean

  /**
   * 向处理器输入任务数据
   *
   * @param original 任务数据
   */
  handle: (original: O | null) => void

  /**
   * 将处理结果传递给下一个处理器，当做下一个处理器的任务数据
   */
  forwardToHandler: (result: R) => void

  /**
   *  设置处理器的执行状态
   */
  setHandlerStatus: (status: any) => void

  /**
   * 判断当前处理器是否处于指定执行状态
   */
  equalHandlerStatus: (status: any) => boolean

  /**
   * 需要执行任务的具体逻辑
   *
   * @param context 当前执行者数据上下文（任务数据、是否首次执行、是否最后一次执行）
   */
  execute: (context: TaskExecuteContext) => void

  /**
   * 处理器是否接受上一个处理传递的数据完毕
   */
  isHandleDataAcceptedComplete: boolean

}

export default InterfaceHandler
