import { apiRequest, type QueryParams } from "@/shared/api/request"; type Raw = Record; export interface AgencyOpeningRewardDto { rankNo: number; tierNo: number; thresholdCoinSpent: number; rewardCoinAmount: number; } export interface AgencyOpeningCycleDto { cycleId: string; activityCode: string; title: string; status: string; startMs: number; endMs: number; minHostCount: number; maxAgencyAgeDays: number; rewards: AgencyOpeningRewardDto[]; settledAtMs: number; createdAtMs: number; updatedAtMs: number; } export interface AgencyOpeningCyclePayload { cycle_id?: string; title: string; status: string; start_ms: number; end_ms: number; min_host_count: number; max_agency_age_days: number; rewards: Array<{ rank_no: number; tier_no?: number; threshold_coin_spent: number; reward_coin_amount: number }>; } export interface AgencyOpeningApplicationDto { applicationId: string; cycleId: string; agencyId: string; agencyOwnerUserId: string; agencyName: string; hostCount: number; agencyCreatedAtMs: number; status: string; scoreCoinAmount: number; rewardRankNo: number; rewardThresholdCoinSpent: number; rewardCoinAmount: number; walletCommandId: string; walletTransactionId: string; failureReason: string; appliedAtMs: number; grantedAtMs: number; updatedAtMs: number; } export function listAgencyOpeningCycles(query: QueryParams = {}) { return apiRequest<{ items?: Raw[]; total?: number; page?: number; page_size?: number }>( "/v1/admin/activity/agency-opening/cycles", { method: "GET", query }, ).then((page) => ({ ...page, items: (page.items || []).map(normalizeCycle) })); } export function createAgencyOpeningCycle(payload: AgencyOpeningCyclePayload) { return apiRequest("/v1/admin/activity/agency-opening/cycles", { body: payload, method: "POST", }).then(normalizeCycle); } export function updateAgencyOpeningCycle(cycleId: string, payload: AgencyOpeningCyclePayload) { return apiRequest( `/v1/admin/activity/agency-opening/cycles/${encodeURIComponent(cycleId)}`, { body: payload, method: "PUT", }, ).then(normalizeCycle); } export function setAgencyOpeningCycleStatus(cycleId: string, status: string) { return apiRequest( `/v1/admin/activity/agency-opening/cycles/${encodeURIComponent(cycleId)}/status`, { body: { status }, method: "PATCH" }, ).then(normalizeCycle); } export function listAgencyOpeningApplications(query: QueryParams = {}) { return apiRequest<{ items?: Raw[]; total?: number; page?: number; page_size?: number }>( "/v1/admin/activity/agency-opening/applications", { method: "GET", query }, ).then((page) => ({ ...page, items: (page.items || []).map(normalizeApplication) })); } function normalizeCycle(item: Raw): AgencyOpeningCycleDto { return { cycleId: stringValue(item.cycleId ?? item.cycle_id), activityCode: stringValue(item.activityCode ?? item.activity_code), title: stringValue(item.title), status: stringValue(item.status), startMs: numberValue(item.startMs ?? item.start_ms), endMs: numberValue(item.endMs ?? item.end_ms), minHostCount: numberValue(item.minHostCount ?? item.min_host_count), maxAgencyAgeDays: numberValue(item.maxAgencyAgeDays ?? item.max_agency_age_days), rewards: Array.isArray(item.rewards) ? item.rewards.map((reward) => normalizeReward(reward as Raw)) : [], settledAtMs: numberValue(item.settledAtMs ?? item.settled_at_ms), createdAtMs: numberValue(item.createdAtMs ?? item.created_at_ms), updatedAtMs: numberValue(item.updatedAtMs ?? item.updated_at_ms), }; } function normalizeReward(item: Raw): AgencyOpeningRewardDto { return { rankNo: numberValue(item.rankNo ?? item.rank_no), tierNo: numberValue(item.tierNo ?? item.tier_no ?? item.rankNo ?? item.rank_no), thresholdCoinSpent: numberValue(item.thresholdCoinSpent ?? item.threshold_coin_spent), rewardCoinAmount: numberValue(item.rewardCoinAmount ?? item.reward_coin_amount), }; } function normalizeApplication(item: Raw): AgencyOpeningApplicationDto { return { applicationId: stringValue(item.applicationId ?? item.application_id), cycleId: stringValue(item.cycleId ?? item.cycle_id), agencyId: stringValue(item.agencyId ?? item.agency_id), agencyOwnerUserId: stringValue(item.agencyOwnerUserId ?? item.agency_owner_user_id), agencyName: stringValue(item.agencyName ?? item.agency_name), hostCount: numberValue(item.hostCount ?? item.host_count), agencyCreatedAtMs: numberValue(item.agencyCreatedAtMs ?? item.agency_created_at_ms), status: stringValue(item.status), scoreCoinAmount: numberValue(item.scoreCoinAmount ?? item.score_coin_amount), rewardRankNo: numberValue(item.rewardRankNo ?? item.reward_rank_no), rewardThresholdCoinSpent: numberValue(item.rewardThresholdCoinSpent ?? item.reward_threshold_coin_spent), rewardCoinAmount: numberValue(item.rewardCoinAmount ?? item.reward_coin_amount), walletCommandId: stringValue(item.walletCommandId ?? item.wallet_command_id), walletTransactionId: stringValue(item.walletTransactionId ?? item.wallet_transaction_id), failureReason: stringValue(item.failureReason ?? item.failure_reason), appliedAtMs: numberValue(item.appliedAtMs ?? item.applied_at_ms), grantedAtMs: numberValue(item.grantedAtMs ?? item.granted_at_ms), updatedAtMs: numberValue(item.updatedAtMs ?? item.updated_at_ms), }; } function numberValue(value: unknown) { const parsed = Number(value); return Number.isFinite(parsed) ? parsed : 0; } function stringValue(value: unknown) { return value === undefined || value === null ? "" : String(value); }