import { useMemo } from 'react';
import { useQuery } from 'react-query';

import { getAudiencesCount } from 'src/services/audiencesService';
import { type AudienceCriteria, LogicalOperator } from 'src/types/audience';

import { audienceKeys } from '../queries';
import {
  type KnowledgeBaseAudienceForm,
  KnowledgeBaseAudienceType,
} from '../types';

type Params = KnowledgeBaseAudienceForm;

const useKnowledgeBaseAudience = ({ audienceType, segmentation }: Params) => {
  const criteria = useMemo((): AudienceCriteria[] => {
    if (!audienceType) return [];

    if (audienceType === KnowledgeBaseAudienceType.ALL) {
      return [
        {
          includeAllUsers: true,
          specificUserIds: [],
          segmentationExpression: null,
        },
      ];
    }

    const expressions = Object.entries(segmentation)
      .filter(([_, ids]) => ids.size > 0)
      .map(([groupId, ids]) => ({
        groupId: Number(groupId),
        itemIds: [...ids],
      }));

    if (!expressions.length) return [];

    return [
      {
        includeAllUsers: false,
        specificUserIds: [],
        segmentationExpression: {
          operator: LogicalOperator.OR,
          expressions,
        },
      },
    ];
  }, [audienceType, segmentation]);

  const enableQuery = criteria.length > 0;

  const { data, isLoading } = useQuery({
    queryKey: audienceKeys.count(criteria),
    queryFn: () => getAudiencesCount({ criteria }),
    enabled: enableQuery,
  });

  const totalCount = data?.data?.count ?? 0;

  return {
    totalCount: enableQuery ? totalCount : 0,
    isLoading,
    criteria,
  };
};

export default useKnowledgeBaseAudience;
