import { Repository, DeepPartial, DataSource } from 'typeorm';
import { User, LoginSource, UserRole, UserStatus, InterestArea } from './entities/user.entity';
import { UpdateUserDto } from '../admin/dto/update-user.dto';
import { CreateUserDto } from './dto/create-user.dto';
type CachedAuthUser = {
    id: string;
    status: UserStatus;
    locked_at: Date | null;
    role: UserRole;
    password_changed_at: Date | null;
};
export type InterestAreaStat = {
    area: InterestArea;
    total: number;
};
export type InterestAreaStatsResult = {
    total_users_with_areas: number;
    areas: InterestAreaStat[];
    other_responses: string[];
};
export declare class UsersService {
    private readonly usersRepository;
    private readonly dataSource;
    private readonly authCache;
    constructor(usersRepository: Repository<User>, dataSource: DataSource);
    findByIdForAuth(id: string): Promise<CachedAuthUser | null>;
    invalidateAuthCache(id: string): void;
    create(createUserDto: CreateUserDto, role?: UserRole): Promise<User>;
    findByEmail(email: string): Promise<User | null>;
    findById(id: string): Promise<User | null>;
    findByOrderNumber(orderNumber: string): Promise<User | null>;
    setUnsubscribed(userId: string): Promise<void>;
    getOnboardingStatus(userId: string): Promise<{
        has_seen_onboarding: boolean;
    }>;
    markOnboardingSeen(userId: string): Promise<void>;
    findAll(status?: UserStatus, skip?: number, take?: number): Promise<{
        data: User[];
        total: number;
    }>;
    findAllSubscribed(): Promise<User[]>;
    findAdmins(): Promise<User[]>;
    countSubscribed(): Promise<number>;
    findAllForExport(status?: UserStatus): Promise<User[]>;
    update(id: string, dto: UpdateUserDto): Promise<User>;
    normalizeProfessionalFields<T extends DeepPartial<User>>(payload: T): T;
    normalizeInterestAreasFields<T extends DeepPartial<User>>(payload: T): T;
    getInterestAreaStats(status?: UserStatus): Promise<InterestAreaStatsResult>;
    getInterestAreaOtherResponsesForExport(status?: UserStatus): Promise<string[]>;
    ensureClinicalFieldsForNonMenarini(user: User): void;
    remove(id: string): Promise<void>;
    updateStatus(id: string, status: UserStatus): Promise<User>;
    recordLogin(userId: string, source: LoginSource): Promise<void>;
    incrementFailedLoginAttempts(userId: string): Promise<{
        justLocked: boolean;
    }>;
    resetFailedLoginAttempts(userId: string): Promise<void>;
    setPasswordResetToken(userId: string, tokenHash: string, expiresAt: Date): Promise<void>;
    findByValidPasswordResetTokenHash(tokenHash: string): Promise<User | null>;
    resetPassword(userId: string, passwordHash: string): Promise<void>;
}
export {};
