'use client';

import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import { api } from '@/lib/api';
import type {
  ListAdminPayoutsInput,
  ListLedgerInput,
  PostAdjustmentInput,
  RetryPayoutInput,
  VoidPayoutInput,
} from '@alqove/api-client';

export const ADMIN_FINANCIALS_KEYS = {
  balances: () => ['admin-financials', 'balances'] as const,
  payouts: (params: ListAdminPayoutsInput) =>
    [
      'admin-financials',
      'payouts',
      params.state ?? 'all',
      params.page ?? 1,
      params.per_page ?? 20,
    ] as const,
  storeLedger: (storeId: string, params: ListLedgerInput) =>
    [
      'admin-financials',
      'ledger',
      storeId,
      params.from ?? '',
      params.to ?? '',
      params.page ?? 1,
      params.per_page ?? 20,
    ] as const,
  storeLedgerAll: (storeId: string) =>
    ['admin-financials', 'ledger', storeId] as const,
};

export function useAdminFinancialsBalances() {
  return useQuery({
    queryKey: ADMIN_FINANCIALS_KEYS.balances(),
    queryFn: () => api.admin.financials.balances(),
    staleTime: 30_000,
  });
}

export function useAdminPayouts(params: ListAdminPayoutsInput = {}) {
  return useQuery({
    queryKey: ADMIN_FINANCIALS_KEYS.payouts(params),
    queryFn: () => api.admin.financials.listPayouts(params),
    staleTime: 30_000,
  });
}

export function useAdminStoreLedger(
  storeId: string | null | undefined,
  params: ListLedgerInput = {},
) {
  return useQuery({
    queryKey: storeId
      ? ADMIN_FINANCIALS_KEYS.storeLedger(storeId, params)
      : ['admin-financials', 'ledger', 'none'],
    queryFn: () => api.admin.financials.storeLedger(storeId!, params),
    enabled: Boolean(storeId),
    staleTime: 30_000,
  });
}

export function useAdminRetryPayout() {
  const qc = useQueryClient();
  return useMutation({
    mutationFn: ({
      payoutId,
      body,
    }: {
      payoutId: string;
      body: RetryPayoutInput;
    }) => api.admin.financials.retryPayout(payoutId, body),
    onSuccess: () => {
      qc.invalidateQueries({ queryKey: ['admin-financials', 'payouts'] });
      qc.invalidateQueries({ queryKey: ['admin-financials', 'balances'] });
    },
  });
}

export function useAdminVoidPayout() {
  const qc = useQueryClient();
  return useMutation({
    mutationFn: ({
      payoutId,
      body,
    }: {
      payoutId: string;
      body: VoidPayoutInput;
    }) => api.admin.financials.voidPayout(payoutId, body),
    onSuccess: () => {
      qc.invalidateQueries({ queryKey: ['admin-financials', 'payouts'] });
      qc.invalidateQueries({ queryKey: ['admin-financials', 'balances'] });
    },
  });
}

export function useAdminPostAdjustment(storeId: string) {
  const qc = useQueryClient();
  return useMutation({
    mutationFn: (body: PostAdjustmentInput) =>
      api.admin.financials.postAdjustment(storeId, body),
    onSuccess: () => {
      qc.invalidateQueries({
        queryKey: ADMIN_FINANCIALS_KEYS.storeLedgerAll(storeId),
      });
      qc.invalidateQueries({ queryKey: ADMIN_FINANCIALS_KEYS.balances() });
    },
  });
}
