/**
 * Copyright (c) 2023-present Pi Dash Software, Inc. and contributors
 * SPDX-License-Identifier: AGPL-3.0-only
 * See the LICENSE file for details.
 */

import { set } from "lodash-es";
import { action, computed, makeObservable, observable, runInAction } from "mobx";
// pi dash imports
import { SitesModuleService } from "@pi-dash/services";
// types
import type { TPublicModule } from "@/types/modules";
// root store
import type { RootStore } from "./root.store";

export interface IIssueModuleStore {
  // observables
  modules: TPublicModule[] | undefined;
  // computed actions
  getModuleById: (moduleId: string | undefined) => TPublicModule | undefined;
  getModulesByIds: (moduleIds: string[]) => TPublicModule[];
  // fetch actions
  fetchModules: (anchor: string) => Promise<TPublicModule[]>;
}

export class ModuleStore implements IIssueModuleStore {
  moduleMap: Record<string, TPublicModule> = {};
  moduleService: SitesModuleService;
  rootStore: RootStore;

  constructor(_rootStore: RootStore) {
    makeObservable(this, {
      // observables
      moduleMap: observable,
      // computed
      modules: computed,
      // fetch action
      fetchModules: action,
    });
    this.moduleService = new SitesModuleService();
    this.rootStore = _rootStore;
  }

  get modules() {
    return Object.values(this.moduleMap);
  }

  getModuleById = (moduleId: string | undefined) => (moduleId ? this.moduleMap[moduleId] : undefined);

  getModulesByIds = (moduleIds: string[]) => {
    const currModules = [];
    for (const moduleId of moduleIds) {
      const issueModule = this.getModuleById(moduleId);
      if (issueModule) {
        currModules.push(issueModule);
      }
    }

    return currModules;
  };

  fetchModules = async (anchor: string) => {
    try {
      const modulesResponse = await this.moduleService.list(anchor);
      runInAction(() => {
        this.moduleMap = {};
        for (const issueModule of modulesResponse) {
          set(this.moduleMap, [issueModule.id], issueModule);
        }
      });
      return modulesResponse;
    } catch (error) {
      console.error("Failed to fetch members:", error);
      return [];
    }
  };
}
