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

export interface PartnerNetworkItem {
  id: string;
  userName: string;
  companyName: string;
  cityName: string;
  stateName: string;
  request?: string;
  categories: string[];
  totalProperties: number;
  joinedOn: Date;
  potentialMatches: {
    sell: number;
    rent: number;
    lease: number;
  };
  about: {
    email: string;
    contact: {
      dialCode: number;
      number: number;
    };
  };
}

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

export interface ConnectPartnerRequest {
  senderId: string;
  receiverId: string;
}

export interface UpdatePartnerStatusRequest {
  id: string;
  status: "accepted" | "declined";
}

export interface GetPartnerNetworkParams {
  search?: string;
  sortBy?: string;
  page?: number;
  limit?: number;
  city?: string;
  state?: string;
  specialization?: string;
  companyType?: string;
  type?: string;
}

export const partnerNetworkApi = apiSlice.injectEndpoints({
  endpoints: (builder) => ({
    getPartnerNetwork: builder.query<
      PartnerNetworkResponse,
      GetPartnerNetworkParams
    >({
      query: (params) => ({
        url: `${URLS.PARTNER_NETWORK}?${generateQueryString(
          params as Record<string, unknown>
        )}`,
        method: "GET",
      }),
      providesTags: ["PartnerNetwork"],
    }),

    connectPartner: builder.mutation<
      { success: boolean; message: string },
      ConnectPartnerRequest
    >({
      query: (body) => ({
        url: URLS.PARTNER_NETWORK,
        method: "POST",
        body,
      }),
      invalidatesTags: ["PartnerNetwork"],
    }),

    updatePartnerStatus: builder.mutation<
      { success: boolean },
      UpdatePartnerStatusRequest
    >({
      query: ({ id, ...body }) => ({
        url: `${URLS.PARTNER_NETWORK}/${id}`,
        method: "PATCH",
        body,
      }),
      invalidatesTags: ["PartnerNetwork"],
    }),

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

export const {
  useGetPartnerNetworkQuery,
  useConnectPartnerMutation,
  useUpdatePartnerStatusMutation,
  useDeletePartnerNetworkMutation,
} = partnerNetworkApi;
