import Util from "./util";

const Base = ($ => {
  const ClassName = {
    BMD_FORM_GROUP: "bmd-form-group",
    IS_FILLED: "is-filled",
    IS_FOCUSED: "is-focused"
  };

  const Selector = {
    BMD_FORM_GROUP: `.${ClassName.BMD_FORM_GROUP}`
  };

  const Default = {};

  /**
   * ------------------------------------------------------------------------
   * Class Definition
   * ------------------------------------------------------------------------
   */
  class Base {
    /**
     *
     * @param element
     * @param config
     * @param properties - anything that needs to be set as this[key] = value.  Works around the need to call `super` before using `this`
     */
    constructor($element, config, properties = {}) {
      this.$element = $element;
      this.config = $.extend(true, {}, Default, config);

      // set properties for use in the constructor initialization
      for (let key in properties) {
        this[key] = properties[key];
      }
    }

    dispose(dataKey) {
      this.$element.data(dataKey, null);
      this.$element = null;
      this.config = null;
    }

    // ------------------------------------------------------------------------
    // protected

    addFormGroupFocus() {
      if (!this.$element.prop("disabled")) {
        this.$bmdFormGroup.addClass(ClassName.IS_FOCUSED);
      }
    }

    removeFormGroupFocus() {
      this.$bmdFormGroup.removeClass(ClassName.IS_FOCUSED);
    }

    removeIsFilled() {
      this.$bmdFormGroup.removeClass(ClassName.IS_FILLED);
    }

    addIsFilled() {
      this.$bmdFormGroup.addClass(ClassName.IS_FILLED);
    }

    // Find bmd-form-group
    findMdbFormGroup(raiseError = true) {
      let mfg = this.$element.closest(Selector.BMD_FORM_GROUP);
      if (mfg.length === 0 && raiseError) {
        $.error(
          `Failed to find ${Selector.BMD_FORM_GROUP} for ${Util.describe(
            this.$element
          )}`
        );
      }
      return mfg;
    }

    // ------------------------------------------------------------------------
    // private

    // ------------------------------------------------------------------------
    // static
  }

  return Base;
})(jQuery);

export default Base;