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

export interface LeadStage {
  id: string;
  stageName: string;
  description?: string;
  color?: string;
  isDefault?: boolean;
  isActive: boolean;
  position?: number;
  company?: { id: string };
  createdBy?: { id: string };
  updatedBy?: { id: string };
  name?: string;
  success?: boolean;
  message?: string;
}

interface GetLeadStageListResponse {
  code: number;
  message: string;
  success: boolean;
  data: {
    results: LeadStage[];
    page: number;
    limit: number;
    totalPages: number;
    totalResults: number;
  };
}

interface CreateOrUpdateLeadStageRequest {
  stageName: string;
  description?: string;
  isActive: boolean;
  color: string;
}

interface UpdatePositionRequest {
  id: string;
  position: number;
}

export const leadStageApi = apiSlice.injectEndpoints({
  endpoints: (builder) => ({
    getLeadStages: builder.query<
      GetLeadStageListResponse,
      { page?: number; limit?: number; search?: string, alias?: string, sortBy?: string, company?: string}
    >({
      query: (params) => ({
        url: `${URLS.LEAD_STAGE}?${generateQueryString(params as Record<string, unknown>)}`,
        method: 'GET',
      }),
      providesTags: ['LeadStage'],
    }),
    createLeadStage: builder.mutation<LeadStage, CreateOrUpdateLeadStageRequest>({
      query: (body) => ({
        url: `${URLS.LEAD_STAGE}`,
        method: 'POST',
        body,
      }),
      invalidatesTags: ['LeadStage'],
    }),
    updateLeadStage: builder.mutation<LeadStage, { id: string } & Partial<CreateOrUpdateLeadStageRequest>>({
      query: ({ id, ...body }) => ({
        url: `${URLS.LEAD_STAGE}/${id}`,
        method: 'PATCH',
        body,
      }),
      invalidatesTags: ['LeadStage'],
    }),
    deleteLeadStage: builder.mutation<{ success: boolean }, string>({
      query: (id) => ({
        url: `${URLS.LEAD_STAGE}/${id}`,
        method: 'DELETE',
      }),
      invalidatesTags: ['LeadStage'],
    }),
    updateLeadStagePositions: builder.mutation<{ success: boolean }, UpdatePositionRequest[]>({
      query: (body) => ({
        url: `${URLS.LEAD_STAGE}/position`,
        method: 'PATCH',
        body,
      }),
      invalidatesTags: ['LeadStage'],
    }),
  }),
  overrideExisting: false,
});

export const {
  useGetLeadStagesQuery,
  useCreateLeadStageMutation,
  useUpdateLeadStageMutation,
  useDeleteLeadStageMutation,
  useUpdateLeadStagePositionsMutation,
} = leadStageApi;
