import { useEffect } from 'react';
import { useMutation } from 'react-query';

import Button from '@material-hu/components/design-system/Buttons/Button';

import { getAudiencesCount } from 'src/services/audiencesService';
import { type AudienceCriteria, type CriteriaType } from 'src/types/audience';
import { useLokaliseTranslation } from 'src/utils/i18n';

import { useCriteriaColaborators } from 'src/components/Audience/NewSeeCollaborators';

const useGetTotalAudience = (
  criteria: AudienceCriteria[],
  criteriaType?: CriteriaType,
) => {
  const { t } = useLokaliseTranslation('audience');

  const audiencesCountMutation = useMutation({
    mutationFn: () =>
      getAudiencesCount({
        criteria,
      }),
  });

  const totalAudienceCount = audiencesCountMutation.data?.data?.count || 0;

  const { showDrawer: showSelectedUsersDrawer, drawer: selectedUsersDrawer } =
    useCriteriaColaborators({
      criteria: criteria || [],
      usersCount: totalAudienceCount,
      type: criteriaType,
    });

  const enableQuery =
    (criteria?.length ?? 0) > 0 &&
    criteria.some(
      c =>
        c.includeAllUsers ||
        (c.specificUserIds?.length ?? 0) > 0 ||
        (c.segmentationExpression?.expressions?.some(
          e => (e.itemIds?.length ?? 0) > 0,
        ) ??
          false),
    );

  const criteriaKey = JSON.stringify(criteria);

  // biome-ignore lint/correctness/useExhaustiveDependencies: mutate is stable; criteriaKey avoids refetch when only reference changes
  useEffect(() => {
    if (enableQuery) {
      audiencesCountMutation.mutate();
    }
  }, [criteriaKey, enableQuery]);

  const button = enableQuery ? (
    <Button
      variant="secondary"
      size="small"
      sx={{
        fontSize: '14px',
        height: 'fit-content',
      }}
      loading={audiencesCountMutation.isLoading}
      onClick={showSelectedUsersDrawer}
    >
      {t('audience:total_audience', {
        count: totalAudienceCount,
      })}
    </Button>
  ) : null;

  return {
    button,
    selectedUsersDrawer,
    showSelectedUsersDrawer,
    totalAudienceCount: enableQuery ? totalAudienceCount : 0,
    loading: audiencesCountMutation.isLoading,
  };
};

export default useGetTotalAudience;
