import { useMemo } from 'react';

import {
  ORPHEUS_EXPERIMENT_PARAMETER,
  useExperimentContext,
} from '@/context/ExperimentsContext';

import { OrpheusExperimentGroup } from '../types';

export type UseOrpheusExperimentGroupValue = {
  isControlGroup: boolean;
  experimentGroup: OrpheusExperimentGroup;
  isLoading: boolean;
};

export const useOrpheusExperimentGroup = (): UseOrpheusExperimentGroupValue => {
  const { data: orpheusGroup, isLoading } = useExperimentContext(
    ORPHEUS_EXPERIMENT_PARAMETER
  );

  const isValidGroup = (value: unknown): value is OrpheusExperimentGroup => {
    return (
      typeof value === 'string' &&
      Object.values(OrpheusExperimentGroup).includes(
        value as OrpheusExperimentGroup
      )
    );
  };

  const safeExperimentGroup = useMemo(
    () =>
      isValidGroup(orpheusGroup)
        ? orpheusGroup
        : OrpheusExperimentGroup.Control,
    [orpheusGroup]
  );

  return useMemo(
    () => ({
      isControlGroup: safeExperimentGroup === OrpheusExperimentGroup.Control,
      experimentGroup: safeExperimentGroup,
      isLoading,
    }),
    [safeExperimentGroup, isLoading]
  );
};
