import { PaginatedResponseDto } from 'common/utils/paginated-response.dto';
import { CreateAdminDto } from '../dto/create-admin.dto';
import { UpdateUserDto } from '../dto/update-user.dto';
import { UserFilterDto } from '../dto/user-filter.dto';
import { UserResponseDto } from '../dto/user-response.dto';
import { UserEntity } from '../entity/users.entity';

export abstract class BaseUserAbstract {
  abstract createAdmin(user: CreateAdminDto): Promise<UserResponseDto>;
  abstract findAllUsers(page?: number, limit?: number): Promise<PaginatedResponseDto<UserResponseDto>>;
  abstract findUserById(userId: number): Promise<UserResponseDto>;
  // NOTE: This method is for internal use only, it returns the UserEntity directly
  abstract findUserByUserIdWithEntity(userId: number): Promise<UserEntity>;
  abstract findUserByEmail(email: string): Promise<UserResponseDto>;
  abstract countUsers(): Promise<number>;
  abstract updateUser(userId: number, userData: UpdateUserDto): Promise<UserResponseDto>;
  abstract deleteUser(userId: number): Promise<void>;
  abstract findUsersByFilter(filter: UserFilterDto, page: number, limit: number): Promise<PaginatedResponseDto<UserResponseDto>>;
  abstract findUserByRole(role: string, page: number, limit: number): Promise<PaginatedResponseDto<UserResponseDto>>;
  abstract findUserByClientId(clientId: string, page: number, limit: number): Promise<PaginatedResponseDto<UserResponseDto>>;
  abstract findUserByStatus(status: string, page: number, limit: number): Promise<PaginatedResponseDto<UserResponseDto>>;
  abstract getUsersLinkedToClient(clientId: string, page: number, limit: number): Promise<PaginatedResponseDto<UserResponseDto>>;
  abstract getUserCountByRole(role: string): Promise<number>;
  // abstract changeUserPassword(userId: number, oldPassword: string, newPassword: string): Promise<void>;
}
