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

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

export interface Activity {
  id: string;
  title: string;
  comment: string;
  type:
    | "call"
    | "notes"
    | "site-visit"
    | "schedule"
    | "quote"
    | "files"
    | "book"
    | "hold";
  status?: "pending" | "completed" | "overdue";
  company: { id: string };
  lead: { id: string };
  assignedTo: ActivityAssignedUser;
  createdBy?: { id: string };
  updatedBy?: { id: string };
  createdAt?: string;
  updatedAt?: string;
  project?: string | { projectName: string; id: string };
  property?: string;
  unit?: {unitNumber: string};
  files?: string[];
  unitBookingOrHold?: string;
  contact: Contact;
  scheduleDateTime?: string;
  location?: string;
  completionNote?: string;
  siteVisitImage?: string;
}

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

export type GetActivitiesQueryParams = {
  page?: number;
  limit?: number;
  search?: string;
  populate?: string;
  includeTimeStamps?: boolean;
  lead?: string;
  contact?: string;
  company?: string;
  task?: string;
};

export interface DocumentPersonPayload {
  name: string;
  aadharFront: string; // S3 URL
  aadharBack: string;
  panCard: string;
  passportPhoto: string;
  additionalDocs?: string[];
}

export interface CreateUnitBookingOrHoldRequest {
  lead: string;
  project?: string;
  unit?: string;
  action: "book" | "hold";
  comment?: string;
  holdUntil?: string;
  bookingAmount?: number;
  paymentPlan?: string;
  property?: string;
  soldBy?: string;
  cpContact?: string;
  customFields?: Record<string, any>;
  persons?: DocumentPersonPayload[]; // changed here
}

export type BookingDocumentFieldKey =
  | "aadharFront"
  | "aadharBack"
  | "panCard"
  | "passportPhoto"
  | "additionalDocs";

export interface UpdateBookingDocumentRequest {
  personIndex: number;
  fieldKey: BookingDocumentFieldKey;
  url: string;
  additionalDocIndex?: number;
}

export interface CreateUnitBookingOrHoldResponse {
  id: string;
  lead: string;
  project: string;
  unit: string;
  action: "book" | "hold";
  comment?: string;
  holdUntil?: string;
  bookingAmount?: number;
  paymentPlan?: string;
  property?: string;
  soldBy?: string;
  persons?: DocumentPersonPayload[]; // changed here
  createdBy?: string;
  updatedBy?: string;
  createdAt: string;
  updatedAt: string;
  data?: CreateUnitBookingOrHoldResponse;
}

export interface UnitHeldByUser {
  id: string;
  firstName?: string;
  lastName?: string;
  name?: string;
  email?: string;
  workEmail?: string;
  phone?: string | number;
  mobile?: string | number;
  contactNumber?: string | number;
  number?: string | number;
}

export interface UnitHeldByRecord {
  id: string;
  action: "hold";
  holdUntil?: string;
  createdBy?: UnitHeldByUser;
}

export interface GetUnitHeldByResponse {
  code?: number;
  message?: string;
  success?: boolean;
  data: UnitHeldByRecord | null;
}

export const activityApi = apiSlice.injectEndpoints({
  endpoints: (builder) => ({
    getActivities: builder.query<
      GetActivityListResponse,
      GetActivitiesQueryParams
    >({
      query: (params) => ({
        url: `${URLS.ACTIVITY}?${generateQueryString(
          params as Record<string, unknown>
        )}`,
        method: "GET",
      }),
      providesTags: ["Activity"],
    }),

    createActivity: builder.mutation<Activity, Partial<Activity>>({
      query: (body) => ({
        url: `${URLS.ACTIVITY}`,
        method: "POST",
        body,
      }),
      invalidatesTags: ["Activity", "Lead"],
    }),

    createPublicActivity: builder.mutation<Activity, Partial<Activity>>({
      query: (body) => ({
        url: `${URLS.ACTIVITY}`,
        method: "POST",
        body,
      }),
    }),

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

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

    createUnitBookingOrHold: builder.mutation<
      CreateUnitBookingOrHoldResponse,
      CreateUnitBookingOrHoldRequest
    >({
      query: (body) => ({
        url: `${URLS.UNIT_BOOKING_OR_HOLD}`,
        method: "POST",
        body,
      }),
    }),

    getUnitHeldBy: builder.query<GetUnitHeldByResponse, string>({
      query: (unitId) => ({
        url: `/unit/${unitId}/held-by`,
        method: "GET",
      }),
    }),

    updateBookingDocument: builder.mutation<
      unknown,
      {
        unitBookingOrHoldId: string;
        customerId: string;
        body: UpdateBookingDocumentRequest;
      }
    >({
      query: ({ unitBookingOrHoldId, body }) => ({
        url: `${URLS.UNIT_BOOKING_OR_HOLD}/${unitBookingOrHoldId}/booking-document`,
        method: "PATCH",
        body,
      }),
      invalidatesTags: (_result, _error, { customerId }) => [
        { type: "Customer", id: customerId },
      ],
    }),
  }),
  overrideExisting: false,
});

export const {
  useGetActivitiesQuery,
  useCreateActivityMutation,
  useCreatePublicActivityMutation,
  useUpdateActivityMutation,
  useDeleteActivityMutation,
  useCreateUnitBookingOrHoldMutation,
  useLazyGetUnitHeldByQuery,
  useUpdateBookingDocumentMutation,
} = activityApi;
