import type { AdminAuditEntriesResponse, AdminAuditQueryOptions, AdminDashboardResponse, AdminOptionalFeatureSettingsResponse, AdminOperationalSettingsResponse, AdminNominationLinkBlacklistResponse, AdminRiskFlagsResponse, AdminRiskQueryOptions, AdminRiskRulesResponse, AdminSeasonDetailResponse, AdminSeasonListItem, AdminShowactApplicationItem, AdminSiteSettingsResponse, AdminSponsorItem, AdminTeamResponse, AdminTrackingRulesResponse, AdminWorkflowRulesResponse, ApproveNominationPayload, AddNominationLinkBlacklistEntryPayload, BulkResolveRiskFlagsPayload, CreateTeamMemberPayload, CreateSeasonPayload, ReopenRejectedNominationPayload, RejectNominationPayload, ResolveRiskFlagPayload, SetAwardResultPayload, UpdateNominationTrackingReviewPayload, UpdateSeasonSubcategoryTemplatesPayload, TeamMemberPasswordResponse, UpdateClipStatusPayload, UpdateOptionalFeatureSettingsPayload, UpdateOperationalSettingsPayload, UpdateRiskRulesPayload, UpdateShowactStatusPayload, UpdateNominationLinkBlacklistPayload, UpdateSeasonPayload, UpdateSiteSettingsPayload, UpdateTrackingReviewNotesPayload, UpdateTrackingRulesPayload, UpdateTrackingSourcePayload, UpdateTeamMemberPayload, UpdateTeamRolesPayload, UpdateWorkflowRulesPayload, UpsertCandidatePayload, UpsertCategoryPayload, UpsertCategoryGroupPayload, UpsertSponsorPayload, } from '../../types/awards' import { requestJson } from '../http' import { jsonRequest } from './requestOptions' function buildAdminAuditEntryParams(options: AdminAuditQueryOptions = {}) { const params = new URLSearchParams({ limit: String(options.limit ?? 100) }) const trimmedQuery = options.query?.trim() const trimmedAdmin = options.admin?.trim() const trimmedAction = options.action?.trim() const trimmedEntityType = options.entityType?.trim() if (trimmedQuery) params.set('query', trimmedQuery) if (trimmedAdmin) params.set('admin', trimmedAdmin) if (trimmedAction) params.set('action', trimmedAction) if (trimmedEntityType) params.set('entityType', trimmedEntityType) if (options.from) params.set('from', options.from) if (options.to) params.set('to', options.to) if (options.cursor) params.set('cursor', options.cursor) return params } export const adminApi = { getAdminDashboard: (seasonId?: number | null) => { const params = new URLSearchParams() if (seasonId) { params.set('seasonId', String(seasonId)) } const query = params.toString() return requestJson(`/api/admin/dashboard${query ? `?${query}` : ''}`) }, getAdminAuditEntriesPage: (options: AdminAuditQueryOptions = {}) => requestJson(`/api/admin/audit-entries?${buildAdminAuditEntryParams(options).toString()}`), getAdminAuditEntries: (limit = 200, query = '') => { const params = buildAdminAuditEntryParams({ limit, query }) return requestJson(`/api/admin/audit-entries?${params.toString()}`) .then((response) => response.items) }, getAdminRiskFlagsPage: (options: AdminRiskQueryOptions = {}) => { const params = new URLSearchParams({ limit: String(options.limit ?? 25), offset: String(options.offset ?? 0), status: options.status ?? 'open', }) if (options.severity) { params.set('severity', options.severity) } const trimmedQuery = options.query?.trim() if (trimmedQuery) { params.set('query', trimmedQuery) } if (options.reviewedOnly) { params.set('reviewedOnly', 'true') } return requestJson(`/api/admin/risk-flags?${params.toString()}`) }, getAdminRiskFlags: (limit = 200, status = 'open', query = '') => adminApi.getAdminRiskFlagsPage({ limit, status, query }).then((response) => response.items), getAdminRiskRules: () => requestJson('/api/admin/risk-rules'), updateAdminRiskRules: (payload: UpdateRiskRulesPayload) => requestJson('/api/admin/risk-rules', jsonRequest('PUT', payload)), getAdminWorkflowRules: (seasonId: number) => requestJson(`/api/admin/seasons/${seasonId}/workflow-rules`), updateAdminWorkflowRules: (seasonId: number, payload: UpdateWorkflowRulesPayload) => requestJson(`/api/admin/seasons/${seasonId}/workflow-rules`, jsonRequest('PUT', payload)), getAdminTrackingRules: () => requestJson('/api/admin/tracking-rules'), updateAdminTrackingRules: (payload: UpdateTrackingRulesPayload) => requestJson('/api/admin/tracking-rules', jsonRequest('PUT', payload)), updateAdminTrackingSource: (payload: UpdateTrackingSourcePayload) => requestJson('/api/admin/tracking-rules/source', jsonRequest('PUT', payload)), updateAdminTrackingReviewNotes: (payload: UpdateTrackingReviewNotesPayload) => requestJson('/api/admin/tracking-rules/notes', jsonRequest('PUT', payload)), getAdminSeasons: () => requestJson('/api/admin/seasons'), getAdminSeasonDetail: (seasonId: number) => requestJson(`/api/admin/seasons/${seasonId}`), getAdminShowactApplications: (seasonId: number) => requestJson(`/api/admin/seasons/${seasonId}/showacts`), updateAdminShowactStatus: (applicationId: number, payload: UpdateShowactStatusPayload) => requestJson<{ saved: boolean; application: AdminShowactApplicationItem }>( `/api/admin/showacts/${applicationId}/status`, jsonRequest('POST', payload), ), deleteAdminShowactApplication: (applicationId: number) => requestJson<{ deleted: boolean; applicationId: number }>(`/api/admin/showacts/${applicationId}`, { method: 'DELETE' }), getAdminSponsors: (seasonId: number) => requestJson(`/api/admin/seasons/${seasonId}/sponsors`), createAdminSponsor: (seasonId: number, payload: UpsertSponsorPayload) => requestJson<{ saved: boolean; sponsor: AdminSponsorItem }>(`/api/admin/seasons/${seasonId}/sponsors`, jsonRequest('POST', payload)), updateAdminSponsor: (sponsorId: number, payload: UpsertSponsorPayload) => requestJson<{ saved: boolean; sponsor: AdminSponsorItem }>(`/api/admin/sponsors/${sponsorId}`, jsonRequest('PUT', payload)), deleteAdminSponsor: (sponsorId: number) => requestJson<{ deleted: boolean; sponsorId: number }>(`/api/admin/sponsors/${sponsorId}`, { method: 'DELETE' }), getAdminSiteSettings: () => requestJson('/api/admin/site-settings'), getAdminOptionalFeatureSettings: () => requestJson('/api/admin/optional-feature-settings'), updateAdminOptionalFeatureSettings: (payload: UpdateOptionalFeatureSettingsPayload) => requestJson('/api/admin/optional-feature-settings', jsonRequest('PUT', payload)), getAdminOperationalSettings: () => requestJson('/api/admin/operational-settings'), getAdminTeam: () => requestJson('/api/admin/team'), createAdminTeamMember: (payload: CreateTeamMemberPayload) => requestJson('/api/admin/team/members', jsonRequest('POST', payload)), updateAdminTeamMember: (memberId: number, payload: UpdateTeamMemberPayload) => requestJson<{ saved: boolean; member: AdminTeamResponse['members'][number] }>( `/api/admin/team/members/${memberId}`, jsonRequest('PUT', payload), ), resetAdminTeamMemberPassword: (memberId: number) => requestJson(`/api/admin/team/members/${memberId}/reset-password`, jsonRequest('POST', {})), deleteAdminTeamMember: (memberId: number) => requestJson<{ deleted: boolean; memberId: number }>(`/api/admin/team/members/${memberId}`, { method: 'DELETE' }), updateAdminTeamRoles: (payload: UpdateTeamRolesPayload) => requestJson<{ saved: boolean; roles: AdminTeamResponse['roles'] }>('/api/admin/team/roles', jsonRequest('PUT', payload)), createAdminSeason: (payload: CreateSeasonPayload) => requestJson<{ saved: boolean; seasonId: number }>('/api/admin/seasons', jsonRequest('POST', payload)), updateAdminSeason: (seasonId: number, payload: UpdateSeasonPayload) => requestJson<{ saved: boolean; seasonId: number }>(`/api/admin/seasons/${seasonId}`, jsonRequest('PUT', payload)), deleteAdminSeason: (seasonId: number) => requestJson<{ deleted: boolean; seasonId: number; year: number }>(`/api/admin/seasons/${seasonId}`, { method: 'DELETE', }), updateAdminSiteSettings: (payload: UpdateSiteSettingsPayload) => requestJson<{ saved: boolean }>('/api/admin/site-settings', jsonRequest('PUT', payload)), updateAdminOperationalSettings: (payload: UpdateOperationalSettingsPayload) => requestJson<{ saved: boolean; demoLoginPasswordSet: boolean; twitchClientSecretSet: boolean }>('/api/admin/operational-settings', jsonRequest('PUT', payload)), createAdminCategory: (seasonId: number, payload: UpsertCategoryPayload) => requestJson<{ saved: boolean; categoryId: number }>(`/api/admin/seasons/${seasonId}/categories`, jsonRequest('POST', payload)), updateAdminCategory: (categoryId: number, payload: UpsertCategoryPayload) => requestJson<{ saved: boolean; categoryId: number }>(`/api/admin/categories/${categoryId}`, jsonRequest('PUT', payload)), deleteAdminCategory: (categoryId: number) => requestJson<{ deleted: boolean; categoryId: number }>(`/api/admin/categories/${categoryId}`, { method: 'DELETE', }), updateAdminSeasonSubcategoryTemplates: (seasonId: number, payload: UpdateSeasonSubcategoryTemplatesPayload) => requestJson<{ saved: boolean; seasonId: number; templateCount: number }>( `/api/admin/seasons/${seasonId}/subcategory-templates`, jsonRequest('PUT', payload), ), createAdminCategoryGroup: (seasonId: number, payload: UpsertCategoryGroupPayload) => requestJson<{ saved: boolean; seasonId: number; groupName: string }>( `/api/admin/seasons/${seasonId}/category-groups`, jsonRequest('POST', payload), ), updateAdminCategoryGroup: (seasonId: number, groupName: string, payload: UpsertCategoryGroupPayload) => requestJson<{ saved: boolean; seasonId: number; groupName: string }>( `/api/admin/seasons/${seasonId}/category-groups/${encodeURIComponent(groupName)}`, jsonRequest('PUT', payload), ), deleteAdminCategoryGroup: (seasonId: number, groupName: string) => requestJson<{ deleted: boolean; seasonId: number; groupName: string }>( `/api/admin/seasons/${seasonId}/category-groups/${encodeURIComponent(groupName)}`, { method: 'DELETE' }, ), createAdminCandidate: (seasonId: number, payload: UpsertCandidatePayload) => requestJson<{ saved: boolean; candidateId: number }>(`/api/admin/seasons/${seasonId}/candidates`, jsonRequest('POST', payload)), updateAdminCandidate: (candidateId: number, payload: UpsertCandidatePayload) => requestJson<{ saved: boolean; candidateId: number }>(`/api/admin/candidates/${candidateId}`, jsonRequest('PUT', payload)), deleteAdminCandidate: (candidateId: number) => requestJson<{ deleted: boolean; candidateId: number }>(`/api/admin/candidates/${candidateId}`, { method: 'DELETE', }), deleteAdminClip: (clipId: number) => requestJson<{ deleted: boolean; clipId: number }>(`/api/admin/clips/${clipId}`, { method: 'DELETE', }), updateAdminClipStatus: (clipId: number, payload: UpdateClipStatusPayload) => requestJson<{ saved: boolean; clipId: number; status: string }>(`/api/admin/clips/${clipId}/status`, jsonRequest('POST', payload)), setAdminResult: (seasonId: number, payload: SetAwardResultPayload) => requestJson<{ saved: boolean; resultId: number; seasonId: number; categoryId: number; candidateId: number }>( `/api/admin/seasons/${seasonId}/results`, jsonRequest('POST', payload), ), deleteAdminResult: (resultId: number) => requestJson<{ deleted: boolean; resultId: number }>(`/api/admin/results/${resultId}`, { method: 'DELETE', }), publishAdminWinners: (seasonId: number) => requestJson<{ saved: boolean; seasonId: number; winnersPublishedAt: string | null; winnersPublishedByTwitchId: string | null }>( `/api/admin/seasons/${seasonId}/winners/publish`, jsonRequest('POST', {}), ), unpublishAdminWinners: (seasonId: number) => requestJson<{ saved: boolean; seasonId: number; winnersPublishedAt: string | null; winnersPublishedByTwitchId: string | null }>( `/api/admin/seasons/${seasonId}/winners/unpublish`, jsonRequest('POST', {}), ), approveAdminNomination: (nominationId: number, payload: ApproveNominationPayload) => requestJson<{ saved: boolean; nominationId: number; candidateId: number; created: boolean }>( `/api/admin/nominations/${nominationId}/approve`, jsonRequest('POST', payload), ), rejectAdminNomination: (nominationId: number, payload: RejectNominationPayload) => requestJson<{ saved: boolean; nominationId: number; rejected: boolean }>( `/api/admin/nominations/${nominationId}/reject`, jsonRequest('POST', payload), ), reopenRejectedAdminNomination: (nominationId: number, payload: ReopenRejectedNominationPayload = {}) => requestJson<{ saved: boolean; nominationId: number; reopened: boolean }>( `/api/admin/nominations/${nominationId}/reopen`, jsonRequest('POST', payload), ), updateNominationTrackingReview: (nominationId: number, payload: UpdateNominationTrackingReviewPayload) => requestJson<{ saved: boolean; nominationId: number; status: string }>( `/api/admin/nominations/${nominationId}/tracking-review`, jsonRequest('POST', payload), ), getAdminNominationLinkBlacklist: () => requestJson('/api/admin/nominations/link-blacklist'), updateAdminNominationLinkBlacklist: (payload: UpdateNominationLinkBlacklistPayload) => requestJson('/api/admin/nominations/link-blacklist', jsonRequest('PUT', payload)), addAdminNominationLinkBlacklistEntry: (payload: AddNominationLinkBlacklistEntryPayload) => requestJson('/api/admin/nominations/link-blacklist', jsonRequest('POST', payload)), resolveRiskFlag: (riskFlagId: number, payload: ResolveRiskFlagPayload) => requestJson<{ saved: boolean; riskFlagId: number; status: string }>( `/api/admin/risk-flags/${riskFlagId}/resolve`, jsonRequest('POST', payload), ), bulkResolveRiskFlags: (payload: BulkResolveRiskFlagsPayload) => requestJson<{ saved: boolean; count: number; status: string }>( '/api/admin/risk-flags/bulk-resolve', jsonRequest('POST', payload), ), }