import { inject, resource } from '@angular/core';
import {
  CatalougeSearchService,
  QueryTokenInput,
} from '@isa/catalogue/data-access';
import { RewardCatalogStore } from '@isa/checkout/data-access';
import { SearchTrigger } from '@isa/shared/filter';

export const createRewardCatalogResource = (
  params: () => {
    queryToken: QueryTokenInput;
    searchTrigger: SearchTrigger | 'reload' | 'initial';
  },
) => {
  const catalogSearchService = inject(CatalougeSearchService);
  const rewardCatalogStore = inject(RewardCatalogStore);

  return resource({
    params,
    loader: async ({ abortSignal, params }) => {
      // TODO: Funktioniert nicht mehr seitdem der Storage angepasst wurde und man eine config reingeben kann (#5350, #5353)
      // Der Store lädt die Items zu spät, die Resource wird vorher schon getriggered

      // Load from session storage if items exist
      // if (params.searchTrigger === 'initial') {
      //   await rewardCatalogStore.loadFromStorage();

      //   if (rewardCatalogStore.items().length > 0) {
      //     return;
      //   }
      // }

      let skip = rewardCatalogStore.items().length;

      if (params.searchTrigger !== 'reload') {
        rewardCatalogStore.clearState();
        skip = 0;
      }

      const fetchCatalogResponse =
        await catalogSearchService.searchLoyaltyItems(
          {
            ...params.queryToken,
            skip,
          },
          abortSignal,
        );

      const result = fetchCatalogResponse?.result || [];
      const hits = fetchCatalogResponse?.hits || 0;

      if (params.searchTrigger === 'reload') {
        rewardCatalogStore.updateItems(result, hits);
      } else {
        rewardCatalogStore.setItems(result, hits);
      }

      return fetchCatalogResponse;
    },
  });
};
