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

export interface ContactPhone {
  dialCode: number;
  number: number;
  isPrimary?: boolean;
}

export interface PopulatedField {
  _id: string;
  name: string;
}

export interface PopulatedUser {
  _id: string;
  firstName: string;
  lastName: string;
  email: string;
  id?: string;
}

export interface Contact {
  _id: string;
  id?: string;
  createdAt: string;
  updatedAt: string;
  company?: { id?: string };

  firstName: string;
  lastName: string;
  name?: string;
  phone?: Phone[];
  email: string;
  phoneNumbers?: ContactPhone[];
  addressLine1: string;
  addressLine2: string;
  country: PopulatedField;
  state: PopulatedField;
  city: PopulatedField;
  pinCode: number;
  sourceId: PopulatedField;
  companyName: string;
  position: string;
  workPhoneNumber: ContactPhone;
  workEmail: string;
  primaryPhone?: number;

  createdBy?: PopulatedUser;
  updatedBy?: PopulatedUser;

  message?: string;
  success?: boolean;
  data?: Contact;
}

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

interface GetContactByIdResponse {
  data: Contact;
  code: number;
  message: string;
  success: boolean;
  error?: object;
}

export interface CreateContactBody {
  firstName: string;
  lastName: string;
  email: string;
  phoneNumbers?: ContactPhone[];
  addressLine1: string;
  addressLine2: string;
  country: string;
  state: string;
  city: string;
  pinCode: string;
  source: string;
  companyName: string;
  position: string;
  workPhoneNumber: string;
  workEmail: string;
  message?: string;
  success?: boolean;
  // createdBy?: string;
}

type UpdateContactBody = Partial<CreateContactBody>;

export const contactApi = apiSlice.injectEndpoints({
  endpoints: (builder) => ({
    getContacts: builder.query<
      GetContactListResponse,
      {
        page?: number;
        limit?: number;
        search?: string;
        sortBy?: string;
        populate?: string;
        includeTimeStamps?: boolean;
        source?: string;
        company?: string;
        companyId?: string;
        fields?: string;
        alias?: string;
      }
    >({
      query: (params) => ({
        url: `${URLS.CONTACT}?${generateQueryString(
          params as Record<string, unknown>,
        )}`,
        method: "GET",
      }),
      providesTags: ["Contact"],
    }),

    getContactById: builder.query<GetContactByIdResponse, string>({
      query: (id) => ({
        url: `${URLS.CONTACT}/${id}`,
        method: "GET",
      }),
      providesTags: ["Contact"],
    }),

    createContact: builder.mutation<Contact, CreateContactBody>({
      query: (body) => ({
        url: `${URLS.CONTACT}`,
        method: "POST",
        body,
      }),
      invalidatesTags: (result, error, arg) =>
        result ? ["Contact", "Task"] : [],
    }),

    updateContact: builder.mutation<
      Contact,
      { id: string; body: UpdateContactBody }
    >({
      query: ({ id, body }) => ({
        url: `${URLS.CONTACT}/${id}`,
        method: "PATCH",
        body,
      }),
      invalidatesTags: (result, error, { id }) => [
        { type: "Contact", id },
        "Contact",
      ],
    }),

    deleteContact: builder.mutation<{ success: boolean }, string>({
      query: (id) => ({
        url: `${URLS.CONTACT}/${id}`,
        method: "DELETE",
      }),
      invalidatesTags: (_result, _error, id) => [
        { type: "Contact", id },
        "Contact",
        "Task",
      ],
    }),

    checkRefContact: builder.query({
      query: (id) => ({
        url: `${URLS.CONTACT}/${id}/referenceContact`,
        method: "GET",
      }),
    }),
  }),
  overrideExisting: false,
});

export const {
  useGetContactsQuery,
  useGetContactByIdQuery,
  useCreateContactMutation,
  useUpdateContactMutation,
  useDeleteContactMutation,
  useCheckRefContactQuery,
} = contactApi;
