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

export interface TeamMember {
  id: string;
  firstName?: string;
  lastName?: string;
}

export interface Team {
  id: string;
  name: string;
  description: string;
  lead: TeamMember | string;
  companyId: TeamMember | string;
  members: TeamMember[];
  createdBy?: TeamMember;
  updatedBy?: TeamMember;
  createdAt?: string | Date;
  updatedAt?: string | Date;
}

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

interface GetTeamByIdResponse {
  data: Team;
  code: number;
  message: string;
  success: boolean;
  error?: object;
}

export const teamApi = apiSlice.injectEndpoints({
  endpoints: (builder) => ({
    getTeams: builder.query<
      GetTeamsListResponse,
      {
        page?: number;
        limit?: number;
        search?: string;
        companyId?: string;
        populate?: string;
        includeTimeStamps?: boolean;
        sortBy?: string;
      }
    >({
      query: (params) => ({
        url: `${URLS.TEAMS}?${generateQueryString(params as Record<string, unknown>)}`,
        method: "GET",
      }),
      providesTags: ["Team"],
    }),

    getTeamById: builder.query<GetTeamByIdResponse, string>({
      query: (id) => ({
        url: `${URLS.TEAMS}/${id}`,
        method: "GET",
      }),
    }),

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

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

    deleteTeam: builder.mutation<{ success: boolean }, string>({
      query: (id) => ({
        url: `${URLS.TEAMS}/${id}`,
        method: "DELETE",
      }),
      invalidatesTags: ["Team"],
    }),
  }),
});

export const {
  useGetTeamsQuery,
  useGetTeamByIdQuery,
  useCreateTeamMutation,
  useUpdateTeamMutation,
  useDeleteTeamMutation,
} = teamApi;
