import { BetterAuthOptions, betterAuth, Auth } from 'better-auth';
import { getSession } from 'better-auth/api';
import * as _nestjs_common from '@nestjs/common';
import { NestModule, DynamicModule, MiddlewareConsumer, CanActivate, ExecutionContext, createParamDecorator } from '@nestjs/common';
import { Reflector } from '@nestjs/core';

type UserSession<T extends BetterAuthOptions = BetterAuthOptions> = NonNullable<Awaited<ReturnType<ReturnType<typeof getSession<T>>>>>;
type User<T extends BetterAuthOptions = BetterAuthOptions> = UserSession<T>["user"];
type RoutingProvider = "express" | "fastify";
interface AuthModuleOptions {
    betterAuth: ReturnType<typeof betterAuth>;
    options?: {
        routingProvider?: RoutingProvider;
        jsonParser?: boolean;
    };
}

declare const BETTER_AUTH_INSTANCE_TOKEN: unique symbol;
declare const AUTH_MODULE_OPTIONS_TOKEN: unique symbol;
declare const IS_PUBLIC_KEY: unique symbol;

declare const ConfigurableModuleClass: _nestjs_common.ConfigurableModuleCls<AuthModuleOptions, "register", "create", {}>;
declare const OPTIONS_TYPE: AuthModuleOptions & Partial<{}>;
declare const ASYNC_OPTIONS_TYPE: _nestjs_common.ConfigurableModuleAsyncOptions<AuthModuleOptions, "create"> & Partial<{}>;

declare class AuthModule extends ConfigurableModuleClass implements NestModule {
    private readonly auth;
    private readonly options;
    private readonly logger;
    static forRoot(options: typeof OPTIONS_TYPE): DynamicModule;
    static forRootAsync(options: typeof ASYNC_OPTIONS_TYPE): DynamicModule;
    constructor(auth: Auth, options: AuthModuleOptions["options"]);
    configure(consumer: MiddlewareConsumer): void;
}

declare class AuthGuard implements CanActivate {
    private readonly reflector;
    private readonly auth;
    constructor(reflector: Reflector, auth: Auth);
    canActivate(context: ExecutionContext): Promise<boolean>;
}

declare const Session: ReturnType<typeof createParamDecorator>;

declare const IsPublic: () => _nestjs_common.CustomDecorator<typeof IS_PUBLIC_KEY>;

declare const CurrentUser: ReturnType<typeof createParamDecorator>;

export { AUTH_MODULE_OPTIONS_TOKEN, AuthGuard, AuthModule, type AuthModuleOptions, BETTER_AUTH_INSTANCE_TOKEN, CurrentUser, IS_PUBLIC_KEY, IsPublic, type RoutingProvider, Session, type User, type UserSession };
