import type { User } from '@/types/auth' import { apiClient } from '../client' export interface Plan { id: number code: string name: string description?: string credits: number max_credits: number created_at: string updated_at: string } export interface UserUpdate { name?: string plan_id?: number credits?: number is_active?: boolean role?: 'user' | 'admin' } export interface MessageResponse { message: string } export interface GetUsersParams { page?: number limit?: number search?: string sort_by?: string sort_order?: string status_filter?: string } export interface GetUsersResponse { users: User[] total: number page: number limit: number total_pages: number } export interface ScanResults { added: number updated: number deleted: number skipped: number duplicates: number errors: string[] files_added: string[] files_updated: string[] files_deleted: string[] files_skipped: string[] } export interface NormalizationResults { processed: number normalized: number skipped: number errors: number error_details: string[] } export interface ScanResponse { message: string results: ScanResults } export interface NormalizationResponse { message: string results: NormalizationResults } export class AdminService { async listUsers(params?: GetUsersParams): Promise { const searchParams = new URLSearchParams() if (params?.page) { searchParams.append('page', params.page.toString()) } if (params?.limit) { searchParams.append('limit', params.limit.toString()) } if (params?.search) { searchParams.append('search', params.search) } if (params?.sort_by) { searchParams.append('sort_by', params.sort_by) } if (params?.sort_order) { searchParams.append('sort_order', params.sort_order) } if (params?.status_filter) { searchParams.append('status_filter', params.status_filter) } const url = searchParams.toString() ? `/api/v1/admin/users/?${searchParams.toString()}` : '/api/v1/admin/users/' return apiClient.get(url) } async getUser(userId: number): Promise { return apiClient.get(`/api/v1/admin/users/${userId}`) } async updateUser(userId: number, data: UserUpdate): Promise { return apiClient.patch(`/api/v1/admin/users/${userId}`, data) } async disableUser(userId: number): Promise { return apiClient.post( `/api/v1/admin/users/${userId}/disable`, ) } async enableUser(userId: number): Promise { return apiClient.post( `/api/v1/admin/users/${userId}/enable`, ) } async listPlans(): Promise { return apiClient.get(`/api/v1/admin/users/plans/list`) } // Sound Management async scanSounds(): Promise { return apiClient.post(`/api/v1/admin/sounds/scan`) } async normalizeAllSounds( force = false, onePass?: boolean, ): Promise { const params = new URLSearchParams() if (force) params.append('force', 'true') if (onePass !== undefined) params.append('one_pass', onePass.toString()) const queryString = params.toString() const url = queryString ? `/api/v1/admin/sounds/normalize/all?${queryString}` : `/api/v1/admin/sounds/normalize/all` return apiClient.post(url) } async normalizeSoundsByType( soundType: 'SDB' | 'TTS' | 'EXT', force = false, onePass?: boolean, ): Promise { const params = new URLSearchParams() if (force) params.append('force', 'true') if (onePass !== undefined) params.append('one_pass', onePass.toString()) const queryString = params.toString() const url = queryString ? `/api/v1/admin/sounds/normalize/type/${soundType}?${queryString}` : `/api/v1/admin/sounds/normalize/type/${soundType}` return apiClient.post(url) } } export const adminService = new AdminService()