import { apiSlice } from "./baseApi";
import {
  CashflowItem,
  CashflowListResponse,
  CashflowTimelineResponse,
  CashflowReceiptResponse,
  PradeshCashflowFilters,
  BulkCashAcceptResponse,
  CashOnHandDashboardResponse,
  CashflowBunchListResponse,
  CashflowBunchDetailResponse,
} from "@/types/api";

const cashflowApi = apiSlice.injectEndpoints({
  endpoints: (builder) => ({
    createCashflowRequest: builder.mutation<
      {
        success: boolean;
        message: string;
        cashflows: CashflowItem[];
        splitCount: number;
      },
      {
        registrationId: number;
        amount: number;
        method?: "CASH" | "CHEQUE";
        chequeNumber?: string;
        chequePhoto?: File;
        corpusLetter?: File;
      }
    >({
      query: (payload) => {
        const body = new FormData();
        body.append("registrationId", String(payload.registrationId));
        body.append("amount", String(payload.amount));
        body.append("method", payload.method || "CASH");
        if (payload.chequeNumber) body.append("chequeNumber", payload.chequeNumber);

        if (payload.chequePhoto) body.append("chequePhoto", payload.chequePhoto);
        if (payload.corpusLetter) body.append("corpusLetter", payload.corpusLetter);

        return {
          url: "/api/cashflow/request",
          method: "POST",
          body,
        };
      },
      invalidatesTags: ["Cashflow", "Registration"],
    }),

    reuploadChequeDocumentsByPersonal: builder.mutation<
      {
        success: boolean;
        message: string;
        cashflow: CashflowItem;
      },
      {
        transactionId: number;
        chequePhoto: File;
        corpusLetter: File;
      }
    >({
      query: ({ transactionId, chequePhoto, corpusLetter }) => {
        const body = new FormData();
        body.append("chequePhoto", chequePhoto);
        body.append("corpusLetter", corpusLetter);

        return {
          url: `/api/cashflow/personal/${transactionId}/reupload-cheque`,
          method: "PATCH",
          body,
        };
      },
      invalidatesTags: ["Cashflow", "Registration", "Admin"],
    }),

    getKaryakartaRequestedCashflows: builder.query<CashflowListResponse, void>({
      query: () => ({
        url: "/api/cashflow/karyakarta/requested",
        method: "GET",
      }),
      providesTags: ["Cashflow"],
    }),

    getKaryakartaAcceptedCashflows: builder.query<CashflowListResponse, void>({
      query: () => ({
        url: "/api/cashflow/karyakarta/accepted",
        method: "GET",
      }),
      providesTags: ["Cashflow"],
    }),

    acceptCashByKaryakarta: builder.mutation<
      {
        success: boolean;
        message: string;
        cashflow: CashflowItem;
      },
      number
    >({
      query: (transactionId) => ({
        url: `/api/cashflow/karyakarta/${transactionId}/accept`,
        method: "PATCH",
      }),
      invalidatesTags: ["Cashflow"],
    }),

    acceptBulkCashByKaryakarta: builder.mutation<
      {
        success: boolean;
        message: string;
        count: number;
        cashflows: CashflowItem[];
      },
      { transactionIds: number[] }
    >({
      query: (payload) => ({
        url: "/api/cashflow/karyakarta/accept-bulk",
        method: "PATCH",
        body: payload,
      }),
      invalidatesTags: ["Cashflow"],
    }),

    deleteCashByKaryakarta: builder.mutation<
      {
        success: boolean;
        message: string;
        cashflow: CashflowItem;
      },
      { transactionId: number; remark: string }
    >({
      query: ({ transactionId, remark }) => ({
        url: `/api/cashflow/karyakarta/${transactionId}/delete`,
        method: "PATCH",
        body: { remark },
      }),
      invalidatesTags: ["Cashflow", "Registration"],
    }),

    getPradeshRequestedCashflows: builder.query<CashflowListResponse, PradeshCashflowFilters | void>({
      query: (filters) => {
        const params = new URLSearchParams();

        if (filters?.mandalId) params.append("mandalId", String(filters.mandalId));
        if (filters?.pradeshId) params.append("pradeshId", String(filters.pradeshId));
        if (filters?.haridhamId) params.append("haridhamId", filters.haridhamId);
        if (filters?.fromDate) params.append("fromDate", filters.fromDate);
        if (filters?.toDate) params.append("toDate", filters.toDate);
        if (filters?.page) params.append("page", String(filters.page));
        if (filters?.limit) params.append("limit", String(filters.limit));
        if (filters?.sortBy) params.append("sortBy", filters.sortBy);
        if (filters?.sortOrder) params.append("sortOrder", filters.sortOrder);

        return {
          url: "/api/cashflow/pradesh/requested",
          method: "GET",
          params,
        };
      },
      providesTags: ["Cashflow"],
    }),

    getPradeshAcceptedCashflows: builder.query<CashflowListResponse, PradeshCashflowFilters | void>({
      query: (filters) => {
        const params = new URLSearchParams();

        if (filters?.mandalId) params.append("mandalId", String(filters.mandalId));
        if (filters?.pradeshId) params.append("pradeshId", String(filters.pradeshId));
        if (filters?.fromDate) params.append("fromDate", filters.fromDate);
        if (filters?.toDate) params.append("toDate", filters.toDate);
        if (filters?.page) params.append("page", String(filters.page));
        if (filters?.limit) params.append("limit", String(filters.limit));
        if (filters?.sortBy) params.append("sortBy", filters.sortBy);
        if (filters?.sortOrder) params.append("sortOrder", filters.sortOrder);

        return {
          url: "/api/cashflow/pradesh/accepted",
          method: "GET",
          params,
        };
      },
      providesTags: ["Cashflow"],
    }),

    getCashOnHandDashboard: builder.query<CashOnHandDashboardResponse, PradeshCashflowFilters | void>({
      query: (filters) => {
        const params = new URLSearchParams();

        if (filters?.mandalId) params.append("mandalId", String(filters.mandalId));
        if (filters?.pradeshId) params.append("pradeshId", String(filters.pradeshId));
        if (filters?.haridhamId) params.append("haridhamId", filters.haridhamId);
        if (filters?.fromDate) params.append("fromDate", filters.fromDate);
        if (filters?.toDate) params.append("toDate", filters.toDate);
        if (filters?.page) params.append("page", String(filters.page));
        if (filters?.limit) params.append("limit", String(filters.limit));
        if (filters?.sortBy) params.append("sortBy", filters.sortBy);
        if (filters?.sortOrder) params.append("sortOrder", filters.sortOrder);

        return {
          url: "/api/cashflow/admin/cash-on-hand",
          method: "GET",
          params,
        };
      },
      providesTags: ["Cashflow"],
    }),

    acceptCashByPradesh: builder.mutation<
      {
        success: boolean;
        message: string;
        cashflow: CashflowItem;
        receiptDownloadUrl?: string | null;
      },
      number
    >({
      query: (transactionId) => ({
        url: `/api/cashflow/pradesh/${transactionId}/accept`,
        method: "PATCH",
      }),
      invalidatesTags: ["Cashflow", "Registration"],
    }),

    acceptBulkCashByPradesh: builder.mutation<BulkCashAcceptResponse, { transactionIds: number[] }>({
      query: (payload) => ({
        url: "/api/cashflow/pradesh/accept-bulk",
        method: "PATCH",
        body: payload,
      }),
      invalidatesTags: ["Cashflow", "Registration"],
    }),

    createPradeshCashflowBunch: builder.mutation<
      { success: boolean; message: string },
      { transactionIds: number[] }
    >({
      query: (payload) => ({
        url: "/api/cashflow/pradesh/bunches",
        method: "POST",
        body: payload,
      }),
      invalidatesTags: ["Cashflow", "Registration"],
    }),

    getPradeshCashflowBunches: builder.query<CashflowBunchListResponse, {
      status?: "requested" | "submitted";
      methodType?: "ALL" | "CASH" | "CHEQUE";
      fromDate?: string;
      toDate?: string;
      page?: number;
      limit?: number;
      sortBy?: string;
      sortOrder?: "asc" | "desc";
    } | void>({
      query: (filters) => {
        const params = new URLSearchParams();
        if (filters?.status) params.append("status", filters.status);
        if (filters?.methodType) params.append("methodType", filters.methodType);
        if (filters?.fromDate) params.append("fromDate", filters.fromDate);
        if (filters?.toDate) params.append("toDate", filters.toDate);
        if (filters?.page) params.append("page", String(filters.page));
        if (filters?.limit) params.append("limit", String(filters.limit));
        if (filters?.sortBy) params.append("sortBy", filters.sortBy);
        if (filters?.sortOrder) params.append("sortOrder", filters.sortOrder);

        return {
          url: "/api/cashflow/pradesh/bunches",
          method: "GET",
          params,
        };
      },
      providesTags: ["Cashflow"],
    }),

    getPradeshCashflowBunchById: builder.query<CashflowBunchDetailResponse, number>({
      query: (bunchId) => ({
        url: `/api/cashflow/pradesh/bunches/${bunchId}`,
        method: "GET",
      }),
      providesTags: ["Cashflow"],
    }),

    getSuperAdminCashflowBunches: builder.query<CashflowBunchListResponse, {
      status?: "requested" | "submitted";
      methodType?: "ALL" | "CASH" | "CHEQUE";
      pradeshId?: number;
      mandalId?: number;
      fromDate?: string;
      toDate?: string;
      page?: number;
      limit?: number;
      sortBy?: string;
      sortOrder?: "asc" | "desc";
    } | void>({
      query: (filters) => {
        const params = new URLSearchParams();
        if (filters?.status) params.append("status", filters.status);
        if (filters?.methodType) params.append("methodType", filters.methodType);
        if (filters?.pradeshId) params.append("pradeshId", String(filters.pradeshId));
        if (filters?.mandalId) params.append("mandalId", String(filters.mandalId));
        if (filters?.fromDate) params.append("fromDate", filters.fromDate);
        if (filters?.toDate) params.append("toDate", filters.toDate);
        if (filters?.page) params.append("page", String(filters.page));
        if (filters?.limit) params.append("limit", String(filters.limit));
        if (filters?.sortBy) params.append("sortBy", filters.sortBy);
        if (filters?.sortOrder) params.append("sortOrder", filters.sortOrder);

        return {
          url: "/api/cashflow/super-admin/bunches",
          method: "GET",
          params,
        };
      },
      providesTags: ["Cashflow"],
    }),

    getSuperAdminCashflowBunchById: builder.query<CashflowBunchDetailResponse, number>({
      query: (bunchId) => ({
        url: `/api/cashflow/super-admin/bunches/${bunchId}`,
        method: "GET",
      }),
      providesTags: ["Cashflow"],
    }),

    acceptCashflowBunchBySuperAdmin: builder.mutation<
      { success: boolean; message: string },
      number
    >({
      query: (bunchId) => ({
        url: `/api/cashflow/super-admin/bunches/${bunchId}/accept`,
        method: "PATCH",
      }),
      invalidatesTags: ["Cashflow", "Registration"],
    }),

    getCashflowTimeline: builder.query<CashflowTimelineResponse, number>({
      query: (transactionId) => ({
        url: `/api/cashflow/${transactionId}/timeline`,
        method: "GET",
      }),
      providesTags: ["Cashflow"],
    }),

    getCashflowReceipt: builder.query<CashflowReceiptResponse, number>({
      query: (transactionId) => ({
        url: `/api/cashflow/${transactionId}/receipt`,
        method: "GET",
      }),
      providesTags: ["Cashflow"],
    }),
  }),
});

export const {
  useCreateCashflowRequestMutation,
  useReuploadChequeDocumentsByPersonalMutation,
  useGetKaryakartaRequestedCashflowsQuery,
  useGetKaryakartaAcceptedCashflowsQuery,
  useAcceptCashByKaryakartaMutation,
  useAcceptBulkCashByKaryakartaMutation,
  useDeleteCashByKaryakartaMutation,
  useGetPradeshRequestedCashflowsQuery,
  useGetPradeshAcceptedCashflowsQuery,
  useGetCashOnHandDashboardQuery,
  useAcceptCashByPradeshMutation,
  useAcceptBulkCashByPradeshMutation,
  useGetCashflowTimelineQuery,
  useLazyGetCashflowTimelineQuery,
  useGetCashflowReceiptQuery,
  useLazyGetCashflowReceiptQuery,
  useCreatePradeshCashflowBunchMutation,
  useGetPradeshCashflowBunchesQuery,
  useLazyGetPradeshCashflowBunchByIdQuery,
  useGetSuperAdminCashflowBunchesQuery,
  useLazyGetSuperAdminCashflowBunchByIdQuery,
  useAcceptCashflowBunchBySuperAdminMutation,
} = cashflowApi;
