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

export interface Task {
  id: string;
  contactId: string;
  leadId: string;
  assignedTo: string;
  notes: string;
  activityType: "call" | "meeting" | "siteVisit" | "other";
  siteVisitImage?: string;
  callStatus?: "scheduled" | "completed" | "cancelled";
  activityDate?: string;
  location?: string;
  project?: { projectName?: string; id?: string };
  activityName?: string;
  createdAt: string;
  updatedAt: string;
  status?: string;
  contact?: {
    firstName: string;
    lastName: string;
    source: { name?: string };
    phone: Phone[];
    id: string;
  };
  assignedUser?: { id: string; firstName: string; lastName: string };
  createdByUser?: { firstName: string; lastName: string };
  leadScore?: number;
  data?: Task;
  customFields?: {};
}

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

interface BulkUpdateTasksResponse {
  code: number;
  message: string;
  success: boolean;
  data?: Task[];
  error?: object;
}

interface BulkDeleteTasksResponse {
  code: number;
  message: string;
  success: boolean;
  data?: Task[];
  error?: object;
}

interface CreateTaskPayload {
  contactId: string;
  leadId: string;
  assignedTo: string;
  notes: string;
  activityType: "call" | "meeting" | "siteVisit" | "other";
  siteVisitImage?: string;
  callStatus?: "scheduled" | "completed" | "cancelled";
  activityDate?: string;
  location?: string;
  project?: string;
  property?: string;
  activityName?: string;
  status?: string;
}

export const taskApi = apiSlice.injectEndpoints({
  endpoints: (builder) => ({
    getTasks: builder.query<
      GetTasksResponse,
      {
        page?: number;
        limit?: number;
        search?: string;
        sortBy?: string;
        status?: string;
        activityType?: string;
        companyId?: string;
        assignedTo?: string;
        dueDateFrom?: string;
        dueDateTo?: string;
      }
    >({
      query: (params) => ({
        url: `${URLS.TASKS}?${generateQueryString(
          params as Record<string, unknown>
        )}`,
        method: "GET",
      }),
      providesTags: ["Task"],
    }),

    createTask: builder.mutation<Task, CreateTaskPayload>({
      query: (body) => ({
        url: `${URLS.TASKS}`,
        method: "POST",
        body,
      }),
      invalidatesTags: ["Task", "SidebarAnalytics"],
    }),

    updateTask: builder.mutation<
      Task,
      { id: string } & Partial<CreateTaskPayload>
    >({
      query: ({ id, ...body }) => ({
        url: `${URLS.TASKS}/${id}`,
        method: "PATCH",
        body,
      }),
      invalidatesTags: ["Task", "Lead"],
    }),

    deleteTask: builder.mutation<{ success: boolean }, string>({
      query: (id) => ({
        url: `${URLS.TASKS}/${id}`,
        method: "DELETE",
      }),
      invalidatesTags: ["Task"],
    }),
    bulkUpdateTasks: builder.mutation<
      BulkUpdateTasksResponse,
      { ids: string[]; updateData: Record<string, unknown> }
    >({
      query: (body) => ({
        url: `${URLS.TASKS}/bulk/update`,
        method: "PATCH",
        body,
      }),
      invalidatesTags: ["Task"],
    }),
    bulkDeleteTasks: builder.mutation<BulkDeleteTasksResponse, { taskIds: string[] }>(
      {
        query: (body) => ({
          url: `${URLS.TASKS}/bulk/delete`,
          method: "DELETE",
          body,
        }),
        invalidatesTags: ["Task"],
      },
    ),
  }),
});

export const {
  useGetTasksQuery,
  useCreateTaskMutation,
  useUpdateTaskMutation,
  useDeleteTaskMutation,
  useBulkUpdateTasksMutation,
  useBulkDeleteTasksMutation,
} = taskApi;
