text: 'use strict';
  /**
   * `editor` type prompt
   */
  
  var chalk = require('chalk');
  var editAsync = require('external-editor').editAsync;
  var Base = require('./base');
  var observe = require('../utils/events');
  var { Subject } = require('rxjs');
  
  class EditorPrompt extends Base {
    /**
     * Start the Inquiry session
     * @param  {Function} cb      Callback when prompt is done
     * @return {this}
     */
  
    _run(cb) {
      this.done = cb;
  
      this.editorResult = new Subject();
  
      // Open Editor on "line" (Enter Key)
      var events = observe(this.rl);
      this.lineSubscription = events.line.subscribe(this.startExternalEditor.bind(this));
  
      // Trigger Validation when editor closes
      var validation = this.handleSubmitEvents(this.editorResult);
      validation.success.forEach(this.onEnd.bind(this));
      validation.error.forEach(this.onError.bind(this));
  
      // Prevents default from being printed on screen (can look weird with multiple lines)
      this.currentText = this.opt.default;
      this.opt.default = null;
  
      // Init
      this.render();
  
      return this;
    }
  
    /**
     * Render the prompt to screen
     * @return {EditorPrompt} self
     */
  
    render(error) {
      var bottomContent = '';
      var message = this.getQuestion();
  
      if (this.status === 'answered') {
        message += chalk.dim('Received');
      } else {
        message += chalk.dim('Press <enter> to launch your preferred editor.');
      }
  
      if (error) {
        bottomContent = chalk.red('>> ') + error;
      }
  
      this.screen.render(message, bottomContent);
    }
  
    /**
     * Launch $EDITOR on user press enter
     */
  
    startExternalEditor() {
      // Pause Readline to prevent stdin and stdout from being modified while the editor is showing
      this.rl.pause();
      editAsync(this.currentText, this.endExternalEditor.bind(this));
    }
  
    endExternalEditor(error, result) {
      this.rl.resume();
      if (error) {
        this.editorResult.error(error);
      } else {
        this.editorResult.next(result);
      }
    }
  
    onEnd(state) {
      this.editorResult.unsubscribe();
      this.lineSubscription.unsubscribe();
      this.answer = state.value;
      this.status = 'answered';
      // Re-render prompt
      this.render();
      this.screen.done();
      this.done(this.answer);
    }
  
    onError(state) {
      this.render(state.isValid);
    }
  }
  
  module.exports = EditorPrompt;
  