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

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

interface GetIndividualPropertiesByIdResponse {
  data: individualProperties;
  code: number;
  message: string;
  success: boolean;
  error?: object;
}

interface CreateIndividualPropertiesResponse {
  data: individualProperties;
  code: number;
  message: string;
  success: boolean;
  error?: object;
}

interface GetIndividualPropertiesParams {
  page?: number;
  limit?: number;
  search?: string;
  propertyType?: string;
  availableFor?: string;
  size?: string;
  price?: string;
  availability?: string;
  addedBy?: string;
  populate?: string;
  includeTimeStamps?: boolean;
  companyId?: string;
}

interface GetIndividualPropertiesByIdParams {
  [key: string]: unknown;
}

interface UpdateIndividualPropertiesArg {
  id: string;
  data: Partial<individualProperties>;
}

interface GetPropertyProjectNamesParams {
  status?: "active" | "inactive" | "draft";
  isViewOnly?: boolean;
}

interface GetPropertyProjectNamesResponse {
  data: {
    id: string;
    projectName: string;
    locality?: { id: string; name: string | null };
    city?: { id: string; name: string | null };
  }[];
  code: number;
  message: string;
  success: boolean;
}

export const individualPropertiesApi = apiSlice.injectEndpoints({
  endpoints: (builder) => ({
    getIndividualProperties: builder.query<
      GetIndividualPropertiesListResponse,
      GetIndividualPropertiesParams
    >({
      query: (params: GetIndividualPropertiesParams) => ({
        url: `${URLS.INDIVIDUAL_PROPERTIES}?${generateQueryString(
          params as Record<string, unknown>
        )}`,
        method: "GET",
      }),
      providesTags: ["individualProperties"],
    }),

    getIndividualPropertiesById: builder.query<
      GetIndividualPropertiesByIdResponse,
      string
    >({
      query: (id) => ({
        url: `${URLS.INDIVIDUAL_PROPERTIES}/${id}`,
        method: "GET",
      }),
      providesTags: ["editIndividualProperties"],
    }),

    getPropertyProjectNames: builder.query<
      GetPropertyProjectNamesResponse,
      GetPropertyProjectNamesParams | void
    >({
      query: (params = { status: "active", isViewOnly: true }) => ({
        url: `${URLS.INDIVIDUAL_PROPERTIES}/project-names?${generateQueryString(
          params as Record<string, unknown>
        )}`,
        method: "GET",
      }),
    }),

    getIndividualPropertiesPublicById: builder.query<
      GetIndividualPropertiesByIdResponse,
      string
    >({
      query: (id) => ({
        url: `${URLS.INDIVIDUAL_PROPERTIES}/${id}/public`,
        method: "GET",
      }),
      providesTags: ["editIndividualProperties"],
    }),

    createIndividualProperties: builder.mutation<
      CreateIndividualPropertiesResponse,
      Partial<individualProperties>
    >({
      query: (body: Partial<individualProperties>) => ({
        url: `${URLS.INDIVIDUAL_PROPERTIES}`,
        method: "POST",
        body,
      }),
      invalidatesTags: (result, _error, _arg) =>
        result ? ["individualProperties"] : [],
    }),

    updateIndividualProperties: builder.mutation<
      CreateIndividualPropertiesResponse,
      UpdateIndividualPropertiesArg
    >({
      query: ({ id, data }: UpdateIndividualPropertiesArg) => ({
        url: `${URLS.INDIVIDUAL_PROPERTIES}/${id}`,
        method: "PATCH",
        body: data,
      }),
      invalidatesTags: ["individualProperties", "editIndividualProperties"],
    }),

    deleteIndividualProperties: builder.mutation<{ success: boolean }, string>({
      query: (id: string) => ({
        url: `${URLS.INDIVIDUAL_PROPERTIES}/${id}`,
        method: "DELETE",
      }),
      invalidatesTags: ["individualProperties", "editIndividualProperties"],
    }),

    getProspects: builder.query({
      query: (id) => ({
        url: `${URLS.INDIVIDUAL_PROPERTIES}/${id}/prospects`,
        method: "GET",
      }),
      providesTags: ["individualPropertiesProspects"],
    }),
    getDefaultFormValues: builder.query({
      query: () => ({
        url: `${URLS.INDIVIDUAL_PROPERTIES}/defaultFormValues`,
        method: "GET",
      }),
    }),
  }),
  overrideExisting: false,
});

export const {
  useGetIndividualPropertiesQuery,
  useGetIndividualPropertiesByIdQuery,
  useGetIndividualPropertiesPublicByIdQuery,
  useCreateIndividualPropertiesMutation,
  useUpdateIndividualPropertiesMutation,
  useDeleteIndividualPropertiesMutation,
  useGetProspectsQuery,
  useGetDefaultFormValuesQuery,
  useGetPropertyProjectNamesQuery,
} = individualPropertiesApi;
