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

export interface BankAccount {
  id: string;
  bankName: string;
  ifscCode: string;
  branch: string;
  accountNumber?: number;
  accountType: BankAccountType;
  status: Status;
  createdBy?: string;
  updatedBy?: string;
}

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

interface GetBankAccountByIdResponse {
  data: BankAccount;
  code: number;
  message: string;
  success: boolean;
  error?: object;
}

export const bankAccountApi = apiSlice.injectEndpoints({
  endpoints: (builder) => ({
    getBankAccounts: builder.query<
      GetBankAccountListResponse,
      {
        page?: number;
        limit?: number;
        search?: string;
        sortBy?: string;
        populate?: string;
        status?: string;
        accountType?: string;
        company?: string;
      }
    >({
      query: (params) => ({
        url: `${URLS.BANK_ACCOUNT}?${generateQueryString(
          params as Record<string, unknown>
        )}`,
        method: "GET",
      }),
      providesTags: ["BankAccount"],
    }),

    createBankAccount: builder.mutation<
      BankAccount,
      {
        bankName: string;
        ifscCode: string;
        branch: string;
        accountNumber?: number;
        accountType: BankAccountType;
        status: Status;
      }
    >({
      query: (body) => ({
        url: URLS.BANK_ACCOUNT,
        method: "POST",
        body,
      }),
      invalidatesTags: ["BankAccount"],
    }),

    updateBankAccount: builder.mutation<
      BankAccount,
      {
        id: string;
        bankName?: string;
        ifscCode?: string;
        branch?: string;
        accountNumber?: number;
        accountType?: BankAccountType;
        status?: Status;
      }
    >({
      query: ({ id, ...body }) => ({
        url: `${URLS.BANK_ACCOUNT}/${id}`,
        method: "PATCH",
        body,
      }),
      invalidatesTags: ["BankAccount"],
    }),

    deleteBankAccount: builder.mutation<{ success: boolean }, string>({
      query: (id) => ({
        url: `${URLS.BANK_ACCOUNT}/${id}`,
        method: "DELETE",
      }),
      invalidatesTags: ["BankAccount"],
    }),
    getBankAccountById: builder.query<
      GetBankAccountByIdResponse,
      string
    >({
      query: (id) => ({
        url: `${URLS.BANK_ACCOUNT}/${id}`,
        method: "GET",
      }),
      // so that edits/creates invalidate it if needed
      providesTags: (result, error, id) => [{ type: "BankAccount", id }],
    }),
  }),
  
  overrideExisting: false,
});

export const {
  useGetBankAccountsQuery,
  useCreateBankAccountMutation,
  useUpdateBankAccountMutation,
  useDeleteBankAccountMutation,
  useGetBankAccountByIdQuery
} = bankAccountApi;
