import { inject, Injectable } from '@angular/core'; import { CoachAvailability, CoachDetailData, CoachSummary, OperationsDashboardData, OperationsPage, OperationsUser, OperationsUserDetail, PayRate, PayrollDetail, PayrollSummary, ScheduleCalendarData } from './admin.models'; import { CloudFunctionsService } from './cloud-functions.service'; export type OperationsListKind = 'relations' | 'course-bindings' | 'appointments' | 'lessons' | 'learning-records' | 'finance' | 'money-logs'; @Injectable({ providedIn: 'root' }) export class OperationsService { private readonly functions = inject(CloudFunctionsService); dashboard(): Promise { return this.functions.operations('ops/dashboard/summary'); } request(operation: string, params: Record = {}): Promise { return this.functions.operations(operation, params); } users(page: number, pageSize: number, search: string, filters: Record = {}, refresh = false): Promise> { return this.functions.operations>('ops/users/list', { page, pageSize, search, filters, refresh }); } userDetail(objectId: string): Promise { return this.functions.operations('ops/users/detail', { objectId }); } coaches(page: number, pageSize: number, search = '', filters: Record = {}): Promise> { return this.functions.operations>('ops/coaches/list', { page, pageSize, search, filters }); } coachDetail(objectId: string): Promise { return this.functions.operations('ops/coaches/detail', { objectId }); } schedule(dateFrom: string, dateTo: string, coachId = 0): Promise { return this.functions.operations('ops/schedule/calendar', { dateFrom, dateTo, filters: { coachId } }); } availability(coachId: number): Promise> { return this.functions.operations>('ops/coach-availability/list', { page: 1, pageSize: 100, filters: { coachId } }); } payRates(): Promise> { return this.functions.operations>('ops/pay-rates/list', { page: 1, pageSize: 100 }); } payrolls(page = 1, pageSize = 20): Promise> { return this.functions.operations>('ops/payroll/list', { page, pageSize }); } payrollPreview(month: string): Promise { return this.functions.operations('ops/payroll/preview', { month }); } payrollDetail(targetId: string): Promise { return this.functions.operations('ops/payroll/detail', { targetId }); } list(kind: OperationsListKind, page: number, pageSize: number, search: string, filters: Record = {}): Promise { const operation = kind === 'relations' ? 'ops/relations/list' : kind === 'course-bindings' ? 'ops/course-bindings/list' : kind === 'appointments' ? 'ops/appointments/list' : kind === 'lessons' ? 'ops/lessons/list' : kind === 'learning-records' ? 'ops/learning-records/list' : kind === 'finance' ? 'ops/finance/list' : 'ops/money-logs/list'; return this.functions.operations(operation, { page, pageSize, search, filters }); } mutate(operation: string, targetId: string, reason: string, payload: Record = {}, expectedUpdatedAt = '', idempotencyKey = ''): Promise { return this.functions.operations(operation, { targetId, reason, payload, expectedUpdatedAt, idempotencyKey: idempotencyKey || crypto.randomUUID() }); } }