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

type Admin = {
  firstName?: string;
  lastName?: string;
  phone?: {
    dialCode?: number;
    number?: number;
  };
};

export interface Company {
  id: string;
  name: string;
  userType: string;
  gstNumber?: string;
  panNumber?: string;
  websiteUrl?: string;
  logo?: string;
  color?: string;
  description?: string;
  address?: string;
  area?: { id?: string };
  city?: { id?: string };
  state?: { id?: string };
  country?: { id?: string };
  pincode?: number;
  maxUserCount?: number;
  price?: number;
  status?: string;
  tax?: number;
  discount?: number;
  finalPrice?: number;
  planValidity?: { validfor?: string; validUnit?: string };
  phone?: {
    dialCode: number;
    number: number;
  };
  firstName?: string;
  lastName?: string;
  email?: string;
  admin: Admin[];
  message?: string;
  success?: boolean;
  displayLogoOnInvoices?: boolean;
  displayLogoOnQuotations?: boolean;
  data?: Company;
  whatsAppCredit?: number;
  smsCredit?: number;
  emailCredit?: number;
  whatsapp?: any;
}

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

interface GetCompanyByIdResponse {
  data: Company;
  code: number;
  message: string;
  success: boolean;
  error?: object;
}

type GetCompaniesQueryParams = {
  page?: number;
  limit?: number;
  search?: string;
  populate?: string;
  role?: string;
  team?: string;
  status?: string;
  companyType?: string;
  userType?: string;
  includeTimeStamps?: boolean;
  sortBy?: string;
  state?: string;
};

export const companyApi = apiSlice.injectEndpoints({
  endpoints: (builder) => ({
    getCompanies: builder.query<
      GetCompanyListResponse,
      GetCompaniesQueryParams
    >({
      query: (params) => ({
        url: `${URLS.COMPANY}?${generateQueryString(
          params as Record<string, unknown>
        )}`,
        method: "GET",
      }),
      providesTags: ["Company"],
    }),

    getCompanyById: builder.query<GetCompanyByIdResponse, string>({
      query: (id) => ({
        url: `${URLS.COMPANY}/${id}`,
        method: "GET",
      }),
      providesTags: ["CompanyById"],
    }),

    createCompany: builder.mutation<Company, Partial<Company>>({
      query: (body) => ({
        url: `${URLS.COMPANY}`,
        method: "POST",
        body,
      }),
      invalidatesTags: ["Company"],
    }),

    updateCompany: builder.mutation<Company, { id: string } & Partial<Company>>(
      {
        query: ({ id, ...body }) => ({
          url: `${URLS.COMPANY}/${id}`,
          method: "PATCH",
          body,
        }),
        invalidatesTags: ["Company"],
      }
    ),

    deleteCompany: builder.mutation<{ success: boolean }, string>({
      query: (id) => ({
        url: `${URLS.COMPANY}/${id}`,
        method: "DELETE",
      }),
      invalidatesTags: ["Company"],
    }),
  }),
  overrideExisting: false,
});

export const {
  useGetCompaniesQuery,
  useGetCompanyByIdQuery,
  useCreateCompanyMutation,
  useUpdateCompanyMutation,
  useDeleteCompanyMutation,
} = companyApi;
