import loadScript from 'discourse/lib/load-script';
import { observes } from 'ember-addons/ember-computed-decorators';

const LOAD_ASYNC = !Ember.testing;

export default Ember.Component.extend({
  mode: 'css',
  classNames: ['ace-wrapper'],
  _editor: null,
  _skipContentChangeEvent: null,
  disabled: false,

  @observes('editorId')
  editorIdChanged() {
    if (this.get('autofocus')) {
      this.send('focus');
    }
  },

  @observes('content')
  contentChanged() {
    if (this._editor && !this._skipContentChangeEvent) {
      this._editor.getSession().setValue(this.get('content'));
    }
  },

  @observes('mode')
  modeChanged() {
    if (LOAD_ASYNC && this._editor && !this._skipContentChangeEvent) {
      this._editor.getSession().setMode("ace/mode/" + this.get('mode'));
    }
  },

  @observes('disabled')
  disabledStateChanged() {
    this.changeDisabledState();
  },

  changeDisabledState() {
    const editor = this._editor;
    if (editor) {
      const disabled = this.get('disabled');
      editor.setOptions({
        readOnly: disabled,
        highlightActiveLine: !disabled,
        highlightGutterLine: !disabled
      });
      editor.container.parentNode.setAttribute("data-disabled", disabled);
    }
  },

  _destroyEditor: function() {
    if (this._editor) {
      this._editor.destroy();
      this._editor = null;
    }
    if (this.appEvents) {
      // xxx: don't run during qunit tests
      this.appEvents.off('ace:resize', this, this.resize);
    }

    $(window).off('ace:resize');

  }.on('willDestroyElement'),

  resize() {
    if (this._editor) {
      this._editor.resize();
    }
  },

  didInsertElement() {
    this._super();

    loadScript("/javascripts/ace/ace.js", { scriptTag: true }).then(() => {
      window.ace.require(['ace/ace'], loadedAce => {
        if (!this.element || this.isDestroying || this.isDestroyed) { return; }
        const editor = loadedAce.edit(this.$('.ace')[0]);

        if (LOAD_ASYNC) {
          editor.setTheme("ace/theme/chrome");
        }
        editor.setShowPrintMargin(false);
        editor.setOptions({fontSize: "14px"});
        if (LOAD_ASYNC) {
          editor.getSession().setMode("ace/mode/" + this.get('mode'));
        }
        editor.on('change', () => {
          this._skipContentChangeEvent = true;
          this.set('content', editor.getSession().getValue());
          this._skipContentChangeEvent = false;
        });
        editor.$blockScrolling = Infinity;
        editor.renderer.setScrollMargin(10,10);

        this.$().data('editor', editor);
        this._editor = editor;
        this.changeDisabledState();

        $(window).off('ace:resize').on('ace:resize', ()=>{
          this.appEvents.trigger('ace:resize');
        });

        if (this.appEvents) {
          // xxx: don't run during qunit tests
          this.appEvents.on('ace:resize', ()=>this.resize());
        }

        if (this.get("autofocus")) {
          this.send("focus");
        }
      });
    });
  },

  actions: {
    focus() {
      if (this._editor) {
        this._editor.focus();
        this._editor.navigateFileEnd();
      }
    }
  }
});