import { generateQueryString } from '@/utils/queryStringUtil';
import { apiSlice } from '.';
import URLS from './constants';

export interface Campaign {
  id: string;
  name: string;
  description?: string;
  trackingLink?: string;
  type?: 'project' | 'property';
  project?: { id: string, projectName: string } | string;
  property?: { id: string, title: string } | string;
  targetedCity?: { id: string }[] | string[];
  targetedAreas?: { id: string }[] | string[];
  subCategories?: { id: string }[] | string[];
  category?: { id: string } | string | null;
  channel?: string[];
  whatsappTemplates?: string;
  emailTemplates?: string;
  smsTemplates?: string;
  team?: { id: string }[] | string;
  sendToAll?: boolean;
  budgetRange?: {
    min: number;
    max: number;
  };
  targetStrategy?: string;
  spreadDuration?: number;
  launchTime?: string;
  scheduleTime?: string;
  status?: string;
  company?: { id: string };
  createdAt?: string | Date;
  clicks?: number;
  leads?: number;
}

interface CampaignListResponse {
  code: number;
  message: string;
  success: boolean;
  data: {
    results: Campaign[];
    stats?: any;
    page: number;
    limit: number;
    totalPages: number;
    totalResults: number;
  };
}

interface CampaignDetailResponse {
  code: number;
  message: string;
  success: boolean;
  data: Campaign;
}

type GetCampaignsQueryParams = {
  page?: number;
  limit?: number;
  search?: string;
  company?: string;
  includeTimeStamps?: boolean;
  populate?: string;
};

export const campaignApi = apiSlice.injectEndpoints({
  endpoints: (builder) => ({
    getCampaigns: builder.query<CampaignListResponse, GetCampaignsQueryParams>({
      query: (params) => ({
        url: `${URLS.CAMPAIGN}?${generateQueryString(params as Record<string, unknown>)}`,
        method: 'GET',
      }),
      providesTags: ['Campaign'],
    }),

    getCampaignById: builder.query<CampaignDetailResponse, string>({
      query: (id) => ({
        url: `${URLS.CAMPAIGN}/${id}`,
        method: 'GET',
      }),
    }),

    createCampaign: builder.mutation<Campaign, Partial<Campaign>>({
      query: (body) => ({
        url: `${URLS.CAMPAIGN}`,
        method: 'POST',
        body,
      }),
      invalidatesTags: ['Campaign'],
    }),

    updateCampaign: builder.mutation<Campaign, { id: string } & Partial<Campaign>>({
      query: ({ id, ...body }) => ({
        url: `${URLS.CAMPAIGN}/${id}`,
        method: 'PATCH',
        body,
      }),
      invalidatesTags: ['Campaign'],
    }),

    deleteCampaign: builder.mutation<{ success: boolean }, string>({
      query: (id) => ({
        url: `${URLS.CAMPAIGN}/${id}`,
        method: 'DELETE',
      }),
      invalidatesTags: ['Campaign'],
    }),
  }),
  overrideExisting: false,
});

export const {
  useGetCampaignsQuery,
  useGetCampaignByIdQuery,
  useCreateCampaignMutation,
  useUpdateCampaignMutation,
  useDeleteCampaignMutation,
} = campaignApi;
