/*!
 * 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.
 */
(() => {
  const DEFAULT_OPTIONS = {
    debug: false,
  };

  class HotPocketApp {
    constructor (options) {
      this.plugins = [];
      this.options = {
        ...DEFAULT_OPTIONS,
        ...options,
      }
    }
    initPlugins = (plugins) => {
      for (let pluginSpec of plugins) {
        const [name, pluginFactory] = pluginSpec;
        this.plugins.push([name, pluginFactory(this)]);
      }
    }
    plugin = (name) => {
      const pluginSpec = this.plugins.find((pluginSpec) => {
        return pluginSpec[0] === name;
      });

      if (pluginSpec !== undefined) {
        return pluginSpec[1];
      }

      return null;
    }
    onLoad = (event) => {
      for (let pluginSpec of this.plugins) {
        if (pluginSpec[1].onLoad) {
          pluginSpec[1].onLoad(event);
        }
      }
    }
  }

  const plugins = [];

  window.HotPocket = {
    app: null,
    addPlugin: (name, pluginFactory) => {
      plugins.push([name, pluginFactory]);
    },
    run: (options) => {
      if (window.HotPocket.app === null) {
        window.HotPocket.app = new HotPocketApp(options);
        window.HotPocket.app.initPlugins(plugins);

        document.addEventListener('DOMContentLoaded', (event) => {
          window.HotPocket.app.onLoad(event);
        });
      }
    }
  };
})();
