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

export interface PaymentPlan {
  id: string;
  name: string;
  project: {
    id: string;
    projectName?: string;
  } | string;
  companyId?: {
    id: string;
  };
  downPayment: number;
  downPaymentType: 'percentage' | 'fixedAmount';
  status: 'active' | 'inactive';
  ratePerSqYd: number;
  installmentMonth: number;
  createdBy?: {
    id: string;
  };
  updatedBy?: {
    id: string;
  };
}

interface GetPaymentPlanListResponse {
  data: {
    results: PaymentPlan[];
    page: number;
    limit: number;
    totalPages: number;
    totalResults: number;
  };
  code: number;
  message: string;
  success: boolean;
  error?: object;
}

interface GetPaymentPlanByIdResponse {
  data: PaymentPlan;
  code: number;
  message: string;
  success: boolean;
  error?: object;
}

type GetPaymentPlanQueryParams = {
  page?: number;
  limit?: number;
  search?: string;
  status?: string;
  sortBy?: string;
  populate?: string;
  project?: string;
};

export const paymentPlanApi = apiSlice.injectEndpoints({
  endpoints: (builder) => ({
    getPaymentPlans: builder.query<GetPaymentPlanListResponse, GetPaymentPlanQueryParams>({
      query: (params) => ({
        url: `${URLS.PAYMENT_PLAN}?${generateQueryString(params as Record<string, unknown>)}`,
        method: 'GET',
      }),
      providesTags: ['PaymentPlan'],
    }),

    getPaymentPlanById: builder.query<GetPaymentPlanByIdResponse, string>({
      query: (id) => ({
        url: `${URLS.PAYMENT_PLAN}/${id}`,
        method: 'GET',
      }),
    }),

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

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

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

export const {
  useGetPaymentPlansQuery,
  useGetPaymentPlanByIdQuery,
  useCreatePaymentPlanMutation,
  useUpdatePaymentPlanMutation,
  useDeletePaymentPlanMutation,
} = paymentPlanApi;
