/// <reference types="@applicaster/applicaster-types" />
/* eslint-disable @typescript-eslint/no-unused-vars */
import { Context, useContext, useState } from "react";
import { ActionsContext } from "@applicaster/zapp-react-native-ui-components/Contexts/ActionsContext";

import { reactHooksLogger } from "../logger";

const logger = reactHooksLogger.addSubsystem("actions");

type ActionPlugin<T = unknown> = QuickBrickPlugin & { context: Context<T> };

type ActionContext<T = unknown> = Record<string, ActionPlugin<T>>;

type ActionContexts<T = unknown> = {
  actions: Record<string, ActionContext<T>>;
};

/**
 * React Hook to subscribe to the custom action context
 * @param {*} plugId - subscribes to the context of that action plugin
 * @return {*} - global action provider context or context for specific action plugin
 */
export function useActions<T = unknown>(plugId: string): any {
  const [logged, setLogged] = useState(false);
  const context = useContext<ActionContexts<T>>(ActionsContext);
  const actionContext = context?.actions?.[plugId]?.module?.context;

  if (plugId) {
    if (!actionContext) {
      if (!logged) {
        logger.warning({
          message: `useActions: Couldn't find an action for ${plugId} plugin`,
          data: { actions: context?.actions },
        });

        setLogged(true);
      }

      return undefined;
    }

    // Disabling the rule as it's fine to have  a conditional hook in this use case.
    // eslint-disable-next-line react-hooks/rules-of-hooks
    return useContext(actionContext);
  }

  return context;
}
