import Component from '@ember/component';
import { set } from '@ember/object';
import { inject as service } from '@ember/service';
import { Promise } from 'rsvp';

import SlotsMixin from 'block-slots';
const STATE_READY = 'ready';
const STATE_SUCCESS = 'success';
const STATE_ERROR = 'error';
export default Component.extend(SlotsMixin, {
  wait: service('timeout'),
  dom: service('dom'),
  classNames: ['with-feedback'],
  transition: '',
  transitionClassName: 'feedback-dialog-out',
  state: STATE_READY,
  permanent: true,
  init: function() {
    this._super(...arguments);
    this.success = this._success.bind(this);
    this.error = this._error.bind(this);
  },
  applyTransition: function() {
    const wait = this.wait.execute;
    const className = this.transitionClassName;
    // TODO: Make 0 default in wait
    wait(0)
      .then(() => {
        set(this, 'transition', className);
        return wait(0);
      })
      .then(() => {
        return new Promise(resolve => {
          this.dom
            .element(`.${className}`, this.element)
            .addEventListener('transitionend', resolve);
        });
      })
      .then(() => {
        set(this, 'transition', '');
        set(this, 'state', STATE_READY);
      });
  },
  _success: function() {
    set(this, 'state', STATE_SUCCESS);
    this.applyTransition();
  },
  _error: function() {
    set(this, 'state', STATE_ERROR);
    this.applyTransition();
  },
});
