import inherits from 'inherits';

import CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';

import {
  getBusinessObject,
  is
} from '../../../util/ModelUtil';

import { isLabel } from '../../../util/LabelUtil';


/**
 * BPMN specific detach event behavior
 */
export default function DetachEventBehavior(eventBus, bpmnReplace) {

  CommandInterceptor.call(this, eventBus);

  /**
   * replace boundary event with intermediate event when
   * detaching from a shape
   */

  this.preExecute('elements.move', function(context) {
    var shapes = context.shapes,
        host = context.newHost,
        shape,
        eventDefinition,
        intermediateEvent,
        newShape;

    if (shapes.length !== 1) {
      return;
    }

    shape = shapes[0];

    if (!isLabel(shape) && !host && is(shape, 'bpmn:BoundaryEvent')) {

      eventDefinition = getEventDefinition(shape);

      if (eventDefinition) {
        intermediateEvent = {
          type: 'bpmn:IntermediateCatchEvent',
          eventDefinitionType: eventDefinition.$type
        };
      } else {
        intermediateEvent = {
          type: 'bpmn:IntermediateThrowEvent'
        };
      }

      newShape = bpmnReplace.replaceElement(shape, intermediateEvent, { layoutConnection: false });

      context.shapes = [ newShape ];
    }
  }, true);
}

DetachEventBehavior.$inject = [
  'eventBus',
  'bpmnReplace'
];

inherits(DetachEventBehavior, CommandInterceptor);



// helper /////
function getEventDefinition(element) {
  var bo = getBusinessObject(element);

  return bo && bo.eventDefinitions && bo.eventDefinitions[0];
}