import { generateQueryString } from '@/utils/queryStringUtil';
import { apiSlice } from '.';
import URLS from './constants';
import {
  ProjectFile,
  CreateProjectFileRequest,
  UpdateProjectFileRequest,
  ProjectFileFilterParams,
  GetProjectFileListResponse,
  GetProjectFileByIdResponse
} from '@/types/projectFile';


// Define the API endpoints
export const projectFileApi = apiSlice.injectEndpoints({
  endpoints: (builder) => ({
    getProjectFiles: builder.query<GetProjectFileListResponse, ProjectFileFilterParams>({
      query: (params) => ({
        url: `${URLS.PROJECT}/${params.project}/files?${generateQueryString(
          params as Record<string, unknown>
        )}`,
        method: 'GET',
      }),
      providesTags: ['ProjectFiles'],
    }),

    getProjectFileById: builder.query<GetProjectFileByIdResponse, { projectId: string; fileId: string }>({
      query: ({ projectId, fileId }) => ({
        url: `${URLS.PROJECT}/${projectId}/files/${fileId}`,
        method: 'GET',
      }),
      providesTags: ['ProjectFiles'],
    }),

    createProjectFile: builder.mutation<ProjectFile, { projectId: string; body: CreateProjectFileRequest }>({
      query: ({ projectId, body }) => ({
        url: `${URLS.PROJECT}/${projectId}/files`,
        method: 'POST',
        body,
      }),
      invalidatesTags: ['ProjectFiles'],
    }),

    updateProjectFile: builder.mutation<
      ProjectFile,
      { projectId: string; fileId: string; body: UpdateProjectFileRequest }
    >({
      query: ({ projectId, fileId, body }) => ({
        url: `${URLS.PROJECT}/${projectId}/files/${fileId}`,
        method: 'PATCH',
        body,
      }),
      invalidatesTags: ['ProjectFiles'],
    }),

    deleteProjectFile: builder.mutation<{ success: boolean }, { projectId: string; fileId: string }>({
      query: ({ projectId, fileId }) => ({
        url: `${URLS.PROJECT}/${projectId}/files/${fileId}`,
        method: 'DELETE',
      }),
      invalidatesTags: ['ProjectFiles'],
    }),
  }),
});

// Export the generated hooks
export const {
  useGetProjectFilesQuery,
  useGetProjectFileByIdQuery,
  useCreateProjectFileMutation,
  useUpdateProjectFileMutation,
  useDeleteProjectFileMutation,
} = projectFileApi;