export interface EmailTemplate {
  id: string;
  templateId: string;
  name: string;
  subject: string | null;
  emailStatus: string;
  status: string;
  companyId: { id: string } | string;
}

export interface Paginated<T> {
  results: T[];
  page: number;
  limit: number;
  totalPages: number;
  totalResults: number;
}

export interface ApiEnvelope<T> {
  code: number;
  message: string;
  data: T;
  success: boolean;
}

// Extend ApiEnvelope to include email property if your API returns it
export interface ApiEnvelopeWithEmail<T> extends ApiEnvelope<T> {
  emailCredits?: any;
}

export interface GetEmailTemplatesParams {
  page?: number;
  limit?: number;
  search?: string;
  companyId?: string;
}

export interface GetEmailsResponse {
  results: EmailTemplate[];
  emailCredits?: any;
}

// RTK Query API slice

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

export const emailApi = apiSlice.injectEndpoints({
  endpoints: (builder) => ({
    getEmails: builder.query<GetEmailsResponse, GetEmailTemplatesParams | void>(
      {
        query: (params = {}) => ({
          url: `${URLS.EMAIL}?${generateQueryString(
            params as Record<string, unknown>
          )}`,
          method: "GET",
        }),
        transformResponse: (
          response: ApiEnvelopeWithEmail<Paginated<EmailTemplate>>
        ) => (
          console.log(response),
          {
            results: response.data.results,
            emailCredits: response.data.emailCredits,
          }
        ),
        providesTags: ["EmailTemplate"],
      }
    ),
    updateEmailStatus: builder.mutation<
      EmailTemplate,
      { id: string; status: string }
    >({
      query: ({ id, ...body }) => ({
        url: `${URLS.EMAIL}/${id}`,
        method: "PATCH",
        body,
      }),
      invalidatesTags: ["EmailTemplate"],
    }),
  }),
  overrideExisting: true,
});

export const { useGetEmailsQuery, useUpdateEmailStatusMutation } = emailApi;
