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

export interface Document {
  id: string;
  name: string;
  paperSize: string;
  scope: string;
  content: string;
  status?: 'draft' | 'published' | 'unpublished';
  companyId?: { id: string };
  createdBy?: { id: string };
  updatedBy?: { id: string };
  projectIds: { id: string; projectName?: string }[];
  showLogoInHeader?: boolean;
  startFromHalfPage?: boolean;
}

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

interface GetDocumentByIdResponse {
  code: number;
  message: string;
  success: boolean;
  data: Document;
  error?: object;
}

export type GetDocumentsQueryParams = {
  page?: number;
  limit?: number;
  search?: string;
  sortBy?: string;
  populate?: string;
  includeTimeStamps?: boolean;
  companyId?: string;
  project?: string;
  status?: string;
};

export const documentApi = apiSlice.injectEndpoints({
  endpoints: (builder) => ({
    getDocuments: builder.query<GetDocumentsResponse, GetDocumentsQueryParams>({
      query: (params) => ({
        url: `${URLS.DOCUMENTS}?${generateQueryString(params as Record<string, unknown>)}`,
        method: 'GET',
      }),
      providesTags: ['Document'],
    }),

    getDocumentById: builder.query<GetDocumentByIdResponse, string>({
      query: (id) => ({
        url: `${URLS.DOCUMENTS}/${id}`,
        method: 'GET',
      }),
    }),

    createDocument: builder.mutation<Document, Partial<Document>>({
      query: (body) => ({
        url: `${URLS.DOCUMENTS}`,
        method: 'POST',
        body,
      }),
      invalidatesTags: ['Document'],
    }),

    updateDocument: builder.mutation<Document, { id: string } & Partial<Document>>({
      query: ({ id, ...body }) => ({
        url: `${URLS.DOCUMENTS}/${id}`,
        method: 'PATCH',
        body,
      }),
      invalidatesTags: ['Document'],
    }),

    deleteDocument: builder.mutation<{ success: boolean }, string>({
      query: (id) => ({
        url: `${URLS.DOCUMENTS}/${id}`,
        method: 'DELETE',
      }),
      invalidatesTags: ['Document'],
    }),
  }),
  overrideExisting: false,
});

export const {
  useGetDocumentsQuery,
  useGetDocumentByIdQuery,
  useCreateDocumentMutation,
  useUpdateDocumentMutation,
  useDeleteDocumentMutation,
} = documentApi;
