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

export interface PropertyUsage {
  id: string;
  name: string;
}

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

interface GetPropertyUsageByIdResponse {
  data: PropertyUsage;
  code: number;
  message: string;
  success: boolean;
  error?: object;
}

export const propertyUsageApi = apiSlice.injectEndpoints({
  endpoints: (builder) => ({
    getPropertyUsages: builder.query<
      GetPropertyUsageListResponse,
      { page?: number; limit?: number; search?: string }
    >({
      query: (params) => ({
        url: `${URLS.PROPERTY_USAGE}?${generateQueryString(params as Record<string, unknown>)}`,
        method: 'GET',
      }),
      providesTags: ['PropertyUsage'],
    }),

    getPropertyUsageById: builder.query<GetPropertyUsageByIdResponse, string>({
      query: (id) => ({
        url: `${URLS.PROPERTY_USAGE}/${id}`,
        method: 'GET',
      }),
    }),

    createPropertyUsage: builder.mutation<PropertyUsage, { name: string }>({
      query: (body) => ({
        url: `${URLS.PROPERTY_USAGE}`,
        method: 'POST',
        body,
      }),
      invalidatesTags: ['PropertyUsage'],
    }),

    updatePropertyUsage: builder.mutation<PropertyUsage, { id: string; name: string }>({
      query: ({ id, name }) => ({
        url: `${URLS.PROPERTY_USAGE}/${id}`,
        method: 'PATCH',
        body: { name },
      }),
      invalidatesTags: ['PropertyUsage'],
    }),

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

export const {
  useGetPropertyUsagesQuery,
  useGetPropertyUsageByIdQuery,
  useCreatePropertyUsageMutation,
  useUpdatePropertyUsageMutation,
  useDeletePropertyUsageMutation,
} = propertyUsageApi;
