import nodemailer from 'nodemailer';
export type EmailType = 'magicLink' | 'otp' | 'passwordReset' | 'twoFactor' | 'custom';
export interface EmailOptions {
    to: string;
    subject: string;
    type: EmailType;
    otp?: string;
    theme?: string;
    url?: string;
    customContent?: string;
}
export type EmailProviderType = 'resend' | 'aws-ses' | 'nodemailer' | 'smtp' | 'mailgun' | 'sendgrid';
interface BaseEmailProviderConfig {
    type: EmailProviderType;
    from?: string;
}
export interface ResendProviderConfig extends BaseEmailProviderConfig {
    type: 'resend';
    apiKey: string;
}
export interface AWSSESProviderConfig extends BaseEmailProviderConfig {
    type: 'aws-ses';
    accessKeyId: string;
    secretAccessKey: string;
    region?: string;
}
export interface SimpleSmtpConfig extends BaseEmailProviderConfig {
    type: 'smtp';
    host: string;
    port: number;
    auth: {
        user: string;
        pass: string;
    };
    secure?: boolean;
}
export interface AdvancedNodemailerConfig extends BaseEmailProviderConfig {
    type: 'nodemailer';
    transport: nodemailer.TransportOptions;
}
export interface MailgunProviderConfig extends BaseEmailProviderConfig {
    type: 'mailgun';
    apiKey: string;
    domain: string;
}
export interface SendgridProviderConfig extends BaseEmailProviderConfig {
    type: 'sendgrid';
    apiKey: string;
}
export type EmailProviderConfig = ResendProviderConfig | AWSSESProviderConfig | SimpleSmtpConfig | NodemailerServiceConfig | AdvancedNodemailerConfig | MailgunProviderConfig | SendgridProviderConfig;
export interface EmailProvider {
    send(options: EmailOptions): Promise<void>;
}
export type EmailProviderFactory = (config: EmailProviderConfig) => EmailProvider;
export type ConfigForProviderType<T extends EmailProviderType> = Extract<EmailProviderConfig, {
    type: T;
}>;
export declare const ALL_SERVICES: readonly ["gmail", "outlook", "yahoo", "zoho", "office365", "aol", "protonmail"];
type ServicesTuple = typeof ALL_SERVICES;
type EmailService = ServicesTuple[number];
export interface SmtpServerConfig {
    host: string;
    port: number;
    secure: boolean;
}
export declare const EMAIL_SERVICE_CONFIGS: Record<EmailService, SmtpServerConfig>;
export type AuthMethod = 'password' | 'app-password' | 'oauth2';
interface BaseAuthConfig {
    method: AuthMethod;
}
export interface PasswordAuthConfig extends BaseAuthConfig {
    method: 'password';
    user: string;
    pass: string;
}
export interface AppPasswordAuthConfig extends BaseAuthConfig {
    method: 'app-password';
    user: string;
    appPass: string;
}
export interface OAuth2AuthConfig extends BaseAuthConfig {
    method: 'oauth2';
    user: string;
    clientId: string;
    clientSecret: string;
    refreshToken: string;
    accessToken?: string;
    expires?: number;
}
export type EmailAuthConfig = PasswordAuthConfig | AppPasswordAuthConfig | OAuth2AuthConfig;
export interface NodemailerServiceConfig extends BaseEmailProviderConfig {
    type: 'nodemailer';
    service: EmailService;
    auth: EmailAuthConfig;
    smtp?: Partial<SmtpServerConfig>;
    options?: {
        pool?: boolean;
        maxConnections?: number;
        maxMessages?: number;
        rateDelta?: number;
        rateLimit?: number;
    };
}
export {};
