// src/services/customFieldApi.ts
import { generateQueryString } from "@/utils/queryStringUtil";
import { apiSlice } from ".";
import URLS from "./constants";

/* ────────────────────────────
 *  Types
 * ────────────────────────────*/
export interface CustomFieldOption {
  label: string;
  value: string;
  isDeleted?: boolean;
}

export interface CustomField {
  id: string;
  companyId?: string | { id: string };
  formName: string;
  label: string;
  key: string;
  type: "text" | "email" | "dropdown" | "checkbox" | "date" | "radio" | string; // fallback for server-side custom types
  placeholder?: string;
  section?: string;
  required?: boolean;
  /** When true and type is number, document placeholders output sq.m */
  isUOM?: boolean;
  sequence?: number;
  options?: CustomFieldOption[];
}

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

interface GetCustomFieldByIdResponse {
  code: number;
  message: string;
  success: boolean;
  data: CustomField;
  error?: object;
}

export type GetCustomFieldsQueryParams = {
  /** Pagination */
  page?: number;
  limit?: number;
  /** Filtering */
  formName?: string;
  fields?: string; // e.g. "formName,section,label"
  search?: string;
  /** Sorting / population */
  sortBy?: string;
  populate?: string;
  companyId?: string;
};

/* ────────────────────────────
 *  Endpoints
 * ────────────────────────────*/
export const customFieldApi = apiSlice.injectEndpoints({
  endpoints: (builder) => ({
    /* GET /custom-fields */
    getCustomFields: builder.query<
      GetCustomFieldsResponse,
      GetCustomFieldsQueryParams
    >({
      query: (params) => ({
        url: `${URLS.CUSTOM_FIELDS}?${generateQueryString(
          params as Record<string, unknown>
        )}`,
        method: "GET",
      }),
    }),

    /* GET /custom-fields/:id */
    getCustomFieldById: builder.query<GetCustomFieldByIdResponse, string>({
      query: (id) => ({
        url: `${URLS.CUSTOM_FIELDS}/${id}`,
        method: "GET",
      }),
    }),

    /* POST /custom-fields */
    createCustomField: builder.mutation<CustomField, Partial<CustomField>>({
      query: (body) => ({
        url: `${URLS.CUSTOM_FIELDS}`,
        method: "POST",
        body,
      }),
    }),

    /* PATCH /custom-fields/:id */
    updateCustomField: builder.mutation<
      CustomField,
      { id: string } & Partial<CustomField>
    >({
      query: ({ id, ...body }) => ({
        url: `${URLS.CUSTOM_FIELDS}/${id}`,
        method: "PATCH",
        body,
      }),
    }),

    updateCustomFieldSequence: builder.mutation<
      { success: boolean; message: string },
      { formName: string; sequence: { id: string; sequence: number }[] }
    >({
      query: ({ formName, sequence }) => ({
        url: `${URLS.CUSTOM_FIELDS}/form/${formName}`,
        method: "PATCH",
        body: { sequence },
      }),
    }),

    /* DELETE /custom-fields/:id */
    deleteCustomField: builder.mutation<{ success: boolean }, string>({
      query: (id) => ({
        url: `${URLS.CUSTOM_FIELDS}/${id}`,
        method: "DELETE",
      }),
    }),
  }),
  overrideExisting: false,
});

/* ────────────────────────────
 *  Hooks
 * ────────────────────────────*/
export const {
  useGetCustomFieldsQuery,
  useGetCustomFieldByIdQuery,
  useCreateCustomFieldMutation,
  useUpdateCustomFieldMutation,
  useUpdateCustomFieldSequenceMutation,
  useDeleteCustomFieldMutation,
} = customFieldApi;
