/*!
 * HotPocket by BTHLabs (https://hotpocket.app/)
 * Copyright 2025-present BTHLabs <contact@bthlabs.pl> (https://bthlabs.pl/)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
((HotPocket, bootstrap) => {
  const DEFAULT_OPTIONS = {
    triggerElement: null,
    confirm: false,
    onHide: () => {},
  };

  class HotPocketModal {
    constructor (app, options) {
      this.app = app;
      this.options = {
        ...DEFAULT_OPTIONS,
        ...options,
      };
      this.action = 'dismiss';

      this.triggerElement = this.options.triggerElement;

      if (options.confirm === false) {
        this.triggerElement.addEventListener('click', this.onTriggerElementClick);
      }

      this.templateElement = document.querySelector(
        this.triggerElement.dataset.uiModal,
      );

      this.modalElement = null;

      this.modal = null;

      this.triggerElement.HotPocketModal = this;
    }
    show = () => {
      this.modalElement = this.templateElement.content.cloneNode(true).querySelector('.modal');

      this.modalElement.querySelector('[data-ui-modal-action]').addEventListener(
        'click', this.onActionClick,
      );

      this.modalElement.addEventListener('hidden.bs.modal', this.onModalHidden);

      this.modal = new bootstrap.Modal(this.modalElement);

      document.body.appendChild(this.modalElement);
      this.modal.show();
    };
    onTriggerElementClick = (event) => {
      event.preventDefault();

      this.show();

      return false;
    };
    onActionClick = (event) => {
      this.action = event.target.dataset['uiModalAction'];
      this.modal.hide();
    };
    onModalHidden = (event) => {
      document.body.removeChild(this.modalElement);

      this.modal = null;
      this.modalElement = null;

      this.options.onHide(this.action);
    };
  };

  HotPocket.addPlugin('UI.Modal', (app) => {
    return (options) => {
      return new HotPocketModal(app, options);
    };
  });
})(window.HotPocket, window.bootstrap);
