import { apiSlice } from "./baseApi";

const transactionApi = apiSlice.injectEndpoints({
  endpoints: (builder) => ({
    getOnlinePaymentSessionByOrderId: builder.query<
      {
        success: boolean;
        paymentSession: {
          id: string;
          razorpayOrderId: string;
          razorpayPaymentId?: string | null;
          status: string;
          amount: number;
          currency: string;
          registrationId?: number | null;
          hasTransaction: boolean;
          transaction?: {
            id: number;
            status: string;
            amount: number;
            createdAt: string;
          } | null;
          registration?: {
            id: number;
            registrant1: string;
            registrant2: string;
            phone1: string;
            mahayagPlace: string;
            submittedSeva: number;
            remainingSeva: number;
          } | null;
        };
      },
      { paymentIdentifier: string; registrationId?: number }
    >({
      query: ({ paymentIdentifier, registrationId }) => ({
        url: "/api/transactions/online/payment-session",
        method: "GET",
        params: new URLSearchParams(
          registrationId
            ? { paymentIdentifier, registrationId: String(registrationId) }
            : { paymentIdentifier }
        ),
      }),
    }),

    createManualOnlineTransaction: builder.mutation<
      {
        success: boolean;
        message: string;
        transaction: {
          id: number;
          amount: string;
          method: string;
          status: string;
          receiptNumber?: string | null;
          receiptUrl?: string | null;
          haridhamReceiptUrl?: string | null;
          createdAt: string;
        };
        registration: {
          id: number;
          submittedSeva: number;
          remainingSeva: number;
          fullyPaidSevaAt?: string | null;
        };
        paymentSession: {
          id: string;
          razorpayOrderId: string;
          razorpayPaymentId?: string | null;
          status: string;
        };
      },
      {
        registrationId: number;
        paymentIdentifier: string;
        amount: number;
      }
    >({
      query: (body) => ({
        url: "/api/transactions/online/manual",
        method: "POST",
        body,
      }),
      invalidatesTags: ["Registration", "Admin", "Analytics"],
    }),

    recordCashPayment: builder.mutation<
      {
        success: boolean;
        transactionId: number;
      },
      {
        registrationId: number;
        amount: number;
        notes?: string;
      }
    >({
      query: (transactionData) => ({
        url: "/api/transactions/cash",
        method: "POST",
        body: transactionData,
      }),
      invalidatesTags: ["Registration"],
    }),

    getAllTransactions: builder.query<
      {
        success: boolean;
        data: Array<{
          id: number;
          amount: number;
          type: string;
          status: string;
          createdAt: string;
          registration: {
            id: number;
            registrant1: string;
            mahayagPlace: string;
          };
        }>;
      },
      void
    >({
      query: () => ({
        url: "/api/transactions",
        method: "GET",
      }),
    }),

    updateTransactionStatus: builder.mutation<
      {
        success: boolean;
      },
      {
        transactionId: number;
        status: string;
      }
    >({
      query: ({ transactionId, ...statusData }) => ({
        url: `/api/transactions/${transactionId}/status`,
        method: "PATCH",
        body: statusData,
      }),
    }),
  }),
});

export const {
  useLazyGetOnlinePaymentSessionByOrderIdQuery,
  useCreateManualOnlineTransactionMutation,
  useRecordCashPaymentMutation,
  useGetAllTransactionsQuery,
  useUpdateTransactionStatusMutation,
} = transactionApi;
