import type { JumpHopSessionSnapshotResponse, JumpHopWorkSummaryResponse } from '../../../packages/shared/src/contracts/jumpHop'; import type { PuzzleAgentSessionSnapshot } from '../../../packages/shared/src/contracts/puzzleAgentSession'; import type { PuzzleWorkSummary } from '../../../packages/shared/src/contracts/puzzleWorkSummary'; import type { SquareHoleSessionSnapshot } from '../../../packages/shared/src/contracts/squareHoleAgent'; import type { SquareHoleWorkProfile } from '../../../packages/shared/src/contracts/squareHoleWorks'; import type { VisualNovelAgentSessionSnapshot, VisualNovelWorkDetail, } from '../../../packages/shared/src/contracts/visualNovel'; import type { WoodenFishSessionSnapshotResponse, WoodenFishWorkProfileResponse, WoodenFishWorkSummaryResponse, } from '../../../packages/shared/src/contracts/woodenFish'; import { normalizeCreationUrlValue } from './platformCreationUrlStateModel'; import { buildPuzzleResultProfileId, buildPuzzleResultWorkId, } from './platformPuzzleIdentityModel'; export type PlatformMiniGameSessionOwner = { userId?: string | null; displayName?: string | null; }; export function buildPuzzleRuntimeWorkFromSession( session: PuzzleAgentSessionSnapshot, owner: PlatformMiniGameSessionOwner, ): PuzzleWorkSummary | null { const draft = session.draft; const profileId = session.publishedProfileId ?? buildPuzzleResultProfileId(session.sessionId); if (!draft || !profileId || !draft.coverImageSrc?.trim()) { return null; } return { workId: buildPuzzleResultWorkId(session.sessionId) ?? profileId, profileId, ownerUserId: owner.userId ?? 'current-user', sourceSessionId: session.sessionId, authorDisplayName: owner.displayName ?? '玩家', workTitle: draft.workTitle, workDescription: draft.workDescription, levelName: draft.levelName, summary: draft.summary, themeTags: draft.themeTags, coverImageSrc: draft.coverImageSrc, coverAssetId: draft.coverAssetId, publicationStatus: 'draft', updatedAt: session.updatedAt, publishedAt: null, playCount: 0, remixCount: 0, likeCount: 0, publishReady: Boolean(session.resultPreview?.publishReady), levels: draft.levels, }; } export function buildSquareHoleProfileFromSession( session: SquareHoleSessionSnapshot | null, ): SquareHoleWorkProfile | null { const draft = session?.draft; if (!session || !draft?.profileId) { return null; } const now = session.updatedAt || new Date().toISOString(); return { workId: draft.profileId, profileId: draft.profileId, ownerUserId: 'current-user', sourceSessionId: session.sessionId, gameName: draft.gameName, themeText: draft.themeText, twistRule: draft.twistRule, summary: draft.summary, tags: draft.tags, coverImageSrc: draft.coverImageSrc ?? null, backgroundPrompt: draft.backgroundPrompt, backgroundImageSrc: draft.backgroundImageSrc ?? null, shapeOptions: draft.shapeOptions, holeOptions: draft.holeOptions, shapeCount: draft.shapeCount, difficulty: draft.difficulty, publicationStatus: 'draft', playCount: 0, updatedAt: now, publishedAt: null, publishReady: Boolean(draft.publishReady), }; } export function buildVisualNovelSessionFromWorkDetail( work: VisualNovelWorkDetail, ): VisualNovelAgentSessionSnapshot { return { sessionId: normalizeCreationUrlValue(work.sourceSessionId) ?? work.workId, ownerUserId: work.summary.ownerUserId, sourceMode: work.draft.sourceMode, status: 'ready', messages: [], draft: work.draft, pendingAction: null, createdAt: work.createdAt, updatedAt: work.summary.updatedAt, }; } export function buildJumpHopPendingSession( item: JumpHopWorkSummaryResponse, ): JumpHopSessionSnapshotResponse { const sessionId = normalizeCreationUrlValue(item.sourceSessionId) ?? item.profileId; return { sessionId, ownerUserId: item.ownerUserId, status: item.generationStatus, draft: { templateId: 'jump-hop', templateName: '跳一跳', profileId: item.profileId, workTitle: item.workTitle, workDescription: item.workDescription, themeTags: item.themeTags, difficulty: item.difficulty, stylePreset: item.stylePreset, characterPrompt: '', tilePrompt: '', endMoodPrompt: null, characterAsset: null, tileAtlasAsset: null, tileAssets: [], path: null, coverComposite: item.coverImageSrc, generationStatus: item.generationStatus, }, createdAt: item.updatedAt, updatedAt: item.updatedAt, }; } export function buildWoodenFishSessionFromWorkDetail( work: WoodenFishWorkProfileResponse, fallbackItem?: WoodenFishWorkSummaryResponse | null, ): WoodenFishSessionSnapshotResponse { const sessionId = normalizeCreationUrlValue(work.summary.sourceSessionId) ?? normalizeCreationUrlValue(fallbackItem?.sourceSessionId) ?? work.summary.profileId; return { sessionId, ownerUserId: work.summary.ownerUserId, status: work.summary.generationStatus, draft: work.draft, createdAt: work.summary.updatedAt, updatedAt: work.summary.updatedAt, }; } export function buildWoodenFishPendingSession( item: WoodenFishWorkSummaryResponse, ): WoodenFishSessionSnapshotResponse { const sessionId = normalizeCreationUrlValue(item.sourceSessionId) ?? item.profileId; return { sessionId, ownerUserId: item.ownerUserId, status: item.generationStatus, draft: { templateId: 'wooden-fish', templateName: '敲木鱼', profileId: item.profileId, workTitle: item.workTitle, workDescription: item.workDescription, themeTags: item.themeTags, hitObjectPrompt: '', hitObjectReferenceImageSrc: null, hitSoundPrompt: null, floatingWords: ['功德 +1'], hitObjectAsset: null, backgroundAsset: null, backButtonAsset: null, hitSoundAsset: null, coverImageSrc: item.coverImageSrc, generationStatus: item.generationStatus, }, createdAt: item.updatedAt, updatedAt: item.updatedAt, }; }