import { Utility } from '../../core/utility';
import './checkbox.sass';

const CHECKBOX_CLASS = 'checkbox';
const RADIOBOX_CLASS = 'radiobox';
const CHECKBOX_INITIALIZED_CLASS = 'checkbox--initialized';

@Utility({
  selector: 'input[type="checkbox"]:not([uw-no-checkbox]), input[type="radio"]:not([uw-no-radiobox])',
})
export class Checkbox {

  _element;
  _wrapperEl;

  constructor(element) {
    if (!element) {
      throw new Error('Checkbox utility cannot be setup without an element!');
    }
    this._element = element;

    const isRadio = this._element.type === 'radio';
    const box_class = isRadio ? RADIOBOX_CLASS : CHECKBOX_CLASS;

    if (isRadio && this._element.closest('.radio-group')) {
      // Don't initialize radiobox, if radio is part of a group
      return false;
    }

    if (this._element.classList.contains(CHECKBOX_INITIALIZED_CLASS)) {
      // throw new Error('Checkbox utility already initialized!');
      return false;
    }

    if (this._element.parentElement.classList.contains(box_class)) {
      // throw new Error('Checkbox element\'s wrapper already has class '' + box_class + ''!');
      return false;
    }

    const siblingEl = this._element.nextSibling;
    const parentEl = this._element.parentElement;

    this._wrapperEl = document.createElement('div');
    this._wrapperEl.classList.add(box_class);

    const labelEl = document.createElement('label');
    labelEl.setAttribute('for', element.id);

    this._wrapperEl.appendChild(element);
    this._wrapperEl.appendChild(labelEl);

    parentEl.insertBefore(this._wrapperEl, siblingEl);

    this._element.classList.add(CHECKBOX_INITIALIZED_CLASS);
  }

  destroy() {
    if (this._wrapperEl !== undefined)
      this._wrapperEl.remove();
    this._element.classList.remove(CHECKBOX_INITIALIZED_CLASS);
  }
}
