import { toRaw } from 'vue'
const bpmnInstances = () => (window as any)?.bpmnInstances
// 创建监听器实例
export function createListenerObject(options, isTask, prefix) {
  debugger
  const listenerObj = Object.create(null)
  listenerObj.event = options.event
  isTask && (listenerObj.id = options.id) // 任务监听器特有的 id 字段
  switch (options.listenerType) {
    case 'scriptListener':
      listenerObj.script = createScriptObject(options, prefix)
      break
    case 'expressionListener':
      listenerObj.expression = options.expression
      break
    case 'delegateExpressionListener':
      listenerObj.delegateExpression = options.delegateExpression
      break
    default:
      listenerObj.class = options.class
  }
  // 注入字段
  if (options.fields) {
    listenerObj.fields = options.fields.map((field) => {
      return createFieldObject(field, prefix)
    })
  }
  // 任务监听器的 定时器 设置
  if (isTask && options.event === 'timeout' && !!options.eventDefinitionType) {
    const timeDefinition = bpmnInstances().moddle.create('bpmn:FormalExpression', {
      body: options.eventTimeDefinitions
    })
    const TimerEventDefinition = bpmnInstances().moddle.create('bpmn:TimerEventDefinition', {
      id: `TimerEventDefinition_${uuid(8)}`,
      [`time${options.eventDefinitionType.replace(/^\S/, (s) => s.toUpperCase())}`]: timeDefinition
    })
    listenerObj.eventDefinitions = [TimerEventDefinition]
  }
  return bpmnInstances().moddle.create(
    `${prefix}:${isTask ? 'TaskListener' : 'ExecutionListener'}`,
    listenerObj
  )
}

// 创建 监听器的注入字段 实例
export function createFieldObject(option, prefix) {
  const { name, fieldType, string, expression } = option
  const fieldConfig = fieldType === 'string' ? { name, string } : { name, expression }
  return bpmnInstances().moddle.create(`${prefix}:Field`, fieldConfig)
}

// 创建脚本实例
export function createScriptObject(options, prefix) {
  const { scriptType, scriptFormat, value, resource } = options
  const scriptConfig =
    scriptType === 'inlineScript' ? { scriptFormat, value } : { scriptFormat, resource }
  return bpmnInstances().moddle.create(`${prefix}:Script`, scriptConfig)
}

// 更新元素扩展属性
export function updateElementExtensions(element, extensionList) {
  const extensions = bpmnInstances().moddle.create('bpmn:ExtensionElements', {
    values: extensionList
  })
  bpmnInstances().modeling.updateProperties(toRaw(element), {
    extensionElements: extensions
  })
}

// 创建一个id
export function uuid(length = 8, chars?) {
  let result = ''
  const charsString = chars || '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
  for (let i = length; i > 0; --i) {
    result += charsString[Math.floor(Math.random() * charsString.length)]
  }
  return result
}
