import Foundation /// Body für `POST /api/v1/decks/generate` — AI-Text-Generierung. /// Aus `cards/apps/api/src/routes/decks-generate.ts:GenerateInputSchema`. struct DeckGenerateBody: Encodable { let prompt: String let language: GenerationLanguage let count: Int let url: String? } /// Sprache für AI-Deck-Generierung. Server akzeptiert `de` oder `en`. enum GenerationLanguage: String, Codable, CaseIterable { case de case en var label: String { switch self { case .de: "Deutsch" case .en: "English" } } } /// Eine hochzuladende Datei für `POST /api/v1/decks/from-image`. /// Wird als multipart-`file`-Part gesendet. struct GenerationMediaFile: Identifiable { let id: UUID let data: Data let filename: String let mimeType: String init(id: UUID = UUID(), data: Data, filename: String, mimeType: String) { self.id = id self.data = data self.filename = filename self.mimeType = mimeType } /// `application/pdf` → PDF-Dokument, sonst Bild. var isPDF: Bool { mimeType == "application/pdf" } /// Größen-Label für die UI ("3.2 MB"). var sizeLabel: String { ByteCountFormatter.string(fromByteCount: Int64(data.count), countStyle: .file) } } /// Response von beiden AI-Generate-Endpoints (`/decks/generate` und /// `/decks/from-image`). Beide rufen serverseitig `insertGeneratedDeck` /// und liefern dieselbe Shape. struct DeckGenerateResponse: Decodable { let deck: Deck let cardsCreated: Int enum CodingKeys: String, CodingKey { case deck case cardsCreated = "cards_created" } }