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

type PlanValidity = {
  validfor: number;
  validUnit: "months" | "days" | "years"; // extend as needed
};

export interface Invoice {
  id: string;
  invoiceNumber: number;
  issuedDate: string;
  dueDate: string;
  company: {
    id: string;
    name?: string;
    websiteUrl?: string;
  };
  planValidity?: PlanValidity;
  maxUserCount?: number;
  price: number;
  tax?: number;
  discount?: number;
  finalPrice: number;
  status: "paid" | "unpaid" | "overdue";
  createdBy?: { id: string };
  updatedBy?: { id: string };
  note?: string;
}

export interface CreateInvoice {
  id: string;
  invoiceNumber: number;
  issuedDate: string;
  dueDate: string;
  company: string;
  planValidity?: PlanValidity;
  maxUserCount?: number;
  price: number;
  tax?: number;
  discount?: number;
  finalPrice: number;
  status: "paid" | "unpaid" | "overdue";
  createdBy?: { id: string };
  updatedBy?: { id: string };
  note?: string;
}

interface GetInvoiceListResponse {
  data: {
    results: Invoice[];
    page: number;
    limit: number;
    totalPages: number;
    totalResults: number;
  };
  code: number;
  message: string;
  success: boolean;
}

interface GetInvoiceByIdResponse {
  data: Invoice;
  code: number;
  message: string;
  success: boolean;
}

type GetInvoicesQueryParams = {
  page?: number;
  limit?: number;
  company?: string;
  search?: string;
  populate?: string;
};

export const invoiceApi = apiSlice.injectEndpoints({
  endpoints: (builder) => ({
    getInvoices: builder.query<GetInvoiceListResponse, GetInvoicesQueryParams>({
      query: (params) => ({
        url: `${URLS.INVOICE}?${generateQueryString(
          params as Record<string, unknown>
        )}`,
        method: "GET",
      }),
      providesTags: ["Invoice"],
    }),

    getInvoiceById: builder.query<GetInvoiceByIdResponse, string>({
      query: (id) => ({
        url: `${URLS.INVOICE}/${id}`,
        method: "GET",
      }),
    }),

    createInvoice: builder.mutation<
      Invoice,
      { data: Partial<CreateInvoice>; merge?: boolean }
    >({
      query: ({ data, merge }) => ({
        url: `${URLS.INVOICE}${merge ? "?merge=true" : ""}`,
        method: "POST",
        body: data,
      }),
      invalidatesTags: ["Invoice"],
    }),

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

    deleteInvoice: builder.mutation<{ success: boolean }, string>({
      query: (id) => ({
        url: `${URLS.INVOICE}/${id}`,
        method: "DELETE",
      }),
      invalidatesTags: ["Invoice"],
    }),
  }),
  overrideExisting: false,
});

export const {
  useGetInvoicesQuery,
  useLazyGetInvoicesQuery,
  useGetInvoiceByIdQuery,
  useCreateInvoiceMutation,
  useUpdateInvoiceMutation,
  useDeleteInvoiceMutation,
} = invoiceApi;
