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

export interface PaymentTerm {
  id: string;
  name: string;
  stage: string;
  triggerType: 'percentage' | 'amount';
  triggerValue: number;
  documentTemplate: { id: string, name: string };
  paymentPlans: (string | { id: string,name: string })[];
  status: 'active' | 'inactive';
  sendSMS: boolean;
  sendEmail: boolean;
  project: string | { id: string };
  createdBy?: { id: string };
  updatedBy?: { id: string };
}

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

interface GetPaymentTermByIdResponse {
  data: PaymentTerm;
  code: number;
  message: string;
  success: boolean;
  error?: object;
}

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

export const paymentTermApi = apiSlice.injectEndpoints({
  endpoints: (builder) => ({
    getPaymentTerms: builder.query<GetPaymentTermListResponse, GetPaymentTermQueryParams>({
      query: (params) => ({
        url: `${URLS.PROJECT}/${params.project}${URLS.PAYMENT_TERM}?${generateQueryString(params as Record<string, unknown>)}`,
        method: 'GET',
      }),
      providesTags: ['PaymentTerm'],
    }),

    getPaymentTermById: builder.query<GetPaymentTermByIdResponse, { id: string; projectId: string }>({
      query: ({ id, projectId }) => ({
        url: `${URLS.PROJECT}/${projectId}${URLS.PAYMENT_TERM}/${id}`,
        method: 'GET',
      }),
    }),

    createPaymentTerm: builder.mutation<PaymentTerm, Partial<PaymentTerm>>({
      query: (body) => ({
        url: `${URLS.PROJECT}/${body.project}${URLS.PAYMENT_TERM}`,
        method: 'POST',
        body,
      }),
      invalidatesTags: ['PaymentTerm'],
    }),

    updatePaymentTerm: builder.mutation<PaymentTerm, { id: string } & Partial<PaymentTerm>>({
      query: ({ id, ...body }) => ({
        url: `${URLS.PROJECT}/${body.project}${URLS.PAYMENT_TERM}/${id}`,
        method: 'PATCH',
        body,
      }),
      invalidatesTags: ['PaymentTerm'],
    }),

    deletePaymentTerm: builder.mutation<{ success: boolean }, { id: string; projectId: string }>({
      query: ({ id, projectId }) => ({
        url: `${URLS.PROJECT}/${projectId}${URLS.PAYMENT_TERM}/${id}`,
        method: 'DELETE',
      }),
      invalidatesTags: ['PaymentTerm'],
    }),
  }),
  overrideExisting: false,
});

export const {
  useGetPaymentTermsQuery,
  useGetPaymentTermByIdQuery,
  useCreatePaymentTermMutation,
  useUpdatePaymentTermMutation,
  useDeletePaymentTermMutation,
} = paymentTermApi;
