# configuration/DefaultBehaviors.js

    import { editorLogger as logger } from './LoggerConfig'
    import * as PointerEventGrabber from '../grabber/PointerEventGrabber'
    import * as CanvasRenderer from '../renderer/canvas/CanvasRenderer'
    import * as QuadraticCanvasStroker from '../renderer/canvas/stroker/QuadraticCanvasStroker'
    import * as SVGRenderer from '../renderer/svg/SVGRenderer'
    import * as QuadraticSVGStroker from '../renderer/svg/stroker/QuadraticSVGStroker'
    import * as iinkRestRecognizer from '../recognizer/rest/iinkRestRecognizer'
    import * as iinkWsRecognizer from '../recognizer/websocket/iinkWsRecognizer'
    import emit from '../event/Event'

    /**
     * Current behavior
     * @typedef {Object} Behavior
     * @property {Grabber} grabber Grabber to capture strokes
     * @property {Stroker} stroker Stroker to draw stroke
     * @property {Renderer} renderer Renderer to draw on the editor
     * @property {Recognizer} recognizer Recognizer to call the recognition service
     * @property {Array} events Functions to handle model changes
     */

    /**
     * Set of behaviors to be used by the {@link Editor}
     * @typedef {Object} Behaviors
     * @property {Grabber} grabber Grabber to capture strokes
     * @property {Array<Stroker>} strokerList List of stroker to draw stroke
     * @property {Array<Renderer>} rendererList List of renderer to draw on the editor
     * @property {Array<Recognizer>} recognizerList Recognizers to call the recognition service
     * @property {function} getBehaviorFromConfiguration Get the current behavior to use regarding the current configuration
     * @property {Array} events Functions to handle model changes
     */

    /**
     * Default behaviors
     * @type {Behaviors}
     */
    export const defaultBehaviors = {
      grabber: PointerEventGrabber,
      strokerList: [QuadraticCanvasStroker, QuadraticSVGStroker],
      rendererList: [CanvasRenderer, SVGRenderer],
      recognizerList: [iinkRestRecognizer, iinkWsRecognizer],
      events: emit,
      getBehaviorFromConfiguration: (behaviors, configuration) => {
        const behavior = {}
        behavior.grabber = behaviors.grabber
        if (configuration) {
          if (configuration.recognitionParams.protocol === 'REST') {
            behavior.stroker = QuadraticCanvasStroker
            behavior.renderer = CanvasRenderer
            behavior.recognizer = iinkRestRecognizer
          } else {
            behavior.stroker = QuadraticSVGStroker
            behavior.renderer = SVGRenderer
            behavior.recognizer = iinkWsRecognizer
          }
        }
        behavior.events = behaviors.events
        return behavior
      }
    }

    /**
     * Generate behaviors
     * @param {Behaviors} behaviors Behaviors to be used
     * @return {Behaviors} Overridden behaviors
     */
    export function overrideDefaultBehaviors (behaviors) {
      if (behaviors) {
        const currentBehaviors = {
          grabber: behaviors.grabber || defaultBehaviors.grabber,
          rendererList: behaviors.rendererList || defaultBehaviors.rendererList,
          strokerList: behaviors.strokerList || defaultBehaviors.strokerList,
          recognizerList: behaviors.recognizerList || defaultBehaviors.recognizerList,
          events: behaviors.events || defaultBehaviors.events,
          getBehaviorFromConfiguration: behaviors.getBehaviorFromConfiguration || defaultBehaviors.getBehaviorFromConfiguration
        }
        logger.debug('Override default behaviors', currentBehaviors)
        return currentBehaviors
      }
      return defaultBehaviors
    }

    export default defaultBehaviors