'use client';
import { FunctionReference } from "convex/server";

//#region src/ratelimit/types.d.ts
type RatelimitSnapshot = {
  value: number;
  ts: number;
  shard: number;
  config: ResolvedAlgorithm;
};
type FixedWindowAlgorithm = {
  kind: 'fixedWindow';
  limit: number;
  window: number;
  capacity: number;
  start?: number;
  maxReserved?: number;
  shards: number;
};
type SlidingWindowAlgorithm = {
  kind: 'slidingWindow';
  limit: number;
  window: number;
  maxReserved?: number;
  shards: number;
};
type TokenBucketAlgorithm = {
  kind: 'tokenBucket';
  refillRate: number;
  interval: number;
  maxTokens: number;
  maxReserved?: number;
  shards: number;
};
type ResolvedAlgorithm = FixedWindowAlgorithm | SlidingWindowAlgorithm | TokenBucketAlgorithm;
type HookCheckValue = {
  value: number;
  ts: number;
  config: ResolvedAlgorithm;
  shard: number;
  ok: boolean;
  retryAt?: number;
};
//#endregion
//#region src/ratelimit/react/use-rate-limit.d.ts
type GetRatelimitValueQueryRef = FunctionReference<'query', 'public', {
  identifier?: string;
  sampleShards?: number;
}, RatelimitSnapshot>;
type GetServerTimeMutationRef = FunctionReference<'mutation', 'public', Record<string, never>, number>;
type GetRatelimitValueQuery = GetRatelimitValueQueryRef | string;
type GetServerTimeMutation = GetServerTimeMutationRef | string;
type UseRatelimitOptions = {
  identifier?: string;
  count?: number;
  sampleShards?: number;
  getServerTimeMutation?: GetServerTimeMutation;
};
declare function useRatelimit(getRatelimitValueQuery: GetRatelimitValueQuery, options?: UseRatelimitOptions): {
  status: undefined;
  check: (ts?: number, requestedCount?: number) => HookCheckValue | undefined;
} | {
  status: {
    ok: false;
    retryAt: number;
  };
  check: (ts?: number, requestedCount?: number) => HookCheckValue | undefined;
} | {
  status: {
    ok: true;
    retryAt: undefined;
  };
  check: (ts?: number, requestedCount?: number) => HookCheckValue | undefined;
};
//#endregion
export { GetRatelimitValueQuery, GetRatelimitValueQueryRef, GetServerTimeMutation, GetServerTimeMutationRef, UseRatelimitOptions, useRatelimit };