// ╭──────────────────────────────────────────────────────────────────────────────────╮
// │ 📌 High Order Component Overview                                                 │
// ┣──────────────────────────────────────────────────────────────────────────────────┫
// │ ➤ Internal Svelte Code Format :|: V.8.0                                          │
// │ ➤ Status :|: 🔒 LOCKED                                                           │
// │ ➤ Author(s) :|: @migbash                                                         │
// ┣──────────────────────────────────────────────────────────────────────────────────┫
// │ 📝 Description                                                                   │
// ┣──────────────────────────────────────────────────────────────────────────────────┫
// │ > Client 'Svelte/Store'                                                          │
// │ > Main Scores Platform Admin Session ('Ephermal') Store                          │
// ╰──────────────────────────────────────────────────────────────────────────────────╯

/* eslint-disable max-len */

// #region ➤ 📦 Package Imports

import { writable } from 'svelte/store';

// #endregion ➤ 📦 Package Imports

// #region ➤ 📌 VARIABLES

const
  /**
   * @description
   * 📝 store object instance
   */
  storeObject: IAdminControl
    = {
      admin: false,
      numberOfAdvertsActive: 0
    }
;

// #endregion ➤ 📌 VARIABLES

// #region ➤ 🛠️ METHODS

/**
 * @summary
 * @author
 * @description
 * @returns
 */
function createLocalStore
(
)
{
  const
    // ╭─────
    // │ NOTE: |:| 📣 default 'svelte/store' exports.
    // ╰─────
    {
      subscribe,
      set,
      update
    } = writable
    (
      storeObject
    ),
    /**
     * @description
     *  📣 Complementary 'store' added methods.
     */
    methods
      = {

        // ╭──────────────────────────────────────────────────────────────────────────────────╮
        // │ 📣 Main Logic                                                                    │
        // ╰──────────────────────────────────────────────────────────────────────────────────╯

        /**
         * @author
         *  @migbash
         * @summary
         *  - 🔹 HELPER
         *  - IMPORTANT
         * @description
         *  📣 Update **target** `list` data of target `properties` to update.
         * @param { [IAdminDataProp, any][] } data
         *  💠 **[required]** Target data to update.
         * @return { void }
         */
        updateData:
        (
          data: [IAdminDataProp, any][]
        ): void =>
        {
          for (const iterator of data)
          {
            const
              /**
               * @description
               */
              dataTarget = iterator[0],
              /**
               * @description
               */
              dataPoint = iterator[1]
            ;

            if (dataTarget == 'admin')
              storeObject.admin = dataPoint;
            else if (dataTarget == 'numberOfAdvertsActive')
              storeObject.numberOfAdvertsActive += 1;
            ;
          }

          set
          (
            storeObject
          );

          return;
        },

      }
  ;

  return {
    subscribe,
    set,
    update,
    ...methods
  };
}

// #endregion ➤ 🛠️ METHODS

export const storeAdmin = createLocalStore();
