import { PrismaService } from '../prisma/prisma.service';
import { users as UserModel, Prisma } from '@prisma/client';
import { CreateUserDto } from './dto/create-user.dto';
import { AuthService } from '../auth/auth.service';
import { RolesService, Role } from '../roles/roles.service';
import { EmailService } from 'src/email/email.service';
import Sqids from 'sqids';
export type User = {
    user_id: number;
    email: string;
    firstname: string | null;
    lastname: string | null;
    suspended: number;
    suspended_date: Date | null;
    suspended_by: number | null;
    created_date: Date;
    created_by: number | User;
    last_logon_date: Date | null;
    user_class_id: number;
    username: string;
    updated_by: number | User;
    updated_date: Date;
    title: string | null;
    tell: string | null;
    status: number;
    roles?: Role[];
};
export interface UserWithTokens extends User {
    access_token?: string | null;
    refresh_token?: string | null;
}
export type UserFull = UserModel;
export type UserCreate = Prisma.usersCreateInput;
export type UserUpdate = Prisma.usersUpdateInput;
export declare enum EUserClass {
    IPWStaff = 1,
    IPWMember = 2
}
export declare class UsersService {
    private prisma;
    private authService;
    private rolesService;
    private emailService;
    constructor(prisma: PrismaService, authService: AuthService, rolesService: RolesService, emailService: EmailService);
    ipwGroupID: number;
    unsafeFindById(user_id: number): Promise<UserFull | null>;
    unsafeFindByUsernameOrEmailString(username: string): Promise<UserFull | null>;
    getRefreshToken(user_id: number): Promise<string | null>;
    censorCredentialsOne(user: UserFull | null): User | null;
    censorCredentialsMany(users: UserFull[]): User[];
    findById(user_id: number): Promise<User | null>;
    findByIds(user_ids: number[]): Promise<User[]>;
    findByIdWithRoles(user_id: number): Promise<User | null>;
    findByUsername(username: string): Promise<User | null>;
    findByEmail(email: string): Promise<User | null>;
    findAll(params?: Prisma.usersFindManyArgs): Promise<User[]>;
    groupsAndRoles(user_id: number): Promise<any>;
    roleIdForGroups(users_has_group_ids: bigint[]): Promise<any>;
    availableGroups(user_id: number): Promise<any>;
    joinGroup(user_group_id: number, user_id: number, added_by_user_id: number): Promise<number>;
    groupIsExists(user_id: number, user_group_id: number): Promise<boolean>;
    pendingGroups(user_id: number): Promise<any>;
    cancelPendingGroup(users_has_group_pending_id: number): Promise<void>;
    create(createdByUserId: number, payload: CreateUserDto, ipwMember?: boolean): Promise<User | null>;
    update(user_id: number, data: Prisma.usersUpdateInput): Promise<User | null>;
    remove(user_id: number): Promise<User>;
    generateConfirmationLink(type: string, user_id: number): Promise<{
        link: string;
        token: string;
    }>;
    randomHash(): string;
    createHashidsInstance(): Sqids;
    encodeId(user_id: number | bigint): string;
    decodeId(hash: string): bigint;
    generateRegistrationToken(user_id: number): Promise<string>;
    registrationTokenExists(user_id: number, registration_token: string): Promise<boolean>;
    generateResetToken(user_id: number): Promise<string>;
    resetTokenExists(user_id: number, reset_token: string): Promise<boolean>;
    findUserHasGroupId(user_id: number, user_group_id: number): Promise<number | null>;
    getAvailableProfiles(user_id: number): Promise<{
        user_group_id: number;
        user_group_name: string;
        bis_id: number;
        status_desc: string;
        status: number;
    }[]>;
    usernameExists(username: string): Promise<boolean>;
}
