import axios from '@/network/axios';
import { useMutation, useQuery } from '@tanstack/react-query';
import type { PhoneReportFilters } from './useInfluencerPhoneReport';
import { buildParams } from './useInfluencerPhoneReport';

export type BulkCampaign = {
  id: number;
  title: string | null;
  template_id: number;
  total: number;
  sent: number;
  failed: number;
  status: 'pending' | 'running' | 'completed' | 'cancelled' | 'failed' | string;
  error: string | null;
};

export type BulkSendPayload = {
  template_id: number;
  content?: string;
  title?: string;
  /** When true, target every row matching `filters` instead of `selected`. */
  select_all?: boolean;
  /** "platform|handle" keys. */
  selected?: string[];
  filters?: PhoneReportFilters;
};

const postBulkSend = async (payload: BulkSendPayload): Promise<BulkCampaign> => {
  const body = {
    ...payload,
    filters: payload.filters ? buildParams(payload.filters) : undefined,
  };
  const { data } = await axios.post<{ data: { campaign: BulkCampaign } }>(
    '/influencer-number/report/bulk-send',
    body,
  );
  return data.data.campaign;
};

export const useBulkSend = () =>
  useMutation<BulkCampaign, any, BulkSendPayload>({
    mutationFn: postBulkSend,
  });

/**
 * Polls a running campaign so the UI can show live progress. Polling stops
 * once the campaign reaches a terminal state.
 */
export const useCampaignProgress = (campaignId: number | null) =>
  useQuery<BulkCampaign>({
    queryKey: ['morasalaty-campaign', campaignId],
    enabled: !!campaignId,
    refetchInterval: (query) => {
      const status = query.state.data?.status;
      return status && ['completed', 'cancelled', 'failed'].includes(status) ? false : 2000;
    },
    queryFn: async () => {
      const { data } = await axios.get<{ data: { campaign: BulkCampaign } }>(
        `/influencer-number/report/campaigns/${campaignId}`,
      );
      return data.data.campaign;
    },
  });

export const useCancelCampaign = () =>
  useMutation<void, any, number>({
    mutationFn: async (id: number) => {
      await axios.post(`/influencer-number/report/campaigns/${id}/cancel`);
    },
  });

export default useBulkSend;
