text: 'use strict'
  /**
   任务名称：2634/工作流前端迁移到施工系统作为流程管理模块
   开发人员：李建敏
   日期：2020-3月-17日
   任务类型：2、复制修改代码 （移动位置）
   **/
  var getBusinessObject = require('bpmn-js/lib/util/ModelUtil').getBusinessObject
  
  var elementHelper = require('../../../../helper/ElementHelper'),
    extensionElementsHelper = require('../../../../helper/ExtensionElementsHelper'),
    inputOutputHelper = require('../../../../helper/InputOutputHelper'),
    cmdHelper = require('../../../../helper/CmdHelper')
  
  var extensionElementsEntry = require('./ExtensionElements')
  
  function getInputOutput(element, insideConnector) {
    return inputOutputHelper.getInputOutput(element, insideConnector)
  }
  
  function getConnector(element) {
    return inputOutputHelper.getConnector(element)
  }
  
  function getInputParameters(element, insideConnector) {
    return inputOutputHelper.getInputParameters(element, insideConnector)
  }
  
  function getOutputParameters(element, insideConnector) {
    return inputOutputHelper.getOutputParameters(element, insideConnector)
  }
  
  function getInputParameter(element, insideConnector, idx) {
    return inputOutputHelper.getInputParameter(element, insideConnector, idx)
  }
  
  function getOutputParameter(element, insideConnector, idx) {
    return inputOutputHelper.getOutputParameter(element, insideConnector, idx)
  }
  
  function createElement(type, parent, factory, properties) {
    return elementHelper.createElement(type, properties, parent, factory)
  }
  
  function createInputOutput(parent, bpmnFactory, properties) {
    return createElement('activiti:InputOutput', parent, bpmnFactory, properties)
  }
  
  function createParameter(type, parent, bpmnFactory, properties) {
    return createElement(type, parent, bpmnFactory, properties)
  }
  
  function ensureInputOutputSupported(element, insideConnector) {
    return inputOutputHelper.isInputOutputSupported(element, insideConnector)
  }
  
  function ensureOutparameterSupported(element, insideConnector) {
    return inputOutputHelper.areOutputParametersSupported(element, insideConnector)
  }
  
  module.exports = function(element, bpmnFactory, options, translate) {
    var TYPE_LABEL = {
      'activiti:Map': translate('Map'),
      'activiti:List': translate('List'),
      'activiti:Script': translate('Script')
    }
  
    options = options || {}
  
    var insideConnector = !!options.insideConnector,
      idPrefix = options.idPrefix || ''
  
    var getSelected = function(element, node) {
      var selection = (inputEntry && inputEntry.getSelected(element, node)) || { idx: -1 }
  
      var parameter = getInputParameter(element, insideConnector, selection.idx)
      if (!parameter && outputEntry) {
        selection = outputEntry.getSelected(element, node)
        parameter = getOutputParameter(element, insideConnector, selection.idx)
      }
      return parameter
    }
  
    var result = {
      getSelectedParameter: getSelected
    }
  
    var entries = (result.entries = [])
  
    if (!ensureInputOutputSupported(element)) {
      return result
    }
  
    var newElement = function(type, prop, factory) {
      return function(element, extensionElements, value) {
        var commands = []
  
        var inputOutput = getInputOutput(element, insideConnector)
        if (!inputOutput) {
          var parent = !insideConnector ? extensionElements : getConnector(element)
          inputOutput = createInputOutput(parent, bpmnFactory, {
            inputParameters: [],
            outputParameters: []
          })
  
          if (!insideConnector) {
            commands.push(
              cmdHelper.addAndRemoveElementsFromList(
                element,
                extensionElements,
                'values',
                'extensionElements',
                [inputOutput],
                []
              )
            )
          } else {
            commands.push(cmdHelper.updateBusinessObject(element, parent, { inputOutput: inputOutput }))
          }
        }
  
        var newElem = createParameter(type, inputOutput, bpmnFactory, { name: value })
        commands.push(cmdHelper.addElementsTolist(element, inputOutput, prop, [newElem]))
  
        return commands
      }
    }
  
    var removeElement = function(getter, prop, otherProp) {
      return function(element, extensionElements, value, idx) {
        var inputOutput = getInputOutput(element, insideConnector)
        var parameter = getter(element, insideConnector, idx)
  
        var commands = []
        commands.push(cmdHelper.removeElementsFromList(element, inputOutput, prop, null, [parameter]))
  
        var firstLength = inputOutput.get(prop).length - 1
        var secondLength = (inputOutput.get(otherProp) || []).length
  
        if (!firstLength && !secondLength) {
          if (!insideConnector) {
            commands.push(extensionElementsHelper.removeEntry(getBusinessObject(element), element, inputOutput))
          } else {
            var connector = getConnector(element)
            commands.push(cmdHelper.updateBusinessObject(element, connector, { inputOutput: undefined }))
          }
        }
  
        return commands
      }
    }
  
    var setOptionLabelValue = function(getter) {
      return function(element, node, option, property, value, idx) {
        var parameter = getter(element, insideConnector, idx)
  
        var suffix = 'Text'
  
        var definition = parameter.get('definition')
        if (typeof definition !== 'undefined') {
          var type = definition.$type
          suffix = TYPE_LABEL[type]
        }
  
        option.text = (value || '') + ' : ' + suffix
      }
    }
  
    // input parameters ///////////////////////////////////////////////////////////////
  
    var inputEntry = extensionElementsEntry(element, bpmnFactory, {
      id: idPrefix + 'inputs',
      label: translate('Input Parameters'),
      modelProperty: 'name',
      prefix: 'Input',
      resizable: true,
  
      createExtensionElement: newElement('activiti:InputParameter', 'inputParameters'),
      removeExtensionElement: removeElement(getInputParameter, 'inputParameters', 'outputParameters'),
  
      getExtensionElements: function(element) {
        return getInputParameters(element, insideConnector)
      },
  
      onSelectionChange: function(element, node, event, scope) {
        outputEntry && outputEntry.deselect(element, node)
      },
  
      setOptionLabelValue: setOptionLabelValue(getInputParameter)
    })
    entries.push(inputEntry)
  
    // output parameters ///////////////////////////////////////////////////////
  
    if (ensureOutparameterSupported(element, insideConnector)) {
      var outputEntry = extensionElementsEntry(element, bpmnFactory, {
        id: idPrefix + 'outputs',
        label: translate('Output Parameters'),
        modelProperty: 'name',
        prefix: 'Output',
        resizable: true,
  
        createExtensionElement: newElement('activiti:OutputParameter', 'outputParameters'),
        removeExtensionElement: removeElement(getOutputParameter, 'outputParameters', 'inputParameters'),
  
        getExtensionElements: function(element) {
          return getOutputParameters(element, insideConnector)
        },
  
        onSelectionChange: function(element, node, event, scope) {
          inputEntry.deselect(element, node)
        },
  
        setOptionLabelValue: setOptionLabelValue(getOutputParameter)
      })
      entries.push(outputEntry)
    }
  
    return result
  }
  