import { useQuery } from '@tanstack/react-query';

import { useStores } from '@/app/(root)/AppProviders';
import { useApiClient } from '@/lib/apiClient';

// Cache duration for usage plan descriptions (5 minutes)
const USAGE_PLAN_DESCRIPTIONS_STALE_TIME = 5 * 60 * 1000;

export function useUsagePlans() {
  const { session } = useStores();

  return useQuery({
    queryKey: ['usagePlans'],
    refetchOnMount: false,
    refetchOnWindowFocus: false,
    queryFn: async () => {
      const response = await session.apiClient.GET('/api/billing/usage-plans');

      if (response.error) {
        throw new Error((response as any).error);
      }

      return response.data?.plans;
    },
  });
}

export function useUsagePlanDescriptionsResponse() {
  const { session } = useStores();

  return useQuery({
    queryKey: ['usagePlanDescriptionsResponse'],
    staleTime: USAGE_PLAN_DESCRIPTIONS_STALE_TIME,
    gcTime: USAGE_PLAN_DESCRIPTIONS_STALE_TIME,
    refetchOnMount: false,
    refetchOnWindowFocus: false,
    queryFn: async () => {
      const response = await session.apiClient.GET(
        '/api/billing/usage-plan-descriptions/'
      );

      if (response.error) {
        throw new Error((response as any).error);
      }

      return response.data;
    },
  });
}

export function useUsagePlanTableComparison() {
  const { session } = useStores();

  return useQuery({
    queryKey: ['usagePlanTableComparison'],
    queryFn: async () => {
      const response = await session.apiClient.GET(
        '/api/billing/usage-plan-web-table-comparison/'
      );

      if (response.error) {
        throw new Error((response as any).error);
      }

      return response.data?.usage_plan_web_table_comparison;
    },
  });
}

export function useUsagePlanFaq() {
  const { session } = useStores();

  return useQuery({
    queryKey: ['usagePlanFaq'],
    queryFn: async () => {
      const response = await session.apiClient.GET(
        '/api/billing/usage-plan-faq/'
      );

      if (response.error) {
        throw new Error((response as any).error);
      }

      return response.data?.faq;
    },
  });
}

export function useDefaultCurrency() {
  const apiClient = useApiClient();

  return useQuery({
    queryKey: ['defaultCurrency'],
    refetchOnMount: false,
    refetchOnWindowFocus: false,
    queryFn: async () => {
      const response = await apiClient.GET('/api/billing/default-currency');

      if (response.error) {
        throw new Error((response as any).error);
      }

      return response.data?.currency;
    },
  });
}
