import type { User, UsersPage } from '@admin/types/auth' import { compareUserSortValues } from '@admin/utils/user/compare-user-sort-values' import { getUserSortValue } from '@admin/utils/user/get-user-sort-value' import { normalizeUserFilterValue } from '@admin/utils/user/normalize-user-filter-value' interface GetUsersPageOptions { pageIndex: number pageSize: number role?: string search?: string sortDir?: 'asc' | 'desc' sortField?: string status?: string } const USER_SORT_FIELDS = new Set(['createdAt', 'email', 'emailVerified', 'role']) export function getUsersPage(users: User[], options: GetUsersPageOptions): UsersPage { const search = normalizeUserFilterValue(options.search) const role = normalizeUserFilterValue(options.role) const status = normalizeUserFilterValue(options.status) const sortField = options.sortField && USER_SORT_FIELDS.has(options.sortField) ? options.sortField : '' const sortDirection = options.sortDir === 'desc' ? -1 : 1 const filteredUsers = users.filter((user) => { const matchesSearch = !search || user.email.toLowerCase().includes(search) || user.name.toLowerCase().includes(search) const matchesRole = !role || user.role.toLowerCase() === role const matchesStatus = !status || (status === 'verified' && user.emailVerified) || (status === 'unverified' && !user.emailVerified) return matchesSearch && matchesRole && matchesStatus }) if (sortField) { filteredUsers.sort((a, b) => { const comparison = compareUserSortValues( getUserSortValue(a, sortField), getUserSortValue(b, sortField) ) return comparison * sortDirection }) } const total = filteredUsers.length const pageSize = options.pageSize === -1 ? total : Math.max(options.pageSize, 1) const start = Math.max(options.pageIndex, 0) * pageSize const pageUsers = pageSize > 0 ? filteredUsers.slice(start, start + pageSize) : filteredUsers return { users: pageUsers, total } }