diff --git a/.gitignore b/.gitignore index ce4b082..f8a3f24 100644 --- a/.gitignore +++ b/.gitignore @@ -73,11 +73,6 @@ DerivedData/ *.dSYM.zip *.dSYM -# Generated files -**/*.g.dart -**/*.freezed.dart -**/*.gr.dart - # Coverage coverage/ @@ -93,3 +88,4 @@ coverage/ .ideai/background-tasks/ .ideai/live-state.json .ideai/layouts.json +.ideai/permissions.json diff --git a/.ideai/memory/MEMORY.md b/.ideai/memory/MEMORY.md index 90750aa..7553aea 100644 --- a/.ideai/memory/MEMORY.md +++ b/.ideai/memory/MEMORY.md @@ -3,3 +3,4 @@ - [gametime-product-scope](gametime-product-scope.md) — memory note gametime-product-scope - [gametime-ux-conception](gametime-ux-conception.md) — memory note gametime-ux-conception - [gametime-architecture-initial-stack-data-model](gametime-architecture-initial-stack-data-model.md) — memory note gametime-architecture-initial-stack-data-model +- [gametime-dev-environment](gametime-dev-environment.md) — memory note gametime-dev-environment diff --git a/.ideai/memory/gametime-dev-environment.md b/.ideai/memory/gametime-dev-environment.md new file mode 100644 index 0000000..69d2fae --- /dev/null +++ b/.ideai/memory/gametime-dev-environment.md @@ -0,0 +1,46 @@ +--- +name: gametime-dev-environment +description: memory note gametime-dev-environment +metadata: + type: project +--- +# GameTime — Environnement de build local + +Flutter SDK et Android SDK sont installés et opérationnels sur la machine du projet (2026-07-17). Premier APK debug buildé avec succès le 2026-07-17. + +## Flutter +- Installé via le paquet AUR `flutter-bin` (3.44.6, stable), pas `flutter` (source AUR) — ce dernier a un conflit de dépendance avec `dart` déjà présent sur le système (`dart<3.12.0` requis alors que 3.12.2 est installé). +- Binaire `flutter` disponible dans `/usr/bin/flutter` (wrapper `flutter-bin`), SDK réel monté via unionfs sous `~/.cache/flutter_sdk`. + +## Android SDK +- Installé via le paquet AUR `android-sdk-cmdline-tools-latest`, posé dans `/opt/android-sdk` (appartenait à root par défaut — il a fallu `chown -R anthony:anthony /opt/android-sdk` pour que `sdkmanager` puisse installer des composants sans sudo). +- Composants installés : `platform-tools`, `platforms;android-34/35/36`, `build-tools;34.0.0/28.0.3/36.0.0`, NDK 28.2.13676358, CMake 3.22.1 (certains installés automatiquement par Gradle au premier build). +- Licences acceptées via `sdkmanager --licenses`. +- `flutter config --android-sdk /opt/android-sdk` exécuté pour lier Flutter au SDK. + +## JDK — point de friction important +- Le JDK système par défaut est `java-26-openjdk` (trop récent : `Unsupported class file major version 70` avec Gradle 9.1 utilisé par le template Flutter). +- Installé `jdk21-openjdk` (dépôt officiel Arch, pas besoin d'AUR) en complément, sans le mettre par défaut système. +- Flutter configuré spécifiquement pour l'utiliser : `flutter config --jdk-dir=/usr/lib/jvm/java-21-openjdk`. Cette config est stockée dans la config Flutter (probablement `~/.config/flutter/settings` ou équivalent), donc persistante indépendamment du JDK système par défaut. + +## Variables d'environnement persistées +Ajoutées dans `~/.zshrc`, `~/.bashrc` et `~/.config/fish/config.fish` (le shell de login est zsh, mais les agents peuvent tourner en bash) : +``` +ANDROID_HOME=/opt/android-sdk +ANDROID_SDK_ROOT=/opt/android-sdk +PATH inclut $ANDROID_HOME/cmdline-tools/latest/bin et $ANDROID_HOME/platform-tools +``` + +## Limite connue +- Pas de Chrome installé (web toolchain Flutter indisponible), sans impact puisque la cible du projet est mobile (Android/iOS), pas web. +- Pas de device/émulateur Android connecté — seul `flutter build apk --debug` (sans device) est utilisable pour produire l'APK à transférer manuellement sur le téléphone de l'utilisateur (pas de `flutter run` direct sur device depuis cet environnement). +- **Les sandbox des agents (DevBackend, DevFrontend, etc.) n'ont pas d'accès réseau à pub.dev**, contrairement à l'environnement de Main (Bash direct). Conséquence pratique : `flutter pub get`, `flutter analyze` (si dépend de packages non encore en cache) et `flutter build apk` doivent être exécutés par Main en vérification finale après le travail de code d'un agent, pas par l'agent lui-même. Les agents peuvent en revanche modifier pubspec.yaml, écrire du code Dart, etc. + +## Commande de build APK de référence +```bash +export ANDROID_HOME=/opt/android-sdk +export PATH="$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools:$PATH" +cd /home/anthony/Documents/Projects/GameTime +flutter pub get && flutter analyze && flutter build apk --debug +``` +APK produit : `build/app/outputs/flutter-apk/app-debug.apk`. \ No newline at end of file diff --git a/.ideai/tickets/1/carnet.md b/.ideai/tickets/1/carnet.md index 2fb4ecd..80a5199 100644 --- a/.ideai/tickets/1/carnet.md +++ b/.ideai/tickets/1/carnet.md @@ -1,7 +1,7 @@ --- issueRef: "#1" -version: 3 +version: 4 updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} -updatedAt: 1784301472470 +updatedAt: 1784301585782 --- Décisions à prendre par Git : nom de la branche principale de dev (ex: develop) si on ne travaille pas directement sur main, convention de nommage des branches de feature par ticket (ex: feature/#2-scaffolding-flutter). Aucune action sortante (push distant, remote) sans validation explicite de l'utilisateur — repo local pour l'instant. \ No newline at end of file diff --git a/.ideai/tickets/1/issue.md b/.ideai/tickets/1/issue.md index d0cdafb..004cd6e 100644 --- a/.ideai/tickets/1/issue.md +++ b/.ideai/tickets/1/issue.md @@ -2,7 +2,7 @@ id: "e6f0a540-055c-4b9d-9d14-3ceabf35c7d6" number: 1 title: "[Git] Initialiser le dépôt et la stratégie de branches GameTime" -status: "inProgress" +status: "closed" priority: "high" sprint: null links: [] @@ -10,7 +10,7 @@ agentRefs: [{"agentId":"8f065f64-ef6e-4a00-af9c-d00be079e3cc","role":"assigned"} createdBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} createdAt: 1784301284213 -updatedAt: 1784301472470 -version: 3 +updatedAt: 1784301585782 +version: 4 --- Mettre en place la structure de dépôt pour le projet Flutter GameTime : stratégie de branches (main protégée + branches de feature par ticket), conventions de commit, .gitignore adapté Flutter/Dart. \ No newline at end of file diff --git a/.ideai/tickets/10/carnet.md b/.ideai/tickets/10/carnet.md index 026e172..4ad9f0f 100644 --- a/.ideai/tickets/10/carnet.md +++ b/.ideai/tickets/10/carnet.md @@ -1,7 +1,7 @@ --- issueRef: "#10" -version: 4 +version: 6 updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} -updatedAt: 1784301394213 +updatedAt: 1784308662161 --- Référence : mémoire "gametime-ux-conception" section 5. Relance : utiliser la séance-modèle source si elle existe encore ; sinon relancer depuis le snapshot historique avec un message explicite ("La séance originale n'existe plus. Une copie va être utilisée."). L'historique doit rester lisible même si exercices/programmes/séances-modèles sources ont été supprimés depuis (snapshot autonome, cf. ticket #3/#4). \ No newline at end of file diff --git a/.ideai/tickets/10/issue.md b/.ideai/tickets/10/issue.md index 27247d5..a6d4525 100644 --- a/.ideai/tickets/10/issue.md +++ b/.ideai/tickets/10/issue.md @@ -2,7 +2,7 @@ id: "4c2a9393-bf0f-4f41-a243-9ce0b4f0c4e1" number: 10 title: "[DevFrontend] Écran Historique des séances" -status: "open" +status: "closed" priority: "medium" sprint: null links: [{"target":"#4","kind":"dependsOn"},{"target":"#9","kind":"dependsOn"}] @@ -10,7 +10,7 @@ agentRefs: [{"agentId":"9933c93a-b8a1-4164-a3bb-7063fdad747d","role":"assigned"} createdBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} createdAt: 1784301309677 -updatedAt: 1784301394213 -version: 4 +updatedAt: 1784308662161 +version: 6 --- Liste groupée par période (Aujourd'hui/Cette semaine/Plus ancien) avec résumé par séance. Détail par programme puis exercice puis série (temps/répétitions/score si suivis). Relance : utilise la séance-modèle associée si elle existe encore, sinon relance depuis le snapshot historique avec message explicite. Suppression d'historique (action destructive confirmée). Cf. mémoire "gametime-ux-conception" section 5. \ No newline at end of file diff --git a/.ideai/tickets/11/carnet.md b/.ideai/tickets/11/carnet.md index c775d04..e59bb52 100644 --- a/.ideai/tickets/11/carnet.md +++ b/.ideai/tickets/11/carnet.md @@ -1,7 +1,7 @@ --- issueRef: "#11" -version: 7 +version: 9 updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} -updatedAt: 1784301397898 +updatedAt: 1784309299325 --- Points à couvrir en priorité : (1) impossibilité de modifier les mesures activées ou l'ordre des exercices depuis une séance-modèle, seuls setsCount et cibles numériques doivent être modifiables ; (2) reprise de séance après kill complet de l'app (pas juste mise en arrière-plan) ; (3) recalcul correct des timers de repos ajustés (+/-15s) après reprise ; (4) intégrité de l'historique quand l'exercice, le programme ou la séance-modèle source ont été supprimés/archivés entre-temps ; (5) règle "au moins une mesure active" sur un exercice. Rapport d'échec réel obligatoire (commande, sortie brute, diagnostic) — pas d'enjolivement si KO, cf. règle du cycle dans le contexte Main. \ No newline at end of file diff --git a/.ideai/tickets/11/issue.md b/.ideai/tickets/11/issue.md index f7a235d..5fa4174 100644 --- a/.ideai/tickets/11/issue.md +++ b/.ideai/tickets/11/issue.md @@ -2,7 +2,7 @@ id: "9592e96c-2c9f-439c-87f0-42b9147c1e00" number: 11 title: "[QA] Plan et exécution des tests fonctionnels GameTime" -status: "open" +status: "closed" priority: "high" sprint: null links: [{"target":"#6","kind":"dependsOn"},{"target":"#7","kind":"dependsOn"},{"target":"#8","kind":"dependsOn"},{"target":"#9","kind":"dependsOn"},{"target":"#10","kind":"dependsOn"}] @@ -10,7 +10,7 @@ agentRefs: [{"agentId":"7efa512f-3b3a-47b5-ade0-a2dd13073055","role":"assigned"} createdBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} createdAt: 1784301312946 -updatedAt: 1784301397898 -version: 7 +updatedAt: 1784309299325 +version: 9 --- Écrire et exécuter les tests couvrant : CRUD Exercice/Programme/Séance-modèle, règles d'overrides limités en séance, robustesse de la session active (reprise après fermeture/mise en arrière-plan de l'app, recalcul des timers depuis horodatages), génération correcte de l'historique (snapshot autonome), relance de séance (via séance-modèle et via snapshot si séance-modèle supprimée). Rapport d'échec réel (commande + sortie + diagnostic) sans enjoliver en cas de KO. \ No newline at end of file diff --git a/.ideai/tickets/2/carnet.md b/.ideai/tickets/2/carnet.md index 5cf2314..dfc7fe2 100644 --- a/.ideai/tickets/2/carnet.md +++ b/.ideai/tickets/2/carnet.md @@ -1,7 +1,7 @@ --- issueRef: "#2" -version: 3 +version: 5 updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} -updatedAt: 1784301371028 +updatedAt: 1784304100048 --- Référence : mémoire projet "gametime-architecture-initial-stack-data-model" (Architect). Stack : Flutter + Drift (SQLite). Structure hexagonale obligatoire : domain / application / infrastructure(local) / presentation, composition root séparée. Pas de schéma de tables à ce stade (ticket #3), juste la connexion Drift vide et le wiring. Cibler iOS + Android dans le pubspec/config dès le départ même si le test utilisateur se fait sur Android. \ No newline at end of file diff --git a/.ideai/tickets/2/issue.md b/.ideai/tickets/2/issue.md index d91513c..f38685f 100644 --- a/.ideai/tickets/2/issue.md +++ b/.ideai/tickets/2/issue.md @@ -2,7 +2,7 @@ id: "736ad58d-1020-438a-b563-5d0c30a05b04" number: 2 title: "[DevBackend] Scaffolding projet Flutter + architecture hexagonale" -status: "open" +status: "closed" priority: "critical" sprint: null links: [{"target":"#1","kind":"dependsOn"}] @@ -10,7 +10,7 @@ agentRefs: [{"agentId":"10ee045b-1c41-479e-ba03-dceed9edd495","role":"assigned"} createdBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} createdAt: 1784301286030 -updatedAt: 1784301371028 -version: 3 +updatedAt: 1784304100048 +version: 5 --- Initialiser le projet Flutter (cibles iOS + Android). Mettre en place la structure de dossiers domain / application / infrastructure(local) / presentation. Config lint/format. Intégration Drift de base (connexion DB vide, pas encore de schéma). Le domaine ne doit dépendre ni de Flutter ni de Drift. \ No newline at end of file diff --git a/.ideai/tickets/3/carnet.md b/.ideai/tickets/3/carnet.md index 4cf5e2e..1f396ad 100644 --- a/.ideai/tickets/3/carnet.md +++ b/.ideai/tickets/3/carnet.md @@ -1,8 +1,8 @@ --- issueRef: "#3" -version: 3 +version: 5 updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} -updatedAt: 1784301376032 +updatedAt: 1784305026425 --- Référence : mémoire "gametime-architecture-initial-stack-data-model" pour le détail des entités (Exercise, MediaAsset, Program, ProgramExercise, WorkoutTemplate, WorkoutTemplateProgram, WorkoutTemplateExerciseOverride, ActiveWorkoutSession, ActiveSetResult, ActiveRestState, WorkoutHistory, WorkoutHistorySetResult, change_log). Points de friction actés par Architect à respecter dans le schéma : diff --git a/.ideai/tickets/3/issue.md b/.ideai/tickets/3/issue.md index b2a50b7..e0e7d46 100644 --- a/.ideai/tickets/3/issue.md +++ b/.ideai/tickets/3/issue.md @@ -2,7 +2,7 @@ id: "ea99a2e0-3c07-404c-95db-13818be0ee20" number: 3 title: "[DevBackend] Modèle de données Drift complet (entités + migrations)" -status: "open" +status: "closed" priority: "critical" sprint: null links: [{"target":"#2","kind":"dependsOn"}] @@ -10,7 +10,7 @@ agentRefs: [{"agentId":"10ee045b-1c41-479e-ba03-dceed9edd495","role":"assigned"} createdBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} createdAt: 1784301289668 -updatedAt: 1784301376032 -version: 3 +updatedAt: 1784305026425 +version: 5 --- Implémenter les tables Drift : Exercise, MediaAsset, Program, ProgramExercise, WorkoutTemplate, WorkoutTemplateProgram, WorkoutTemplateExerciseOverride, ActiveWorkoutSession, ActiveSetResult, ActiveRestState, WorkoutHistory, WorkoutHistorySetResult, change_log. Champs sync-ready sur chaque agrégat : id stable (UUIDv7/ULID), createdAt/updatedAt/deletedAt, schemaVersion, syncState, localRevision, originDeviceId. Voir mémoire projet "gametime-architecture-initial-stack-data-model" pour le détail des champs par entité et les invariants (score = valeur numérique + label/unité snapshotés, exercice jamais supprimé en dur, etc.). \ No newline at end of file diff --git a/.ideai/tickets/4/carnet.md b/.ideai/tickets/4/carnet.md index 740ed49..e95f13b 100644 --- a/.ideai/tickets/4/carnet.md +++ b/.ideai/tickets/4/carnet.md @@ -1,8 +1,8 @@ --- issueRef: "#4" -version: 3 +version: 5 updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} -updatedAt: 1784301378940 +updatedAt: 1784305595841 --- Règle produit validée avec l'utilisateur (mémoire "gametime-ux-conception" section 3) : une séance-modèle peut surcharger uniquement le nombre de séries et les valeurs cibles numériques des mesures déjà actives d'un exercice — jamais quelles mesures sont actives, jamais l'ordre/la liste des exercices. Ce garde-fou doit être appliqué au niveau des use cases, pas seulement de l'UI. Pause/reprise de session : recalculer les temps écoulés depuis les horodatages stockés (startedAt, pausedAt, lastPersistedAt), jamais depuis un compteur en mémoire — nécessaire pour survivre à une fermeture d'app. \ No newline at end of file diff --git a/.ideai/tickets/4/issue.md b/.ideai/tickets/4/issue.md index cc06008..a1c5fe3 100644 --- a/.ideai/tickets/4/issue.md +++ b/.ideai/tickets/4/issue.md @@ -2,7 +2,7 @@ id: "d3a8bc95-d1c7-4114-a964-7faa5b15835a" number: 4 title: "[DevBackend] Couche application : use cases et repositories" -status: "open" +status: "closed" priority: "high" sprint: null links: [{"target":"#3","kind":"dependsOn"}] @@ -10,7 +10,7 @@ agentRefs: [{"agentId":"10ee045b-1c41-479e-ba03-dceed9edd495","role":"assigned"} createdBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} createdAt: 1784301293308 -updatedAt: 1784301378940 -version: 3 +updatedAt: 1784305595841 +version: 5 --- Implémenter ports/repositories et use cases pour : CRUD Exercise (règle "au moins une mesure active", avertissement si exercice déjà utilisé, archivage doux plutôt que suppression) ; CRUD Program (snapshot de l'exercice à l'ajout, mesures activées parmi celles autorisées, séries, cibles, repos rattaché à la série/l'exercice précédent) ; gestion WorkoutTemplate (composition de programmes en snapshot indépendant, overrides limités à setsCount et valeurs cibles numériques uniquement — pas de changement de mesures actives ni de structure) ; gestion ActiveWorkoutSession (démarrage, transitions série/repos, pause/reprise basées sur horodatages, pas sur un compteur mémoire) ; clôture de séance vers WorkoutHistory (snapshot autonome). \ No newline at end of file diff --git a/.ideai/tickets/5/carnet.md b/.ideai/tickets/5/carnet.md index 184bf3f..0fc81d4 100644 --- a/.ideai/tickets/5/carnet.md +++ b/.ideai/tickets/5/carnet.md @@ -1,7 +1,7 @@ --- issueRef: "#5" -version: 3 +version: 5 updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} -updatedAt: 1784301380781 +updatedAt: 1784305875016 --- Fichiers médias hors base SQLite, seulement les métadonnées dans MediaAsset (localUri, mimeType, sizeBytes, durationMs pour vidéo, width/height, checksum). Prévoir remoteUri nullable pour la sync future sans l'implémenter. \ No newline at end of file diff --git a/.ideai/tickets/5/issue.md b/.ideai/tickets/5/issue.md index a2e28a9..3c52173 100644 --- a/.ideai/tickets/5/issue.md +++ b/.ideai/tickets/5/issue.md @@ -2,7 +2,7 @@ id: "17cd97da-4b28-47c8-97e5-293e0173d640" number: 5 title: "[DevBackend] Gestion des médias locaux" -status: "open" +status: "closed" priority: "medium" sprint: null links: [{"target":"#3","kind":"dependsOn"}] @@ -10,7 +10,7 @@ agentRefs: [{"agentId":"10ee045b-1c41-479e-ba03-dceed9edd495","role":"assigned"} createdBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} createdAt: 1784301295496 -updatedAt: 1784301380781 -version: 3 +updatedAt: 1784305875016 +version: 5 --- Import/association d'images et vidéos aux exercices (entité MediaAsset), stockage fichier dans le stockage applicatif local, référencement par métadonnées SQLite, nettoyage des fichiers orphelins. Prévoir les champs sync-ready (remoteUri nullable, checksum) sans implémenter la synchro. \ No newline at end of file diff --git a/.ideai/tickets/6/carnet.md b/.ideai/tickets/6/carnet.md index 6e6eba0..67ed89f 100644 --- a/.ideai/tickets/6/carnet.md +++ b/.ideai/tickets/6/carnet.md @@ -1,7 +1,7 @@ --- issueRef: "#6" -version: 4 +version: 6 updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} -updatedAt: 1784301382963 +updatedAt: 1784306547848 --- Référence : mémoire "gametime-ux-conception" section 1. Point critique UX : la section "Mesures disponibles" doit rester très lisible (toggles Temps/Répétitions/Score avec aide courte par toggle, champs label+unité seulement si Score activé). Règle bloquante : au moins une mesure doit être active pour enregistrer. Message non bloquant si on modifie les mesures d'un exercice déjà utilisé ailleurs (les programmes existants restent inchangés grâce aux snapshots). \ No newline at end of file diff --git a/.ideai/tickets/6/issue.md b/.ideai/tickets/6/issue.md index aa3319c..9b7f9eb 100644 --- a/.ideai/tickets/6/issue.md +++ b/.ideai/tickets/6/issue.md @@ -2,7 +2,7 @@ id: "c748c16e-b782-47a8-accb-aa5d88b9adfb" number: 6 title: "[DevFrontend] Écran Bibliothèque d'exercices" -status: "open" +status: "closed" priority: "high" sprint: null links: [{"target":"#4","kind":"dependsOn"},{"target":"#5","kind":"dependsOn"}] @@ -10,7 +10,7 @@ agentRefs: [{"agentId":"9933c93a-b8a1-4164-a3bb-7063fdad747d","role":"assigned"} createdBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} createdAt: 1784301298045 -updatedAt: 1784301382963 -version: 4 +updatedAt: 1784306547848 +version: 6 --- Liste avec recherche et filtres chips par mesure disponible. Écran création/édition d'exercice : nom, description, image/vidéo optionnelles, section "Mesures disponibles" (toggles Temps/Répétitions/Score cumulables, label+unité si Score). Règle : au moins une mesure obligatoire. Avertissement non bloquant si modification des mesures d'un exercice déjà utilisé. Cf. mémoire "gametime-ux-conception" section 1. \ No newline at end of file diff --git a/.ideai/tickets/7/carnet.md b/.ideai/tickets/7/carnet.md index 203b3a4..da76cbd 100644 --- a/.ideai/tickets/7/carnet.md +++ b/.ideai/tickets/7/carnet.md @@ -1,7 +1,7 @@ --- issueRef: "#7" -version: 4 +version: 6 updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} -updatedAt: 1784301385567 +updatedAt: 1784307099507 --- Référence : mémoire "gametime-ux-conception" section 2. Repos affiché comme "Repos après cette série", attaché à la série/l'exercice précédent pour suivre le réordonnancement (poignée de déplacement). Pas de repos après la toute dernière série du programme. Ligne résumé attendue sur chaque carte exercice : "X séries · [mesures actives] · Repos Ys". \ No newline at end of file diff --git a/.ideai/tickets/7/issue.md b/.ideai/tickets/7/issue.md index 8e357ad..92f1360 100644 --- a/.ideai/tickets/7/issue.md +++ b/.ideai/tickets/7/issue.md @@ -2,7 +2,7 @@ id: "f955dede-b254-49da-95bb-f63adca76d05" number: 7 title: "[DevFrontend] Écran Création/édition de programme" -status: "open" +status: "closed" priority: "high" sprint: null links: [{"target":"#4","kind":"dependsOn"},{"target":"#6","kind":"dependsOn"}] @@ -10,7 +10,7 @@ agentRefs: [{"agentId":"9933c93a-b8a1-4164-a3bb-7063fdad747d","role":"assigned"} createdBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} createdAt: 1784301300945 -updatedAt: 1784301385567 -version: 4 +updatedAt: 1784307099507 +version: 6 --- Ajout d'exercices depuis la bibliothèque (recherche, badges de mesures). Cartes réordonnables par exercice. Configuration par exercice : nombre de séries, mesures à suivre (sous-ensemble de celles autorisées par l'exercice), cible par mesure activée, repos après chaque série (hérite du défaut programme, surchargeable). Gestion du cas "exercice archivé/supprimé de la bibliothèque". Cf. mémoire "gametime-ux-conception" section 2. \ No newline at end of file diff --git a/.ideai/tickets/8/carnet.md b/.ideai/tickets/8/carnet.md index f275b07..08e43dd 100644 --- a/.ideai/tickets/8/carnet.md +++ b/.ideai/tickets/8/carnet.md @@ -1,7 +1,7 @@ --- issueRef: "#8" -version: 4 +version: 6 updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} -updatedAt: 1784301388397 +updatedAt: 1784307587164 --- Référence : mémoire "gametime-ux-conception" section 3 — décision produit explicitement validée par l'utilisateur. Au premier ajout d'un programme à la séance, afficher le message expliquant qu'une copie est enregistrée et que les futures modifications du programme source ne changeront pas cette séance. Les seuls champs éditables depuis cette surface sont : nombre de séries, et valeurs cibles numériques des mesures déjà actives (temps cible, répétitions cible, score cible). Ne pas permettre l'ajout/suppression/réordonnancement d'exercices ni le changement des mesures activées ici — ça reste au niveau du programme source (ticket #7). \ No newline at end of file diff --git a/.ideai/tickets/8/issue.md b/.ideai/tickets/8/issue.md index b3e9873..7221698 100644 --- a/.ideai/tickets/8/issue.md +++ b/.ideai/tickets/8/issue.md @@ -2,7 +2,7 @@ id: "8f24db05-5d56-4324-8bef-68e4837e0e3b" number: 8 title: "[DevFrontend] Écran Composition de séance-modèle" -status: "open" +status: "closed" priority: "high" sprint: null links: [{"target":"#4","kind":"dependsOn"},{"target":"#7","kind":"dependsOn"}] @@ -10,7 +10,7 @@ agentRefs: [{"agentId":"9933c93a-b8a1-4164-a3bb-7063fdad747d","role":"assigned"} createdBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} createdAt: 1784301303492 -updatedAt: 1784301388397 -version: 4 +updatedAt: 1784307587164 +version: 6 --- Assemblage nommé et réordonnable de un ou plusieurs programmes (copie/snapshot au moment de l'ajout, avec message explicite à l'utilisateur sur l'indépendance vis-à-vis du programme source). Overrides autorisés uniquement : nombre de séries et valeurs cibles numériques des mesures déjà actives par exercice — pas de changement de mesures actives, pas de réordonnancement/ajout/suppression d'exercice depuis la séance. Cf. mémoire "gametime-ux-conception" section 3 (décision produit tranchée avec l'utilisateur). \ No newline at end of file diff --git a/.ideai/tickets/9/carnet.md b/.ideai/tickets/9/carnet.md index 0e687b7..75512e8 100644 --- a/.ideai/tickets/9/carnet.md +++ b/.ideai/tickets/9/carnet.md @@ -1,7 +1,7 @@ --- issueRef: "#9" -version: 4 +version: 6 updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} -updatedAt: 1784301392430 +updatedAt: 1784308091100 --- Référence : mémoire "gametime-ux-conception" section 4. Écran le plus sensible du produit : grandes zones tactiles (44-48px mini), utilisable à l'effort, une main. Hiérarchie de saisie si mesures cumulées : Temps (bloc principal) > Répétitions (stepper) > Score (champ + unité, clavier adapté au type). Écran "Repos" séparé avec +15s/-15s et "Ignorer le repos". Pause : "Quitter et sauvegarder" comme action sûre recommandée, "Abandonner" comme action destructive confirmée séparément. Reprise doit fonctionner même après fermeture complète de l'app (bandeau "Séance en cours" au retour). Fin de séance écrit dans WorkoutHistory (ticket #4) avec temps total + scores par série. \ No newline at end of file diff --git a/.ideai/tickets/9/issue.md b/.ideai/tickets/9/issue.md index 1881872..1a24e01 100644 --- a/.ideai/tickets/9/issue.md +++ b/.ideai/tickets/9/issue.md @@ -2,7 +2,7 @@ id: "311cfb2b-0a09-4c18-ba66-4053994bc109" number: 9 title: "[DevFrontend] Écran Exécution de séance" -status: "open" +status: "closed" priority: "critical" sprint: null links: [{"target":"#4","kind":"dependsOn"},{"target":"#8","kind":"dependsOn"}] @@ -10,7 +10,7 @@ agentRefs: [{"agentId":"9933c93a-b8a1-4164-a3bb-7063fdad747d","role":"assigned"} createdBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} createdAt: 1784301307130 -updatedAt: 1784301392430 -version: 4 +updatedAt: 1784308091100 +version: 6 --- Surface critique optimisée pour l'usage à l'effort (grandes zones tactiles, une main). En-tête temps écoulé + pause. Progression Programme/Exercice/Série. Saisie hiérarchisée quand mesures cumulées (Temps > Répétitions > Score avec unité). Écran "Repos" dédié entre séries avec ajustement ±15s et "Ignorer le repos". Pause avec "Quitter et sauvegarder" vs "Abandonner" (destructif confirmé). Reprise après interruption/fermeture app, robuste à l'arrière-plan (recalcul depuis horodatages, pas depuis un état mémoire). Écran de fin de séance (récap + relance) → écriture dans l'historique. Cf. mémoire "gametime-ux-conception" section 4. \ No newline at end of file diff --git a/.ideai/tickets/index.json b/.ideai/tickets/index.json index fcba8e2..4395dba 100644 --- a/.ideai/tickets/index.json +++ b/.ideai/tickets/index.json @@ -5,133 +5,133 @@ "issueRef": "#1", "path": "1", "title": "[Git] Initialiser le dépôt et la stratégie de branches GameTime", - "status": "inProgress", + "status": "closed", "priority": "high", "sprint": null, "assignedAgentIds": [ "8f065f64-ef6e-4a00-af9c-d00be079e3cc" ], - "updatedAt": 1784301472470 + "updatedAt": 1784301585782 }, { "issueRef": "#2", "path": "2", "title": "[DevBackend] Scaffolding projet Flutter + architecture hexagonale", - "status": "open", + "status": "closed", "priority": "critical", "sprint": null, "assignedAgentIds": [ "10ee045b-1c41-479e-ba03-dceed9edd495" ], - "updatedAt": 1784301371028 + "updatedAt": 1784304100048 }, { "issueRef": "#3", "path": "3", "title": "[DevBackend] Modèle de données Drift complet (entités + migrations)", - "status": "open", + "status": "closed", "priority": "critical", "sprint": null, "assignedAgentIds": [ "10ee045b-1c41-479e-ba03-dceed9edd495" ], - "updatedAt": 1784301376032 + "updatedAt": 1784305026425 }, { "issueRef": "#4", "path": "4", "title": "[DevBackend] Couche application : use cases et repositories", - "status": "open", + "status": "closed", "priority": "high", "sprint": null, "assignedAgentIds": [ "10ee045b-1c41-479e-ba03-dceed9edd495" ], - "updatedAt": 1784301378940 + "updatedAt": 1784305595841 }, { "issueRef": "#5", "path": "5", "title": "[DevBackend] Gestion des médias locaux", - "status": "open", + "status": "closed", "priority": "medium", "sprint": null, "assignedAgentIds": [ "10ee045b-1c41-479e-ba03-dceed9edd495" ], - "updatedAt": 1784301380781 + "updatedAt": 1784305875016 }, { "issueRef": "#6", "path": "6", "title": "[DevFrontend] Écran Bibliothèque d'exercices", - "status": "open", + "status": "closed", "priority": "high", "sprint": null, "assignedAgentIds": [ "9933c93a-b8a1-4164-a3bb-7063fdad747d" ], - "updatedAt": 1784301382963 + "updatedAt": 1784306547848 }, { "issueRef": "#7", "path": "7", "title": "[DevFrontend] Écran Création/édition de programme", - "status": "open", + "status": "closed", "priority": "high", "sprint": null, "assignedAgentIds": [ "9933c93a-b8a1-4164-a3bb-7063fdad747d" ], - "updatedAt": 1784301385567 + "updatedAt": 1784307099507 }, { "issueRef": "#8", "path": "8", "title": "[DevFrontend] Écran Composition de séance-modèle", - "status": "open", + "status": "closed", "priority": "high", "sprint": null, "assignedAgentIds": [ "9933c93a-b8a1-4164-a3bb-7063fdad747d" ], - "updatedAt": 1784301388397 + "updatedAt": 1784307587164 }, { "issueRef": "#9", "path": "9", "title": "[DevFrontend] Écran Exécution de séance", - "status": "open", + "status": "closed", "priority": "critical", "sprint": null, "assignedAgentIds": [ "9933c93a-b8a1-4164-a3bb-7063fdad747d" ], - "updatedAt": 1784301392430 + "updatedAt": 1784308091100 }, { "issueRef": "#10", "path": "10", "title": "[DevFrontend] Écran Historique des séances", - "status": "open", + "status": "closed", "priority": "medium", "sprint": null, "assignedAgentIds": [ "9933c93a-b8a1-4164-a3bb-7063fdad747d" ], - "updatedAt": 1784301394213 + "updatedAt": 1784308662161 }, { "issueRef": "#11", "path": "11", "title": "[QA] Plan et exécution des tests fonctionnels GameTime", - "status": "open", + "status": "closed", "priority": "high", "sprint": null, "assignedAgentIds": [ "7efa512f-3b3a-47b5-ade0-a2dd13073055" ], - "updatedAt": 1784301397898 + "updatedAt": 1784309299325 }, { "issueRef": "#12", diff --git a/.metadata b/.metadata new file mode 100644 index 0000000..92bca7e --- /dev/null +++ b/.metadata @@ -0,0 +1,33 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "ee80f08bbf97172ec030b8751ceab557177a34a6" + channel: "stable" + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: ee80f08bbf97172ec030b8751ceab557177a34a6 + base_revision: ee80f08bbf97172ec030b8751ceab557177a34a6 + - platform: android + create_revision: ee80f08bbf97172ec030b8751ceab557177a34a6 + base_revision: ee80f08bbf97172ec030b8751ceab557177a34a6 + - platform: ios + create_revision: ee80f08bbf97172ec030b8751ceab557177a34a6 + base_revision: ee80f08bbf97172ec030b8751ceab557177a34a6 + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/analysis_options.yaml b/analysis_options.yaml new file mode 100644 index 0000000..620c7cb --- /dev/null +++ b/analysis_options.yaml @@ -0,0 +1,9 @@ +include: package:flutter_lints/flutter.yaml + +analyzer: + exclude: + - '**/*.g.dart' + +linter: + rules: + prefer_single_quotes: true diff --git a/android/.gitignore b/android/.gitignore new file mode 100644 index 0000000..be3943c --- /dev/null +++ b/android/.gitignore @@ -0,0 +1,14 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java +.cxx/ + +# Remember to never publicly share your keystore. +# See https://flutter.dev/to/reference-keystore +key.properties +**/*.keystore +**/*.jks diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts new file mode 100644 index 0000000..9994ece --- /dev/null +++ b/android/app/build.gradle.kts @@ -0,0 +1,42 @@ +plugins { + id("com.android.application") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.gametime.app" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + + defaultConfig { + applicationId = "com.gametime.app" + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +kotlin { + compilerOptions { + jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17 + } +} + +flutter { + source = "../.." +} diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..399f698 --- /dev/null +++ b/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..bc7d6d5 --- /dev/null +++ b/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/kotlin/com/gametime/app/MainActivity.kt b/android/app/src/main/kotlin/com/gametime/app/MainActivity.kt new file mode 100644 index 0000000..e9ef322 --- /dev/null +++ b/android/app/src/main/kotlin/com/gametime/app/MainActivity.kt @@ -0,0 +1,5 @@ +package com.gametime.app + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity : FlutterActivity() diff --git a/android/app/src/main/res/drawable-v21/launch_background.xml b/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 0000000..f74085f --- /dev/null +++ b/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..304732f --- /dev/null +++ b/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..db77bb4 Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..17987b7 Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..09d4391 Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..d5f1c8d Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..4d6372e Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/values-night/styles.xml b/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 0000000..06952be --- /dev/null +++ b/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..cb1ef88 --- /dev/null +++ b/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000..399f698 --- /dev/null +++ b/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/android/build.gradle.kts b/android/build.gradle.kts new file mode 100644 index 0000000..dbee657 --- /dev/null +++ b/android/build.gradle.kts @@ -0,0 +1,24 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = + rootProject.layout.buildDirectory + .dir("../../build") + .get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/android/gradle.properties b/android/gradle.properties new file mode 100644 index 0000000..e96108c --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1,6 @@ +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError +android.useAndroidX=true +# This newDsl flag was added by the Flutter template +android.newDsl=false +# This builtInKotlin flag was added by the Flutter template +android.builtInKotlin=false diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..2d428bf --- /dev/null +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-9.1.0-all.zip diff --git a/android/settings.gradle.kts b/android/settings.gradle.kts new file mode 100644 index 0000000..c21f0c5 --- /dev/null +++ b/android/settings.gradle.kts @@ -0,0 +1,26 @@ +pluginManagement { + val flutterSdkPath = + run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "9.0.1" apply false + id("org.jetbrains.kotlin.android") version "2.3.20" apply false +} + +include(":app") diff --git a/ios/.gitignore b/ios/.gitignore new file mode 100644 index 0000000..7a7f987 --- /dev/null +++ b/ios/.gitignore @@ -0,0 +1,34 @@ +**/dgph +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 0000000..391a902 --- /dev/null +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + + diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/ios/Podfile b/ios/Podfile new file mode 100644 index 0000000..b0869ed --- /dev/null +++ b/ios/Podfile @@ -0,0 +1,42 @@ +platform :ios, '12.0' + +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. Run flutter pub get first." + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise 'FLUTTER_ROOT not found in Generated.xcconfig.' +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) + target 'RunnerTests' do + inherit! :search_paths + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + end +end diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..08d509f --- /dev/null +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,644 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 7884E8682EC3CC0700C636F2 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7884E8672EC3CC0400C636F2 /* SceneDelegate.swift */; }; + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 97C146E61CF9000F007C117D /* Project object */; + proxyType = 1; + remoteGlobalIDString = 97C146ED1CF9000F007C117D; + remoteInfo = Runner; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7884E8672EC3CC0400C636F2 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; + 78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = FlutterGeneratedPluginSwiftPackage; path = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 331C8082294A63A400263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C807B294A618700263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */, + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + 331C8082294A63A400263BE5 /* RunnerTests */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + 331C8081294A63A400263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 7884E8672EC3CC0400C636F2 /* SceneDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C8080294A63A400263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 331C807D294A63A400263BE5 /* Sources */, + 331C807F294A63A400263BE5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 331C8086294A63A400263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + packageProductDependencies = ( + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */, + ); + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C8080294A63A400263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 97C146ED1CF9000F007C117D; + }; + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + packageReferences = ( + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */, + ); + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + 331C8080294A63A400263BE5 /* RunnerTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C807F294A63A400263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C807D294A63A400263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + 7884E8682EC3CC0700C636F2 /* SceneDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C8086294A63A400263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 97C146ED1CF9000F007C117D /* Runner */; + targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.gametime.app; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 331C8088294A63A400263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.gametime.app.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Debug; + }; + 331C8089294A63A400263BE5 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.gametime.app.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Release; + }; + 331C808A294A63A400263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.gametime.app.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.gametime.app; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.gametime.app; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C8088294A63A400263BE5 /* Debug */, + 331C8089294A63A400263BE5 /* Release */, + 331C808A294A63A400263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCLocalSwiftPackageReference section */ + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */ = { + isa = XCLocalSwiftPackageReference; + relativePath = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; + }; +/* End XCLocalSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */ = { + isa = XCSwiftPackageProductDependency; + productName = FlutterGeneratedPluginSwiftPackage; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..c3fedb2 --- /dev/null +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1d526a1 --- /dev/null +++ b/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift new file mode 100644 index 0000000..c30b367 --- /dev/null +++ b/ios/Runner/AppDelegate.swift @@ -0,0 +1,16 @@ +import Flutter +import UIKit + +@main +@objc class AppDelegate: FlutterAppDelegate, FlutterImplicitEngineDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } + + func didInitializeImplicitFlutterEngine(_ engineBridge: FlutterImplicitEngineBridge) { + GeneratedPluginRegistrant.register(with: engineBridge.pluginRegistry) + } +} diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d36b1fa --- /dev/null +++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000..dc9ada4 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 0000000..7353c41 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 0000000..797d452 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000..6ed2d93 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000..4cd7b00 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000..fe73094 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png new file mode 100644 index 0000000..321773c Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png new file mode 100644 index 0000000..797d452 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000..502f463 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000..0ec3034 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000..0ec3034 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000..e9f5fea Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000..84ac32a Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png new file mode 100644 index 0000000..8953cba Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000..0467bf1 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 0000000..0bedcf2 --- /dev/null +++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "LaunchImage.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 0000000..9da19ea Binary files /dev/null and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000..9da19ea Binary files /dev/null and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000..9da19ea Binary files /dev/null and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 0000000..89c2725 --- /dev/null +++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/ios/Runner/Base.lproj/LaunchScreen.storyboard b/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..f2e259c --- /dev/null +++ b/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner/Base.lproj/Main.storyboard b/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 0000000..f3c2851 --- /dev/null +++ b/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist new file mode 100644 index 0000000..b0c9c28 --- /dev/null +++ b/ios/Runner/Info.plist @@ -0,0 +1,70 @@ + + + + + CADisableMinimumFrameDurationOnPhone + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Gametime + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + gametime + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneClassName + UIWindowScene + UISceneConfigurationName + flutter + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + UISceneStoryboardFile + Main + + + + + UIApplicationSupportsIndirectInputEvents + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/ios/Runner/Runner-Bridging-Header.h b/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 0000000..308a2a5 --- /dev/null +++ b/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/ios/Runner/SceneDelegate.swift b/ios/Runner/SceneDelegate.swift new file mode 100644 index 0000000..b9ce8ea --- /dev/null +++ b/ios/Runner/SceneDelegate.swift @@ -0,0 +1,6 @@ +import Flutter +import UIKit + +class SceneDelegate: FlutterSceneDelegate { + +} diff --git a/ios/RunnerTests/RunnerTests.swift b/ios/RunnerTests/RunnerTests.swift new file mode 100644 index 0000000..86a7c3b --- /dev/null +++ b/ios/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import Flutter +import UIKit +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/lib/application/app_bootstrap.dart b/lib/application/app_bootstrap.dart new file mode 100644 index 0000000..76a6116 --- /dev/null +++ b/lib/application/app_bootstrap.dart @@ -0,0 +1,90 @@ +import '../infrastructure/local/local.dart'; +import 'application.dart'; + +final class AppBootstrap { + AppBootstrap._({ + required this.database, + required this.exerciseUseCases, + required this.mediaUseCases, + required this.programUseCases, + required this.workoutTemplateUseCases, + required this.activeWorkoutSessionUseCases, + required this.closeWorkoutSessionUseCase, + required this.workoutHistoryUseCases, + }); + + final AppDatabase database; + final ExerciseUseCases exerciseUseCases; + final MediaUseCases mediaUseCases; + final ProgramUseCases programUseCases; + final WorkoutTemplateUseCases workoutTemplateUseCases; + final ActiveWorkoutSessionUseCases activeWorkoutSessionUseCases; + final CloseWorkoutSessionUseCase closeWorkoutSessionUseCase; + final WorkoutHistoryUseCases workoutHistoryUseCases; + + static Future create() async { + final database = AppDatabase.open(); + await database.customSelect('SELECT 1').get(); + final exerciseRepository = DriftExerciseRepository(database); + final mediaRepository = DriftMediaAssetRepository(database); + final programRepository = DriftProgramRepository(database); + final templateRepository = DriftWorkoutTemplateRepository(database); + final activeSessionRepository = DriftActiveSessionRepository(database); + final historyRepository = DriftWorkoutHistoryRepository(database); + final ids = LocalIdGenerator(); + const clock = SystemClock(); + const originDeviceId = 'local-device'; + + return AppBootstrap._( + database: database, + exerciseUseCases: ExerciseUseCases( + repository: exerciseRepository, + clock: clock, + ids: ids, + originDeviceId: originDeviceId, + ), + mediaUseCases: MediaUseCases( + mediaRepository: mediaRepository, + exerciseRepository: exerciseRepository, + storage: const PathProviderLocalMediaStorage(), + clock: clock, + ids: ids, + originDeviceId: originDeviceId, + ), + programUseCases: ProgramUseCases( + programRepository: programRepository, + exerciseRepository: exerciseRepository, + clock: clock, + ids: ids, + originDeviceId: originDeviceId, + ), + workoutTemplateUseCases: WorkoutTemplateUseCases( + templateRepository: templateRepository, + programRepository: programRepository, + clock: clock, + ids: ids, + originDeviceId: originDeviceId, + ), + activeWorkoutSessionUseCases: ActiveWorkoutSessionUseCases( + sessionRepository: activeSessionRepository, + templateRepository: templateRepository, + clock: clock, + ids: ids, + originDeviceId: originDeviceId, + ), + closeWorkoutSessionUseCase: CloseWorkoutSessionUseCase( + sessionRepository: activeSessionRepository, + historyRepository: historyRepository, + clock: clock, + ids: ids, + originDeviceId: originDeviceId, + ), + workoutHistoryUseCases: WorkoutHistoryUseCases( + repository: historyRepository, + clock: clock, + ), + ); + } + + Future dispose() => database.close(); +} diff --git a/lib/application/application.dart b/lib/application/application.dart new file mode 100644 index 0000000..32e79f7 --- /dev/null +++ b/lib/application/application.dart @@ -0,0 +1,8 @@ +/// Application layer entry point. +/// +/// This layer owns use cases and ports. It may depend on domain, but concrete +/// adapters are wired only from the composition root. +library; + +export 'ports.dart'; +export 'use_cases.dart'; diff --git a/lib/application/ports.dart b/lib/application/ports.dart new file mode 100644 index 0000000..691a615 --- /dev/null +++ b/lib/application/ports.dart @@ -0,0 +1,93 @@ +import '../domain/domain.dart'; + +abstract interface class Clock { + DateTime now(); +} + +final class SystemClock implements Clock { + const SystemClock(); + + @override + DateTime now() => DateTime.now().toUtc(); +} + +abstract interface class IdGenerator { + String newId(); +} + +abstract interface class ExerciseRepository { + Future findById(String id); + Future> listActive(); + Future isReferencedByProgram(String id); + Future save(Exercise exercise); +} + +final class StoredMediaFile { + const StoredMediaFile({ + required this.localUri, + required this.mimeType, + required this.sizeBytes, + this.width, + this.height, + this.durationMs, + }); + + final String localUri; + final String? mimeType; + final int sizeBytes; + final int? width; + final int? height; + final int? durationMs; +} + +abstract interface class LocalMediaStorage { + Future importFile({ + required String sourcePath, + required MediaKind kind, + required String stableFileName, + }); + + Future> listManagedLocalUris(); + Future deleteByLocalUri(String localUri); +} + +abstract interface class MediaAssetRepository { + Future findById(String id); + Future> listActive(); + Future save(MediaAsset mediaAsset); +} + +abstract interface class ProgramRepository { + Future findById(String id); + Future> listActive(); + Future save(Program program); + Future saveExercise(ProgramExercise exercise); + Future replaceExercises(Program program, DateTime deletedAt); +} + +abstract interface class WorkoutTemplateRepository { + Future findById(String id); + Future> listActive(); + Future save(WorkoutTemplate template); + Future saveProgram(WorkoutTemplateProgram program); + Future saveOverride(WorkoutTemplateExerciseOverride override); + Future replaceComposition(WorkoutTemplate template, DateTime deletedAt); +} + +abstract interface class ActiveSessionRepository { + Future findById(String id); + Future findOpen(); + Future save(ActiveWorkoutSession session); + Future saveSetResult(ActiveSetResult result); + Future saveRestState(ActiveRestState restState); + Future> listSetResults(String sessionId); + Future> listRestStates(String sessionId); +} + +abstract interface class WorkoutHistoryRepository { + Future findById(String id); + Future> listActive(); + Future save(WorkoutHistory history); + Future saveSetResult(WorkoutHistorySetResult result); + Future delete(String id, DateTime deletedAt); +} diff --git a/lib/application/use_cases.dart b/lib/application/use_cases.dart new file mode 100644 index 0000000..cd7cdb1 --- /dev/null +++ b/lib/application/use_cases.dart @@ -0,0 +1,1051 @@ +import 'dart:convert'; + +import '../domain/domain.dart'; +import 'ports.dart'; + +final class ExerciseUseCases { + const ExerciseUseCases({ + required this.repository, + required this.clock, + required this.ids, + required this.originDeviceId, + }); + + final ExerciseRepository repository; + final Clock clock; + final IdGenerator ids; + final String originDeviceId; + + Future create({ + required String name, + String? description, + String? imageMediaId, + String? videoMediaId, + required bool hasTimeMeasure, + required bool hasRepsMeasure, + required bool hasScoreMeasure, + String? scoreLabel, + String? scoreUnit, + }) async { + final now = clock.now(); + final exercise = Exercise( + metadata: _newMetadata(ids, originDeviceId, now), + name: name, + description: description, + imageMediaId: imageMediaId, + videoMediaId: videoMediaId, + hasTimeMeasure: hasTimeMeasure, + hasRepsMeasure: hasRepsMeasure, + hasScoreMeasure: hasScoreMeasure, + scoreLabel: scoreLabel, + scoreUnit: scoreUnit, + ); + await repository.save(exercise); + return exercise; + } + + Future save(Exercise exercise) => repository.save(exercise); + + Future> listActive() => repository.listActive(); + + Future isUsedInPrograms(String id) { + return repository.isReferencedByProgram(id); + } + + Future update({ + required String id, + required String name, + String? description, + String? imageMediaId, + String? videoMediaId, + required bool hasTimeMeasure, + required bool hasRepsMeasure, + required bool hasScoreMeasure, + String? scoreLabel, + String? scoreUnit, + }) async { + final exercise = await repository.findById(id); + if (exercise == null) { + throw const DomainException('Exercise not found.'); + } + final updated = exercise.copyWith( + metadata: exercise.metadata.touch(clock.now()), + name: name, + description: description, + imageMediaId: imageMediaId, + videoMediaId: videoMediaId, + hasTimeMeasure: hasTimeMeasure, + hasRepsMeasure: hasRepsMeasure, + hasScoreMeasure: hasScoreMeasure, + scoreLabel: scoreLabel, + scoreUnit: scoreUnit, + ); + await repository.save(updated); + return updated; + } + + Future attachImage({ + required String exerciseId, + required String mediaAssetId, + }) async { + final exercise = await repository.findById(exerciseId); + if (exercise == null) { + throw const DomainException('Exercise not found.'); + } + final updated = exercise.copyWith( + imageMediaId: mediaAssetId, + metadata: exercise.metadata.touch(clock.now()), + ); + await repository.save(updated); + return updated; + } + + Future attachVideo({ + required String exerciseId, + required String mediaAssetId, + }) async { + final exercise = await repository.findById(exerciseId); + if (exercise == null) { + throw const DomainException('Exercise not found.'); + } + final updated = exercise.copyWith( + videoMediaId: mediaAssetId, + metadata: exercise.metadata.touch(clock.now()), + ); + await repository.save(updated); + return updated; + } + + Future archive(String id) async { + final exercise = await repository.findById(id); + if (exercise == null) { + throw const DomainException('Exercise not found.'); + } + final archived = exercise.archive(clock.now()); + await repository.save(archived); + return archived; + } +} + +final class MediaUseCases { + const MediaUseCases({ + required this.mediaRepository, + required this.exerciseRepository, + required this.storage, + required this.clock, + required this.ids, + required this.originDeviceId, + }); + + final MediaAssetRepository mediaRepository; + final ExerciseRepository exerciseRepository; + final LocalMediaStorage storage; + final Clock clock; + final IdGenerator ids; + final String originDeviceId; + + Future importMedia({ + required String sourcePath, + required MediaKind kind, + }) async { + final now = clock.now(); + final id = ids.newId(); + final stored = await storage.importFile( + sourcePath: sourcePath, + kind: kind, + stableFileName: id, + ); + final asset = MediaAsset( + metadata: EntityMetadata( + id: id, + createdAt: now, + updatedAt: now, + originDeviceId: originDeviceId, + ), + kind: kind, + localUri: stored.localUri, + mimeType: stored.mimeType, + sizeBytes: stored.sizeBytes, + width: stored.width, + height: stored.height, + durationMs: stored.durationMs, + ); + await mediaRepository.save(asset); + return asset; + } + + Future attachToExercise({ + required String exerciseId, + required String mediaAssetId, + }) async { + final exercise = await exerciseRepository.findById(exerciseId); + if (exercise == null) { + throw const DomainException('Exercise not found.'); + } + final media = await mediaRepository.findById(mediaAssetId); + if (media == null) { + throw const DomainException('Media asset not found.'); + } + final updated = switch (media.kind) { + MediaKind.image => exercise.copyWith( + imageMediaId: media.metadata.id, + metadata: exercise.metadata.touch(clock.now()), + ), + MediaKind.video => exercise.copyWith( + videoMediaId: media.metadata.id, + metadata: exercise.metadata.touch(clock.now()), + ), + }; + await exerciseRepository.save(updated); + return updated; + } + + Future deleteOrphanedManagedFiles() async { + final activeAssets = await mediaRepository.listActive(); + final referencedUris = activeAssets.map((asset) => asset.localUri).toSet(); + final managedUris = await storage.listManagedLocalUris(); + final orphanedUris = managedUris.difference(referencedUris); + for (final uri in orphanedUris) { + await storage.deleteByLocalUri(uri); + } + return orphanedUris.length; + } +} + +final class ProgramUseCases { + const ProgramUseCases({ + required this.programRepository, + required this.exerciseRepository, + required this.clock, + required this.ids, + required this.originDeviceId, + }); + + final ProgramRepository programRepository; + final ExerciseRepository exerciseRepository; + final Clock clock; + final IdGenerator ids; + final String originDeviceId; + + Future findById(String id) => programRepository.findById(id); + + Future> listActive() => programRepository.listActive(); + + Future create({ + required String name, + required int defaultRestSeconds, + }) async { + final now = clock.now(); + final program = Program( + metadata: _newMetadata(ids, originDeviceId, now), + name: name, + defaultRestSeconds: defaultRestSeconds, + ); + await programRepository.save(program); + return program; + } + + Future saveConfigured({ + String? id, + required String name, + required int defaultRestSeconds, + required List exercises, + }) async { + final now = clock.now(); + final existing = id == null ? null : await programRepository.findById(id); + if (id != null && existing == null) { + throw const DomainException('Program not found.'); + } + final programId = id ?? ids.newId(); + final metadata = + existing?.metadata.touch(now) ?? + EntityMetadata( + id: programId, + createdAt: now, + updatedAt: now, + originDeviceId: originDeviceId, + ); + final programExercises = []; + for (var index = 0; index < exercises.length; index++) { + final input = exercises[index]; + final exerciseMetadata = + input.existingMetadata?.touch(now) ?? + _newMetadata(ids, originDeviceId, now); + programExercises.add( + ProgramExercise( + metadata: exerciseMetadata, + programId: programId, + sourceExerciseId: input.sourceExerciseId, + position: index, + exerciseNameSnapshot: input.exerciseNameSnapshot, + exerciseDescriptionSnapshot: input.exerciseDescriptionSnapshot, + exerciseImageMediaIdSnapshot: input.exerciseImageMediaIdSnapshot, + exerciseVideoMediaIdSnapshot: input.exerciseVideoMediaIdSnapshot, + exerciseArchivedSnapshot: input.exerciseArchivedSnapshot, + availableTimeSnapshot: input.availableTimeSnapshot, + availableRepsSnapshot: input.availableRepsSnapshot, + availableScoreSnapshot: input.availableScoreSnapshot, + scoreLabelSnapshot: input.scoreLabelSnapshot, + scoreUnitSnapshot: input.scoreUnitSnapshot, + setsCount: input.setsCount, + timeEnabled: input.enabledMeasures.contains(WorkoutMeasure.time), + repsEnabled: input.enabledMeasures.contains(WorkoutMeasure.reps), + scoreEnabled: input.enabledMeasures.contains(WorkoutMeasure.score), + targetTimeSeconds: input.targetTimeSeconds, + targetReps: input.targetReps, + targetScore: input.targetScore, + restSecondsOverride: input.restSecondsOverride, + ), + ); + } + final program = Program( + metadata: metadata, + name: name, + defaultRestSeconds: defaultRestSeconds, + exercises: programExercises, + ); + await programRepository.replaceExercises(program, now); + return program; + } + + Future addExercise({ + required String programId, + required String exerciseId, + required int position, + required int setsCount, + required Set enabledMeasures, + int? targetTimeSeconds, + int? targetReps, + double? targetScore, + int? restSecondsOverride, + }) async { + final source = await exerciseRepository.findById(exerciseId); + if (source == null) { + throw const DomainException('Exercise not found.'); + } + final now = clock.now(); + final programExercise = ProgramExercise.snapshotFromExercise( + metadata: _newMetadata(ids, originDeviceId, now), + programId: programId, + exercise: source, + position: position, + setsCount: setsCount, + enabledMeasures: enabledMeasures, + targetTimeSeconds: targetTimeSeconds, + targetReps: targetReps, + targetScore: targetScore, + restSecondsOverride: restSecondsOverride, + ); + await programRepository.saveExercise(programExercise); + return programExercise; + } +} + +final class ProgramExerciseConfig { + const ProgramExerciseConfig({ + this.existingMetadata, + this.sourceExerciseId, + required this.exerciseNameSnapshot, + this.exerciseDescriptionSnapshot, + this.exerciseImageMediaIdSnapshot, + this.exerciseVideoMediaIdSnapshot, + this.exerciseArchivedSnapshot = false, + required this.availableTimeSnapshot, + required this.availableRepsSnapshot, + required this.availableScoreSnapshot, + this.scoreLabelSnapshot, + this.scoreUnitSnapshot, + required this.setsCount, + required this.enabledMeasures, + this.targetTimeSeconds, + this.targetReps, + this.targetScore, + this.restSecondsOverride, + }); + + final EntityMetadata? existingMetadata; + final String? sourceExerciseId; + final String exerciseNameSnapshot; + final String? exerciseDescriptionSnapshot; + final String? exerciseImageMediaIdSnapshot; + final String? exerciseVideoMediaIdSnapshot; + final bool exerciseArchivedSnapshot; + final bool availableTimeSnapshot; + final bool availableRepsSnapshot; + final bool availableScoreSnapshot; + final String? scoreLabelSnapshot; + final String? scoreUnitSnapshot; + final int setsCount; + final Set enabledMeasures; + final int? targetTimeSeconds; + final int? targetReps; + final double? targetScore; + final int? restSecondsOverride; +} + +final class WorkoutTemplateUseCases { + const WorkoutTemplateUseCases({ + required this.templateRepository, + required this.programRepository, + required this.clock, + required this.ids, + required this.originDeviceId, + }); + + final WorkoutTemplateRepository templateRepository; + final ProgramRepository programRepository; + final Clock clock; + final IdGenerator ids; + final String originDeviceId; + + Future findById(String id) { + return templateRepository.findById(id); + } + + Future> listActive() { + return templateRepository.listActive(); + } + + Future create({required String name}) async { + final now = clock.now(); + final template = WorkoutTemplate( + metadata: _newMetadata(ids, originDeviceId, now), + name: name, + ); + await templateRepository.save(template); + return template; + } + + Future saveConfigured({ + String? id, + required String name, + required List programs, + required List overrides, + }) async { + final now = clock.now(); + final existing = id == null ? null : await templateRepository.findById(id); + if (id != null && existing == null) { + throw const DomainException('Workout template not found.'); + } + final templateId = id ?? ids.newId(); + final metadata = + existing?.metadata.touch(now) ?? + EntityMetadata( + id: templateId, + createdAt: now, + updatedAt: now, + originDeviceId: originDeviceId, + ); + final templatePrograms = []; + final programIdsByClientKey = {}; + for (var index = 0; index < programs.length; index++) { + final input = programs[index]; + final programMetadata = + input.existingMetadata?.touch(now) ?? + _newMetadata(ids, originDeviceId, now); + programIdsByClientKey[input.clientKey] = programMetadata.id; + templatePrograms.add( + WorkoutTemplateProgram( + metadata: programMetadata, + workoutTemplateId: templateId, + sourceProgramId: input.sourceProgramId, + position: index, + programNameSnapshot: input.programNameSnapshot, + defaultRestSecondsSnapshot: input.defaultRestSecondsSnapshot, + programSnapshotJson: input.programSnapshotJson, + ), + ); + } + final templateOverrides = []; + for (final input in overrides) { + final programInput = programs.firstWhere( + (program) => program.clientKey == input.workoutTemplateProgramClientKey, + orElse: () => + throw const DomainException('Workout template program not found.'), + ); + final workoutTemplateProgramId = + programIdsByClientKey[input.workoutTemplateProgramClientKey]; + if (workoutTemplateProgramId == null) { + throw const DomainException('Workout template program not found.'); + } + _validateOverrideTargets(programInput.programSnapshotJson, input); + templateOverrides.add( + WorkoutTemplateExerciseOverride( + metadata: + input.existingMetadata?.touch(now) ?? + _newMetadata(ids, originDeviceId, now), + workoutTemplateProgramId: workoutTemplateProgramId, + snapshotProgramExerciseId: input.snapshotProgramExerciseId, + setsCountOverride: input.setsCountOverride, + targetTimeSecondsOverride: input.targetTimeSecondsOverride, + targetRepsOverride: input.targetRepsOverride, + targetScoreOverride: input.targetScoreOverride, + ), + ); + } + final template = WorkoutTemplate( + metadata: metadata, + name: name, + lastStartedAt: existing?.lastStartedAt, + programs: templatePrograms, + overrides: templateOverrides, + ); + await templateRepository.replaceComposition(template, now); + return template; + } + + Future addProgramSnapshot({ + required String workoutTemplateId, + required String programId, + required int position, + }) async { + final program = await programRepository.findById(programId); + if (program == null) { + throw const DomainException('Program not found.'); + } + final now = clock.now(); + final snapshot = WorkoutTemplateProgram.snapshotFromProgram( + metadata: _newMetadata(ids, originDeviceId, now), + workoutTemplateId: workoutTemplateId, + program: program, + position: position, + ); + await templateRepository.saveProgram(snapshot); + return snapshot; + } + + Future overrideExerciseTargets({ + required String workoutTemplateProgramId, + required String snapshotProgramExerciseId, + int? setsCountOverride, + int? targetTimeSecondsOverride, + int? targetRepsOverride, + double? targetScoreOverride, + Set? attemptedMeasureOverride, + }) async { + if (attemptedMeasureOverride != null) { + throw const DomainException( + 'Workout templates cannot override active measures.', + ); + } + final now = clock.now(); + final override = WorkoutTemplateExerciseOverride( + metadata: _newMetadata(ids, originDeviceId, now), + workoutTemplateProgramId: workoutTemplateProgramId, + snapshotProgramExerciseId: snapshotProgramExerciseId, + setsCountOverride: setsCountOverride, + targetTimeSecondsOverride: targetTimeSecondsOverride, + targetRepsOverride: targetRepsOverride, + targetScoreOverride: targetScoreOverride, + ); + await templateRepository.saveOverride(override); + return override; + } +} + +final class WorkoutTemplateProgramConfig { + const WorkoutTemplateProgramConfig({ + required this.clientKey, + this.existingMetadata, + this.sourceProgramId, + required this.programNameSnapshot, + required this.defaultRestSecondsSnapshot, + required this.programSnapshotJson, + }); + + final String clientKey; + final EntityMetadata? existingMetadata; + final String? sourceProgramId; + final String programNameSnapshot; + final int defaultRestSecondsSnapshot; + final String programSnapshotJson; +} + +final class WorkoutTemplateExerciseOverrideConfig { + const WorkoutTemplateExerciseOverrideConfig({ + this.existingMetadata, + required this.workoutTemplateProgramClientKey, + required this.snapshotProgramExerciseId, + this.setsCountOverride, + this.targetTimeSecondsOverride, + this.targetRepsOverride, + this.targetScoreOverride, + }); + + final EntityMetadata? existingMetadata; + final String workoutTemplateProgramClientKey; + final String snapshotProgramExerciseId; + final int? setsCountOverride; + final int? targetTimeSecondsOverride; + final int? targetRepsOverride; + final double? targetScoreOverride; +} + +final class ActiveWorkoutSessionUseCases { + const ActiveWorkoutSessionUseCases({ + required this.sessionRepository, + required this.templateRepository, + required this.clock, + required this.ids, + required this.originDeviceId, + }); + + final ActiveSessionRepository sessionRepository; + final WorkoutTemplateRepository templateRepository; + final Clock clock; + final IdGenerator ids; + final String originDeviceId; + + Future findOpen() => sessionRepository.findOpen(); + + Future startFromTemplate(String templateId) async { + final template = await templateRepository.findById(templateId); + if (template == null) { + throw const DomainException('Workout template not found.'); + } + final now = clock.now(); + final session = ActiveWorkoutSession( + metadata: _newMetadata(ids, originDeviceId, now), + sourceWorkoutTemplateId: templateId, + status: ActiveWorkoutStatus.running, + startedAt: now, + lastPersistedAt: now, + elapsedActiveMs: 0, + currentProgramIndex: 0, + currentExerciseIndex: 0, + currentSetIndex: 0, + resolvedTemplateSnapshotJson: jsonEncode({ + 'templateId': template.metadata.id, + 'name': template.name, + 'programs': template.programs + .map( + (program) => { + 'id': program.metadata.id, + 'programNameSnapshot': program.programNameSnapshot, + 'programSnapshotJson': program.programSnapshotJson, + }, + ) + .toList(), + 'overrides': template.overrides + .map( + (override) => { + 'workoutTemplateProgramId': override.workoutTemplateProgramId, + 'snapshotProgramExerciseId': override.snapshotProgramExerciseId, + 'setsCountOverride': override.setsCountOverride, + 'targetTimeSecondsOverride': override.targetTimeSecondsOverride, + 'targetRepsOverride': override.targetRepsOverride, + 'targetScoreOverride': override.targetScoreOverride, + }, + ) + .toList(), + }), + ); + await sessionRepository.save(session); + return session; + } + + Future startFromHistory(WorkoutHistory history) async { + final snapshot = + jsonDecode(history.historySnapshotJson) as Map; + final resolvedTemplateSnapshotJson = + snapshot['resolvedTemplateSnapshotJson'] as String; + final now = clock.now(); + final session = ActiveWorkoutSession( + metadata: _newMetadata(ids, originDeviceId, now), + sourceWorkoutTemplateId: null, + status: ActiveWorkoutStatus.running, + startedAt: now, + lastPersistedAt: now, + elapsedActiveMs: 0, + currentProgramIndex: 0, + currentExerciseIndex: 0, + currentSetIndex: 0, + resolvedTemplateSnapshotJson: resolvedTemplateSnapshotJson, + ); + await sessionRepository.save(session); + return session; + } + + Future pause(String sessionId) async { + final session = await _requiredSession(sessionId); + final paused = session.pause(clock.now()); + await sessionRepository.save(paused); + return paused; + } + + Future resume(String sessionId) async { + final session = await _requiredSession(sessionId); + final resumed = session.resume(clock.now()); + await sessionRepository.save(resumed); + return resumed; + } + + int elapsedActiveMilliseconds(ActiveWorkoutSession session) { + return session.elapsedActiveMillisecondsAt(clock.now()); + } + + Future recordSetResult(ActiveSetResult result) async { + await sessionRepository.saveSetResult(result); + return result; + } + + Future recordCurrentSetResult({ + required String sessionId, + required String programSnapshotId, + required String exerciseSnapshotId, + required int programIndex, + required int exerciseIndex, + required int setIndex, + int? actualTimeMs, + int? actualReps, + double? actualScore, + String? scoreLabelSnapshot, + String? scoreUnitSnapshot, + }) async { + final now = clock.now(); + final result = ActiveSetResult( + metadata: _newMetadata(ids, originDeviceId, now), + activeWorkoutSessionId: sessionId, + programSnapshotId: programSnapshotId, + exerciseSnapshotId: exerciseSnapshotId, + programIndex: programIndex, + exerciseIndex: exerciseIndex, + setIndex: setIndex, + completedAt: now, + actualTimeMs: actualTimeMs, + actualReps: actualReps, + actualScore: actualScore, + scoreLabelSnapshot: scoreLabelSnapshot, + scoreUnitSnapshot: scoreUnitSnapshot, + ); + await sessionRepository.saveSetResult(result); + return result; + } + + Future updateProgress({ + required String sessionId, + required int programIndex, + required int exerciseIndex, + required int setIndex, + }) async { + final session = await _requiredSession(sessionId); + final updated = session.copyWith( + currentProgramIndex: programIndex, + currentExerciseIndex: exerciseIndex, + currentSetIndex: setIndex, + metadata: session.metadata.touch(clock.now()), + ); + await sessionRepository.save(updated); + return updated; + } + + Future quitAndSave(String sessionId) async { + final session = await _requiredSession(sessionId); + final now = clock.now(); + final saved = session.copyWith( + status: ActiveWorkoutStatus.savedExit, + lastPersistedAt: now, + elapsedActiveMs: session.elapsedActiveMillisecondsAt(now), + metadata: session.metadata.touch(now), + ); + await sessionRepository.save(saved); + return saved; + } + + Future abandon(String sessionId) async { + final session = await _requiredSession(sessionId); + final now = clock.now(); + final abandoned = session.copyWith( + status: ActiveWorkoutStatus.abandoned, + endedAt: now, + lastPersistedAt: now, + elapsedActiveMs: session.elapsedActiveMillisecondsAt(now), + metadata: session.metadata.touch(now), + ); + await sessionRepository.save(abandoned); + return abandoned; + } + + Future complete(String sessionId) async { + final session = await _requiredSession(sessionId); + final now = clock.now(); + final completed = session.copyWith( + status: ActiveWorkoutStatus.completed, + endedAt: now, + lastPersistedAt: now, + elapsedActiveMs: session.elapsedActiveMillisecondsAt(now), + metadata: session.metadata.touch(now), + ); + await sessionRepository.save(completed); + return completed; + } + + Future startRestAfterSet({ + required String sessionId, + required int afterProgramIndex, + required int afterExerciseIndex, + required int afterSetIndex, + required int plannedRestSeconds, + int? adjustedRestSeconds, + }) async { + final now = clock.now(); + final rest = ActiveRestState( + metadata: _newMetadata(ids, originDeviceId, now), + activeWorkoutSessionId: sessionId, + afterProgramIndex: afterProgramIndex, + afterExerciseIndex: afterExerciseIndex, + afterSetIndex: afterSetIndex, + plannedRestSeconds: plannedRestSeconds, + adjustedRestSeconds: adjustedRestSeconds ?? plannedRestSeconds, + startedAt: now, + ); + await sessionRepository.saveRestState(rest); + return rest; + } + + Future _requiredSession(String sessionId) async { + final session = await sessionRepository.findById(sessionId); + if (session == null) { + throw const DomainException('Active workout session not found.'); + } + return session; + } +} + +final class CloseWorkoutSessionUseCase { + const CloseWorkoutSessionUseCase({ + required this.sessionRepository, + required this.historyRepository, + required this.clock, + required this.ids, + required this.originDeviceId, + }); + + final ActiveSessionRepository sessionRepository; + final WorkoutHistoryRepository historyRepository; + final Clock clock; + final IdGenerator ids; + final String originDeviceId; + + Future close({ + required String sessionId, + required String nameSnapshot, + required bool completed, + }) async { + final session = await sessionRepository.findById(sessionId); + if (session == null) { + throw const DomainException('Active workout session not found.'); + } + final now = clock.now(); + final results = await sessionRepository.listSetResults(sessionId); + final historyId = ids.newId(); + final historyResults = _historyResultsFromActiveResults( + historyId: historyId, + results: results, + resolvedTemplateSnapshotJson: session.resolvedTemplateSnapshotJson, + now: now, + ids: ids, + originDeviceId: originDeviceId, + ); + final history = WorkoutHistory( + metadata: EntityMetadata( + id: historyId, + createdAt: now, + updatedAt: now, + originDeviceId: originDeviceId, + ), + sourceWorkoutTemplateId: session.sourceWorkoutTemplateId, + sourceActiveWorkoutSessionId: session.metadata.id, + nameSnapshot: nameSnapshot, + startedAt: session.startedAt, + endedAt: now, + totalActiveMs: session.elapsedActiveMillisecondsAt(now), + completed: completed, + historySnapshotJson: jsonEncode({ + 'sessionId': session.metadata.id, + 'resolvedTemplateSnapshotJson': session.resolvedTemplateSnapshotJson, + 'results': results + .map( + (result) => { + 'programSnapshotId': result.programSnapshotId, + 'exerciseSnapshotId': result.exerciseSnapshotId, + 'programIndex': result.programIndex, + 'exerciseIndex': result.exerciseIndex, + 'setIndex': result.setIndex, + 'actualTimeMs': result.actualTimeMs, + 'actualReps': result.actualReps, + 'actualScore': result.actualScore, + 'scoreLabelSnapshot': result.scoreLabelSnapshot, + 'scoreUnitSnapshot': result.scoreUnitSnapshot, + }, + ) + .toList(), + }), + results: historyResults, + ); + await historyRepository.save(history); + return history; + } +} + +final class WorkoutHistoryUseCases { + const WorkoutHistoryUseCases({required this.repository, required this.clock}); + + final WorkoutHistoryRepository repository; + final Clock clock; + + Future findById(String id) => repository.findById(id); + + Future> listActive() => repository.listActive(); + + Future delete(String id) => repository.delete(id, clock.now()); +} + +void _validateOverrideTargets( + String programSnapshotJson, + WorkoutTemplateExerciseOverrideConfig input, +) { + final snapshot = jsonDecode(programSnapshotJson) as Map; + final exercises = (snapshot['exercises'] as List? ?? const []) + .cast>(); + final exercise = exercises.cast?>().firstWhere( + (item) => + item?['id'] == input.snapshotProgramExerciseId || + item?['snapshotProgramExerciseId'] == input.snapshotProgramExerciseId, + orElse: () => null, + ); + if (exercise == null) { + throw const DomainException('Snapshot exercise not found.'); + } + if (input.targetTimeSecondsOverride != null && + exercise['timeEnabled'] != true) { + throw const DomainException('Cannot override inactive time target.'); + } + if (input.targetRepsOverride != null && exercise['repsEnabled'] != true) { + throw const DomainException('Cannot override inactive reps target.'); + } + if (input.targetScoreOverride != null && exercise['scoreEnabled'] != true) { + throw const DomainException('Cannot override inactive score target.'); + } +} + +List _historyResultsFromActiveResults({ + required String historyId, + required List results, + required String resolvedTemplateSnapshotJson, + required DateTime now, + required IdGenerator ids, + required String originDeviceId, +}) { + final snapshots = _exerciseSnapshotsById(resolvedTemplateSnapshotJson); + return results.map((result) { + final snapshot = snapshots[result.exerciseSnapshotId]; + return WorkoutHistorySetResult( + metadata: _newMetadata(ids, originDeviceId, now), + workoutHistoryId: historyId, + programSnapshotId: result.programSnapshotId, + exerciseSnapshotId: result.exerciseSnapshotId, + programIndex: result.programIndex, + exerciseIndex: result.exerciseIndex, + setIndex: result.setIndex, + programNameSnapshot: + snapshot?.programNameSnapshot ?? result.programSnapshotId, + exerciseNameSnapshot: + snapshot?.exerciseNameSnapshot ?? result.exerciseSnapshotId, + timeEnabledSnapshot: snapshot?.timeEnabled ?? result.actualTimeMs != null, + repsEnabledSnapshot: snapshot?.repsEnabled ?? result.actualReps != null, + scoreEnabledSnapshot: + snapshot?.scoreEnabled ?? result.actualScore != null, + targetTimeSecondsSnapshot: snapshot?.targetTimeSeconds, + targetRepsSnapshot: snapshot?.targetReps, + targetScoreSnapshot: snapshot?.targetScore, + actualTimeMs: result.actualTimeMs, + actualReps: result.actualReps, + actualScore: result.actualScore, + scoreLabelSnapshot: + result.scoreLabelSnapshot ?? snapshot?.scoreLabelSnapshot, + scoreUnitSnapshot: + result.scoreUnitSnapshot ?? snapshot?.scoreUnitSnapshot, + startedAt: result.startedAt, + completedAt: result.completedAt, + ); + }).toList(); +} + +Map _exerciseSnapshotsById( + String resolvedTemplateSnapshotJson, +) { + final decoded = + jsonDecode(resolvedTemplateSnapshotJson) as Map; + final programs = (decoded['programs'] as List? ?? const []); + final snapshots = {}; + for (final program in programs.cast>()) { + final programName = program['programNameSnapshot'] as String? ?? ''; + final programSnapshotJson = program['programSnapshotJson'] as String?; + if (programSnapshotJson == null) { + continue; + } + final programSnapshot = + jsonDecode(programSnapshotJson) as Map; + final exercises = + (programSnapshot['exercises'] as List? ?? const []); + for (final exercise in exercises.cast>()) { + final id = exercise['id'] as String?; + if (id == null) { + continue; + } + snapshots[id] = _ResolvedExerciseSnapshot( + programNameSnapshot: programName, + exerciseNameSnapshot: exercise['exerciseNameSnapshot'] as String? ?? id, + timeEnabled: exercise['timeEnabled'] == true, + repsEnabled: exercise['repsEnabled'] == true, + scoreEnabled: exercise['scoreEnabled'] == true, + targetTimeSeconds: exercise['targetTimeSeconds'] as int?, + targetReps: exercise['targetReps'] as int?, + targetScore: (exercise['targetScore'] as num?)?.toDouble(), + scoreLabelSnapshot: exercise['scoreLabelSnapshot'] as String?, + scoreUnitSnapshot: exercise['scoreUnitSnapshot'] as String?, + ); + } + } + return snapshots; +} + +final class _ResolvedExerciseSnapshot { + const _ResolvedExerciseSnapshot({ + required this.programNameSnapshot, + required this.exerciseNameSnapshot, + required this.timeEnabled, + required this.repsEnabled, + required this.scoreEnabled, + this.targetTimeSeconds, + this.targetReps, + this.targetScore, + this.scoreLabelSnapshot, + this.scoreUnitSnapshot, + }); + + final String programNameSnapshot; + final String exerciseNameSnapshot; + final bool timeEnabled; + final bool repsEnabled; + final bool scoreEnabled; + final int? targetTimeSeconds; + final int? targetReps; + final double? targetScore; + final String? scoreLabelSnapshot; + final String? scoreUnitSnapshot; +} + +EntityMetadata _newMetadata( + IdGenerator ids, + String originDeviceId, + DateTime now, +) { + return EntityMetadata( + id: ids.newId(), + createdAt: now, + updatedAt: now, + originDeviceId: originDeviceId, + ); +} diff --git a/lib/domain/domain.dart b/lib/domain/domain.dart new file mode 100644 index 0000000..173f4bd --- /dev/null +++ b/lib/domain/domain.dart @@ -0,0 +1,6 @@ +/// Domain layer entry point. +/// +/// Keep this layer free from Flutter, Drift, platform APIs, and IO. +library; + +export 'entities.dart'; diff --git a/lib/domain/entities.dart b/lib/domain/entities.dart new file mode 100644 index 0000000..85e8d10 --- /dev/null +++ b/lib/domain/entities.dart @@ -0,0 +1,758 @@ +import 'dart:convert'; + +enum SyncState { localOnly, dirty, synced, deleted } + +enum MediaKind { image, video } + +enum WorkoutMeasure { time, reps, score } + +enum ActiveWorkoutStatus { running, paused, savedExit, completed, abandoned } + +final class DomainException implements Exception { + const DomainException(this.message); + + final String message; + + @override + String toString() => message; +} + +final class EntityMetadata { + const EntityMetadata({ + required this.id, + required this.createdAt, + required this.updatedAt, + required this.originDeviceId, + this.deletedAt, + this.schemaVersion = 1, + this.syncState = SyncState.dirty, + this.localRevision = 0, + this.futureOwnerProfileId, + this.lastSyncedAt, + this.remoteRevision, + }); + + final String id; + final DateTime createdAt; + final DateTime updatedAt; + final DateTime? deletedAt; + final int schemaVersion; + final SyncState syncState; + final int localRevision; + final String originDeviceId; + final String? futureOwnerProfileId; + final DateTime? lastSyncedAt; + final String? remoteRevision; + + EntityMetadata touch(DateTime now) { + return copyWith(updatedAt: now, localRevision: localRevision + 1); + } + + EntityMetadata markDeleted(DateTime now) { + return copyWith( + updatedAt: now, + deletedAt: now, + syncState: SyncState.deleted, + localRevision: localRevision + 1, + ); + } + + EntityMetadata copyWith({ + DateTime? createdAt, + DateTime? updatedAt, + DateTime? deletedAt, + int? schemaVersion, + SyncState? syncState, + int? localRevision, + String? originDeviceId, + String? futureOwnerProfileId, + DateTime? lastSyncedAt, + String? remoteRevision, + }) { + return EntityMetadata( + id: id, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt ?? this.deletedAt, + schemaVersion: schemaVersion ?? this.schemaVersion, + syncState: syncState ?? this.syncState, + localRevision: localRevision ?? this.localRevision, + originDeviceId: originDeviceId ?? this.originDeviceId, + futureOwnerProfileId: futureOwnerProfileId ?? this.futureOwnerProfileId, + lastSyncedAt: lastSyncedAt ?? this.lastSyncedAt, + remoteRevision: remoteRevision ?? this.remoteRevision, + ); + } +} + +final class MediaAsset { + const MediaAsset({ + required this.metadata, + required this.kind, + required this.localUri, + this.mimeType, + this.sizeBytes, + this.width, + this.height, + this.durationMs, + this.checksum, + this.remoteUri, + this.thumbnailLocalUri, + }); + + final EntityMetadata metadata; + final MediaKind kind; + final String localUri; + final String? mimeType; + final int? sizeBytes; + final int? width; + final int? height; + final int? durationMs; + final String? checksum; + final String? remoteUri; + final String? thumbnailLocalUri; +} + +final class Exercise { + Exercise({ + required this.metadata, + required String name, + this.description, + this.imageMediaId, + this.videoMediaId, + required this.hasTimeMeasure, + required this.hasRepsMeasure, + required this.hasScoreMeasure, + this.scoreLabel, + this.scoreUnit, + this.archivedAt, + }) : name = _nonBlank(name, 'Exercise name') { + _requireAtLeastOneMeasure( + hasTime: hasTimeMeasure, + hasReps: hasRepsMeasure, + hasScore: hasScoreMeasure, + ); + if (hasScoreMeasure) { + _nonBlank(scoreLabel, 'Score label'); + _nonBlank(scoreUnit, 'Score unit'); + } + } + + final EntityMetadata metadata; + final String name; + final String? description; + final String? imageMediaId; + final String? videoMediaId; + final bool hasTimeMeasure; + final bool hasRepsMeasure; + final bool hasScoreMeasure; + final String? scoreLabel; + final String? scoreUnit; + final DateTime? archivedAt; + + Set get availableMeasures => { + if (hasTimeMeasure) WorkoutMeasure.time, + if (hasRepsMeasure) WorkoutMeasure.reps, + if (hasScoreMeasure) WorkoutMeasure.score, + }; + + Exercise archive(DateTime now) { + return copyWith(archivedAt: now, metadata: metadata.touch(now)); + } + + Exercise copyWith({ + EntityMetadata? metadata, + String? name, + Object? description = _unchanged, + Object? imageMediaId = _unchanged, + Object? videoMediaId = _unchanged, + bool? hasTimeMeasure, + bool? hasRepsMeasure, + bool? hasScoreMeasure, + Object? scoreLabel = _unchanged, + Object? scoreUnit = _unchanged, + Object? archivedAt = _unchanged, + }) { + return Exercise( + metadata: metadata ?? this.metadata, + name: name ?? this.name, + description: description == _unchanged + ? this.description + : description as String?, + imageMediaId: imageMediaId == _unchanged + ? this.imageMediaId + : imageMediaId as String?, + videoMediaId: videoMediaId == _unchanged + ? this.videoMediaId + : videoMediaId as String?, + hasTimeMeasure: hasTimeMeasure ?? this.hasTimeMeasure, + hasRepsMeasure: hasRepsMeasure ?? this.hasRepsMeasure, + hasScoreMeasure: hasScoreMeasure ?? this.hasScoreMeasure, + scoreLabel: scoreLabel == _unchanged + ? this.scoreLabel + : scoreLabel as String?, + scoreUnit: scoreUnit == _unchanged + ? this.scoreUnit + : scoreUnit as String?, + archivedAt: archivedAt == _unchanged + ? this.archivedAt + : archivedAt as DateTime?, + ); + } +} + +const Object _unchanged = Object(); + +final class Program { + Program({ + required this.metadata, + required String name, + required this.defaultRestSeconds, + this.exercises = const [], + }) : name = _nonBlank(name, 'Program name') { + _requireNonNegative(defaultRestSeconds, 'Default rest seconds'); + } + + final EntityMetadata metadata; + final String name; + final int defaultRestSeconds; + final List exercises; + + Program copyWith({ + List? exercises, + EntityMetadata? metadata, + String? name, + int? defaultRestSeconds, + }) { + return Program( + metadata: metadata ?? this.metadata, + name: name ?? this.name, + defaultRestSeconds: defaultRestSeconds ?? this.defaultRestSeconds, + exercises: exercises ?? this.exercises, + ); + } +} + +final class ProgramExercise { + ProgramExercise({ + required this.metadata, + required this.programId, + this.sourceExerciseId, + required this.position, + required String exerciseNameSnapshot, + this.exerciseDescriptionSnapshot, + this.exerciseImageMediaIdSnapshot, + this.exerciseVideoMediaIdSnapshot, + this.exerciseArchivedSnapshot = false, + required this.availableTimeSnapshot, + required this.availableRepsSnapshot, + required this.availableScoreSnapshot, + this.scoreLabelSnapshot, + this.scoreUnitSnapshot, + required this.setsCount, + required this.timeEnabled, + required this.repsEnabled, + required this.scoreEnabled, + this.targetTimeSeconds, + this.targetReps, + this.targetScore, + this.restSecondsOverride, + }) : exerciseNameSnapshot = _nonBlank( + exerciseNameSnapshot, + 'Exercise snapshot name', + ) { + _requireNonNegative(position, 'Position'); + _requirePositive(setsCount, 'Sets count'); + _requireAtLeastOneMeasure( + hasTime: timeEnabled, + hasReps: repsEnabled, + hasScore: scoreEnabled, + ); + if (timeEnabled && !availableTimeSnapshot) { + throw const DomainException('Time is not available on this exercise.'); + } + if (repsEnabled && !availableRepsSnapshot) { + throw const DomainException('Reps are not available on this exercise.'); + } + if (scoreEnabled && !availableScoreSnapshot) { + throw const DomainException('Score is not available on this exercise.'); + } + _requireNullablePositive(targetTimeSeconds, 'Target time seconds'); + _requireNullablePositive(targetReps, 'Target reps'); + _requireNullableNonNegativeDouble(targetScore, 'Target score'); + _requireNullableNonNegative(restSecondsOverride, 'Rest seconds override'); + } + + final EntityMetadata metadata; + final String programId; + final String? sourceExerciseId; + final int position; + final String exerciseNameSnapshot; + final String? exerciseDescriptionSnapshot; + final String? exerciseImageMediaIdSnapshot; + final String? exerciseVideoMediaIdSnapshot; + final bool exerciseArchivedSnapshot; + final bool availableTimeSnapshot; + final bool availableRepsSnapshot; + final bool availableScoreSnapshot; + final String? scoreLabelSnapshot; + final String? scoreUnitSnapshot; + final int setsCount; + final bool timeEnabled; + final bool repsEnabled; + final bool scoreEnabled; + final int? targetTimeSeconds; + final int? targetReps; + final double? targetScore; + final int? restSecondsOverride; + + static ProgramExercise snapshotFromExercise({ + required EntityMetadata metadata, + required String programId, + required Exercise exercise, + required int position, + required int setsCount, + required Set enabledMeasures, + int? targetTimeSeconds, + int? targetReps, + double? targetScore, + int? restSecondsOverride, + }) { + final available = exercise.availableMeasures; + if (!available.containsAll(enabledMeasures)) { + throw const DomainException( + 'Enabled measures must be a subset of exercise measures.', + ); + } + return ProgramExercise( + metadata: metadata, + programId: programId, + sourceExerciseId: exercise.metadata.id, + position: position, + exerciseNameSnapshot: exercise.name, + exerciseDescriptionSnapshot: exercise.description, + exerciseImageMediaIdSnapshot: exercise.imageMediaId, + exerciseVideoMediaIdSnapshot: exercise.videoMediaId, + exerciseArchivedSnapshot: exercise.archivedAt != null, + availableTimeSnapshot: exercise.hasTimeMeasure, + availableRepsSnapshot: exercise.hasRepsMeasure, + availableScoreSnapshot: exercise.hasScoreMeasure, + scoreLabelSnapshot: exercise.scoreLabel, + scoreUnitSnapshot: exercise.scoreUnit, + setsCount: setsCount, + timeEnabled: enabledMeasures.contains(WorkoutMeasure.time), + repsEnabled: enabledMeasures.contains(WorkoutMeasure.reps), + scoreEnabled: enabledMeasures.contains(WorkoutMeasure.score), + targetTimeSeconds: targetTimeSeconds, + targetReps: targetReps, + targetScore: targetScore, + restSecondsOverride: restSecondsOverride, + ); + } + + Map toSnapshotJson() => { + 'id': metadata.id, + 'sourceExerciseId': sourceExerciseId, + 'position': position, + 'exerciseNameSnapshot': exerciseNameSnapshot, + 'exerciseDescriptionSnapshot': exerciseDescriptionSnapshot, + 'exerciseImageMediaIdSnapshot': exerciseImageMediaIdSnapshot, + 'exerciseVideoMediaIdSnapshot': exerciseVideoMediaIdSnapshot, + 'exerciseArchivedSnapshot': exerciseArchivedSnapshot, + 'availableTimeSnapshot': availableTimeSnapshot, + 'availableRepsSnapshot': availableRepsSnapshot, + 'availableScoreSnapshot': availableScoreSnapshot, + 'scoreLabelSnapshot': scoreLabelSnapshot, + 'scoreUnitSnapshot': scoreUnitSnapshot, + 'setsCount': setsCount, + 'timeEnabled': timeEnabled, + 'repsEnabled': repsEnabled, + 'scoreEnabled': scoreEnabled, + 'targetTimeSeconds': targetTimeSeconds, + 'targetReps': targetReps, + 'targetScore': targetScore, + 'restSecondsOverride': restSecondsOverride, + }; +} + +final class WorkoutTemplate { + WorkoutTemplate({ + required this.metadata, + required String name, + this.lastStartedAt, + this.programs = const [], + this.overrides = const [], + }) : name = _nonBlank(name, 'Workout template name'); + + final EntityMetadata metadata; + final String name; + final DateTime? lastStartedAt; + final List programs; + final List overrides; +} + +final class WorkoutTemplateProgram { + WorkoutTemplateProgram({ + required this.metadata, + required this.workoutTemplateId, + this.sourceProgramId, + required this.position, + required String programNameSnapshot, + required this.defaultRestSecondsSnapshot, + required this.programSnapshotJson, + }) : programNameSnapshot = _nonBlank( + programNameSnapshot, + 'Program snapshot name', + ) { + _requireNonNegative(position, 'Position'); + _requireNonNegative(defaultRestSecondsSnapshot, 'Default rest seconds'); + } + + final EntityMetadata metadata; + final String workoutTemplateId; + final String? sourceProgramId; + final int position; + final String programNameSnapshot; + final int defaultRestSecondsSnapshot; + final String programSnapshotJson; + + static WorkoutTemplateProgram snapshotFromProgram({ + required EntityMetadata metadata, + required String workoutTemplateId, + required Program program, + required int position, + }) { + return WorkoutTemplateProgram( + metadata: metadata, + workoutTemplateId: workoutTemplateId, + sourceProgramId: program.metadata.id, + position: position, + programNameSnapshot: program.name, + defaultRestSecondsSnapshot: program.defaultRestSeconds, + programSnapshotJson: jsonEncode({ + 'programId': program.metadata.id, + 'name': program.name, + 'defaultRestSeconds': program.defaultRestSeconds, + 'exercises': program.exercises + .map((exercise) => exercise.toSnapshotJson()) + .toList(), + }), + ); + } +} + +final class WorkoutTemplateExerciseOverride { + WorkoutTemplateExerciseOverride({ + required this.metadata, + required this.workoutTemplateProgramId, + required String snapshotProgramExerciseId, + this.setsCountOverride, + this.targetTimeSecondsOverride, + this.targetRepsOverride, + this.targetScoreOverride, + }) : snapshotProgramExerciseId = _nonBlank( + snapshotProgramExerciseId, + 'Snapshot program exercise id', + ) { + _requireNullablePositive(setsCountOverride, 'Sets count override'); + _requireNullablePositive( + targetTimeSecondsOverride, + 'Target time seconds override', + ); + _requireNullablePositive(targetRepsOverride, 'Target reps override'); + _requireNullableNonNegativeDouble( + targetScoreOverride, + 'Target score override', + ); + } + + final EntityMetadata metadata; + final String workoutTemplateProgramId; + final String snapshotProgramExerciseId; + final int? setsCountOverride; + final int? targetTimeSecondsOverride; + final int? targetRepsOverride; + final double? targetScoreOverride; +} + +final class ActiveWorkoutSession { + ActiveWorkoutSession({ + required this.metadata, + this.sourceWorkoutTemplateId, + required this.status, + required this.startedAt, + this.pausedAt, + this.endedAt, + required this.lastPersistedAt, + required this.elapsedActiveMs, + required this.currentProgramIndex, + required this.currentExerciseIndex, + required this.currentSetIndex, + required this.resolvedTemplateSnapshotJson, + }) { + _requireNonNegative(elapsedActiveMs, 'Elapsed active milliseconds'); + _requireNonNegative(currentProgramIndex, 'Current program index'); + _requireNonNegative(currentExerciseIndex, 'Current exercise index'); + _requireNonNegative(currentSetIndex, 'Current set index'); + } + + final EntityMetadata metadata; + final String? sourceWorkoutTemplateId; + final ActiveWorkoutStatus status; + final DateTime startedAt; + final DateTime? pausedAt; + final DateTime? endedAt; + final DateTime lastPersistedAt; + final int elapsedActiveMs; + final int currentProgramIndex; + final int currentExerciseIndex; + final int currentSetIndex; + final String resolvedTemplateSnapshotJson; + + int elapsedActiveMillisecondsAt(DateTime now) { + if (status != ActiveWorkoutStatus.running) { + return elapsedActiveMs; + } + return elapsedActiveMs + now.difference(lastPersistedAt).inMilliseconds; + } + + ActiveWorkoutSession pause(DateTime now) { + return copyWith( + status: ActiveWorkoutStatus.paused, + pausedAt: now, + lastPersistedAt: now, + elapsedActiveMs: elapsedActiveMillisecondsAt(now), + metadata: metadata.touch(now), + ); + } + + ActiveWorkoutSession resume(DateTime now) { + return ActiveWorkoutSession( + metadata: metadata.touch(now), + sourceWorkoutTemplateId: sourceWorkoutTemplateId, + status: ActiveWorkoutStatus.running, + startedAt: startedAt, + pausedAt: null, + endedAt: endedAt, + lastPersistedAt: now, + elapsedActiveMs: elapsedActiveMs, + currentProgramIndex: currentProgramIndex, + currentExerciseIndex: currentExerciseIndex, + currentSetIndex: currentSetIndex, + resolvedTemplateSnapshotJson: resolvedTemplateSnapshotJson, + ); + } + + ActiveWorkoutSession copyWith({ + EntityMetadata? metadata, + ActiveWorkoutStatus? status, + DateTime? pausedAt, + DateTime? endedAt, + DateTime? lastPersistedAt, + int? elapsedActiveMs, + int? currentProgramIndex, + int? currentExerciseIndex, + int? currentSetIndex, + }) { + return ActiveWorkoutSession( + metadata: metadata ?? this.metadata, + sourceWorkoutTemplateId: sourceWorkoutTemplateId, + status: status ?? this.status, + startedAt: startedAt, + pausedAt: pausedAt, + endedAt: endedAt ?? this.endedAt, + lastPersistedAt: lastPersistedAt ?? this.lastPersistedAt, + elapsedActiveMs: elapsedActiveMs ?? this.elapsedActiveMs, + currentProgramIndex: currentProgramIndex ?? this.currentProgramIndex, + currentExerciseIndex: currentExerciseIndex ?? this.currentExerciseIndex, + currentSetIndex: currentSetIndex ?? this.currentSetIndex, + resolvedTemplateSnapshotJson: resolvedTemplateSnapshotJson, + ); + } +} + +final class ActiveSetResult { + const ActiveSetResult({ + required this.metadata, + required this.activeWorkoutSessionId, + required this.programSnapshotId, + required this.exerciseSnapshotId, + required this.programIndex, + required this.exerciseIndex, + required this.setIndex, + this.startedAt, + this.completedAt, + this.actualTimeMs, + this.actualReps, + this.actualScore, + this.scoreLabelSnapshot, + this.scoreUnitSnapshot, + this.note, + }); + + final EntityMetadata metadata; + final String activeWorkoutSessionId; + final String programSnapshotId; + final String exerciseSnapshotId; + final int programIndex; + final int exerciseIndex; + final int setIndex; + final DateTime? startedAt; + final DateTime? completedAt; + final int? actualTimeMs; + final int? actualReps; + final double? actualScore; + final String? scoreLabelSnapshot; + final String? scoreUnitSnapshot; + final String? note; +} + +final class ActiveRestState { + const ActiveRestState({ + required this.metadata, + required this.activeWorkoutSessionId, + required this.afterProgramIndex, + required this.afterExerciseIndex, + required this.afterSetIndex, + required this.plannedRestSeconds, + required this.adjustedRestSeconds, + required this.startedAt, + this.endedAt, + this.skippedAt, + }); + + final EntityMetadata metadata; + final String activeWorkoutSessionId; + final int afterProgramIndex; + final int afterExerciseIndex; + final int afterSetIndex; + final int plannedRestSeconds; + final int adjustedRestSeconds; + final DateTime startedAt; + final DateTime? endedAt; + final DateTime? skippedAt; +} + +final class WorkoutHistory { + const WorkoutHistory({ + required this.metadata, + this.sourceWorkoutTemplateId, + this.sourceActiveWorkoutSessionId, + required this.nameSnapshot, + required this.startedAt, + required this.endedAt, + required this.totalActiveMs, + required this.completed, + required this.historySnapshotJson, + this.results = const [], + }); + + final EntityMetadata metadata; + final String? sourceWorkoutTemplateId; + final String? sourceActiveWorkoutSessionId; + final String nameSnapshot; + final DateTime startedAt; + final DateTime endedAt; + final int totalActiveMs; + final bool completed; + final String historySnapshotJson; + final List results; +} + +final class WorkoutHistorySetResult { + const WorkoutHistorySetResult({ + required this.metadata, + required this.workoutHistoryId, + required this.programSnapshotId, + required this.exerciseSnapshotId, + required this.programIndex, + required this.exerciseIndex, + required this.setIndex, + required this.programNameSnapshot, + required this.exerciseNameSnapshot, + required this.timeEnabledSnapshot, + required this.repsEnabledSnapshot, + required this.scoreEnabledSnapshot, + this.targetTimeSecondsSnapshot, + this.targetRepsSnapshot, + this.targetScoreSnapshot, + this.actualTimeMs, + this.actualReps, + this.actualScore, + this.scoreLabelSnapshot, + this.scoreUnitSnapshot, + this.startedAt, + this.completedAt, + }); + + final EntityMetadata metadata; + final String workoutHistoryId; + final String programSnapshotId; + final String exerciseSnapshotId; + final int programIndex; + final int exerciseIndex; + final int setIndex; + final String programNameSnapshot; + final String exerciseNameSnapshot; + final bool timeEnabledSnapshot; + final bool repsEnabledSnapshot; + final bool scoreEnabledSnapshot; + final int? targetTimeSecondsSnapshot; + final int? targetRepsSnapshot; + final double? targetScoreSnapshot; + final int? actualTimeMs; + final int? actualReps; + final double? actualScore; + final String? scoreLabelSnapshot; + final String? scoreUnitSnapshot; + final DateTime? startedAt; + final DateTime? completedAt; +} + +String _nonBlank(String? value, String label) { + final trimmed = value?.trim(); + if (trimmed == null || trimmed.isEmpty) { + throw DomainException('$label must not be blank.'); + } + return trimmed; +} + +void _requireAtLeastOneMeasure({ + required bool hasTime, + required bool hasReps, + required bool hasScore, +}) { + if (!hasTime && !hasReps && !hasScore) { + throw const DomainException('At least one measure must be active.'); + } +} + +void _requirePositive(int value, String label) { + if (value <= 0) { + throw DomainException('$label must be positive.'); + } +} + +void _requireNonNegative(int value, String label) { + if (value < 0) { + throw DomainException('$label must not be negative.'); + } +} + +void _requireNullablePositive(int? value, String label) { + if (value != null) { + _requirePositive(value, label); + } +} + +void _requireNullableNonNegative(int? value, String label) { + if (value != null) { + _requireNonNegative(value, label); + } +} + +void _requireNullableNonNegativeDouble(double? value, String label) { + if (value != null && value < 0) { + throw DomainException('$label must not be negative.'); + } +} diff --git a/lib/infrastructure/infrastructure.dart b/lib/infrastructure/infrastructure.dart new file mode 100644 index 0000000..d3e0627 --- /dev/null +++ b/lib/infrastructure/infrastructure.dart @@ -0,0 +1,5 @@ +/// Infrastructure layer entry point. +/// +/// Concrete adapters live here and depend inward on application/domain +/// contracts. +library; diff --git a/lib/infrastructure/local/app_database.dart b/lib/infrastructure/local/app_database.dart new file mode 100644 index 0000000..2750930 --- /dev/null +++ b/lib/infrastructure/local/app_database.dart @@ -0,0 +1,132 @@ +import 'package:drift/drift.dart'; +import 'package:drift_flutter/drift_flutter.dart'; + +import 'tables.dart'; + +part 'app_database.g.dart'; + +@DriftDatabase( + tables: [ + ActiveRestStates, + ActiveSetResults, + ActiveWorkoutSessions, + ChangeLogEntries, + Exercises, + MediaAssets, + ProgramExercises, + Programs, + WorkoutHistories, + WorkoutHistorySetResults, + WorkoutTemplateExerciseOverrides, + WorkoutTemplatePrograms, + WorkoutTemplates, + ], +) +final class AppDatabase extends _$AppDatabase { + AppDatabase(super.executor); + + factory AppDatabase.open() { + return AppDatabase( + driftDatabase( + name: 'gametime', + native: const DriftNativeOptions(shareAcrossIsolates: true), + ), + ); + } + + @override + int get schemaVersion => 1; + + @override + MigrationStrategy get migration { + return MigrationStrategy( + onCreate: (migrator) async { + await migrator.createAll(); + await _createIndexes(); + }, + beforeOpen: (details) async { + await customStatement('PRAGMA foreign_keys = ON'); + }, + ); + } + + Future _createIndexes() async { + for (final tableName in _syncableTableNames) { + await customStatement( + 'CREATE INDEX IF NOT EXISTS idx_${tableName}_deleted_at ' + 'ON $tableName (deleted_at)', + ); + await customStatement( + 'CREATE INDEX IF NOT EXISTS idx_${tableName}_updated_at ' + 'ON $tableName (updated_at)', + ); + await customStatement( + 'CREATE INDEX IF NOT EXISTS idx_${tableName}_sync_state ' + 'ON $tableName (sync_state)', + ); + await customStatement( + 'CREATE INDEX IF NOT EXISTS idx_${tableName}_local_revision ' + 'ON $tableName (local_revision)', + ); + } + + await customStatement( + 'CREATE INDEX IF NOT EXISTS idx_program_exercises_program_id ' + 'ON program_exercises (program_id)', + ); + await customStatement( + 'CREATE INDEX IF NOT EXISTS idx_workout_template_programs_template_id ' + 'ON workout_template_programs (workout_template_id)', + ); + await customStatement( + 'CREATE INDEX IF NOT EXISTS idx_active_set_results_session_id ' + 'ON active_set_results (active_workout_session_id)', + ); + await customStatement( + 'CREATE INDEX IF NOT EXISTS idx_active_rest_states_session_id ' + 'ON active_rest_states (active_workout_session_id)', + ); + await customStatement( + 'CREATE UNIQUE INDEX IF NOT EXISTS ' + 'idx_active_workout_sessions_single_open ' + 'ON active_workout_sessions ((1)) ' + 'WHERE deleted_at IS NULL ' + "AND status IN ('running', 'paused', 'savedExit')", + ); + await customStatement( + 'CREATE INDEX IF NOT EXISTS idx_workout_history_started_at ' + 'ON workout_history (started_at)', + ); + await customStatement( + 'CREATE INDEX IF NOT EXISTS idx_workout_history_set_results_history_id ' + 'ON workout_history_set_results (workout_history_id)', + ); + await customStatement( + 'CREATE INDEX IF NOT EXISTS idx_change_log_entity ' + 'ON change_log (entity_type, entity_id)', + ); + await customStatement( + 'CREATE INDEX IF NOT EXISTS idx_change_log_local_revision ' + 'ON change_log (local_revision)', + ); + await customStatement( + 'CREATE INDEX IF NOT EXISTS idx_change_log_synced_at ' + 'ON change_log (synced_at)', + ); + } +} + +const _syncableTableNames = [ + 'active_rest_states', + 'active_set_results', + 'active_workout_sessions', + 'exercises', + 'media_assets', + 'program_exercises', + 'programs', + 'workout_history', + 'workout_history_set_results', + 'workout_template_exercise_overrides', + 'workout_template_programs', + 'workout_templates', +]; diff --git a/lib/infrastructure/local/app_database.g.dart b/lib/infrastructure/local/app_database.g.dart new file mode 100644 index 0000000..21d43f7 --- /dev/null +++ b/lib/infrastructure/local/app_database.g.dart @@ -0,0 +1,25878 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'app_database.dart'; + +// ignore_for_file: type=lint +class $WorkoutTemplatesTable extends WorkoutTemplates + with TableInfo<$WorkoutTemplatesTable, WorkoutTemplate> { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + $WorkoutTemplatesTable(this.attachedDatabase, [this._alias]); + static const VerificationMeta _idMeta = const VerificationMeta('id'); + @override + late final GeneratedColumn id = GeneratedColumn( + 'id', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _createdAtMeta = const VerificationMeta( + 'createdAt', + ); + @override + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + ); + static const VerificationMeta _updatedAtMeta = const VerificationMeta( + 'updatedAt', + ); + @override + late final GeneratedColumn updatedAt = GeneratedColumn( + 'updated_at', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + ); + static const VerificationMeta _deletedAtMeta = const VerificationMeta( + 'deletedAt', + ); + @override + late final GeneratedColumn deletedAt = GeneratedColumn( + 'deleted_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + static const VerificationMeta _schemaVersionMeta = const VerificationMeta( + 'schemaVersion', + ); + @override + late final GeneratedColumn schemaVersion = GeneratedColumn( + 'schema_version', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultValue: const Constant(1), + ); + static const VerificationMeta _syncStateMeta = const VerificationMeta( + 'syncState', + ); + @override + late final GeneratedColumn syncState = GeneratedColumn( + 'sync_state', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: + 'NOT NULL CHECK (sync_state IN (\'localOnly\', \'dirty\', \'synced\', \'deleted\'))', + ); + static const VerificationMeta _localRevisionMeta = const VerificationMeta( + 'localRevision', + ); + @override + late final GeneratedColumn localRevision = GeneratedColumn( + 'local_revision', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL CHECK (local_revision >= 0)', + ); + static const VerificationMeta _originDeviceIdMeta = const VerificationMeta( + 'originDeviceId', + ); + @override + late final GeneratedColumn originDeviceId = GeneratedColumn( + 'origin_device_id', + aliasedName, + false, + additionalChecks: GeneratedColumn.checkTextLength(minTextLength: 1), + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _futureOwnerProfileIdMeta = + const VerificationMeta('futureOwnerProfileId'); + @override + late final GeneratedColumn futureOwnerProfileId = + GeneratedColumn( + 'future_owner_profile_id', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _lastSyncedAtMeta = const VerificationMeta( + 'lastSyncedAt', + ); + @override + late final GeneratedColumn lastSyncedAt = GeneratedColumn( + 'last_synced_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + static const VerificationMeta _remoteRevisionMeta = const VerificationMeta( + 'remoteRevision', + ); + @override + late final GeneratedColumn remoteRevision = GeneratedColumn( + 'remote_revision', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _nameMeta = const VerificationMeta('name'); + @override + late final GeneratedColumn name = GeneratedColumn( + 'name', + aliasedName, + false, + additionalChecks: GeneratedColumn.checkTextLength(minTextLength: 1), + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _lastStartedAtMeta = const VerificationMeta( + 'lastStartedAt', + ); + @override + late final GeneratedColumn lastStartedAt = + GeneratedColumn( + 'last_started_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + @override + List get $columns => [ + id, + createdAt, + updatedAt, + deletedAt, + schemaVersion, + syncState, + localRevision, + originDeviceId, + futureOwnerProfileId, + lastSyncedAt, + remoteRevision, + name, + lastStartedAt, + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'workout_templates'; + @override + VerificationContext validateIntegrity( + Insertable instance, { + bool isInserting = false, + }) { + final context = VerificationContext(); + final data = instance.toColumns(true); + if (data.containsKey('id')) { + context.handle(_idMeta, id.isAcceptableOrUnknown(data['id']!, _idMeta)); + } else if (isInserting) { + context.missing(_idMeta); + } + if (data.containsKey('created_at')) { + context.handle( + _createdAtMeta, + createdAt.isAcceptableOrUnknown(data['created_at']!, _createdAtMeta), + ); + } else if (isInserting) { + context.missing(_createdAtMeta); + } + if (data.containsKey('updated_at')) { + context.handle( + _updatedAtMeta, + updatedAt.isAcceptableOrUnknown(data['updated_at']!, _updatedAtMeta), + ); + } else if (isInserting) { + context.missing(_updatedAtMeta); + } + if (data.containsKey('deleted_at')) { + context.handle( + _deletedAtMeta, + deletedAt.isAcceptableOrUnknown(data['deleted_at']!, _deletedAtMeta), + ); + } + if (data.containsKey('schema_version')) { + context.handle( + _schemaVersionMeta, + schemaVersion.isAcceptableOrUnknown( + data['schema_version']!, + _schemaVersionMeta, + ), + ); + } + if (data.containsKey('sync_state')) { + context.handle( + _syncStateMeta, + syncState.isAcceptableOrUnknown(data['sync_state']!, _syncStateMeta), + ); + } else if (isInserting) { + context.missing(_syncStateMeta); + } + if (data.containsKey('local_revision')) { + context.handle( + _localRevisionMeta, + localRevision.isAcceptableOrUnknown( + data['local_revision']!, + _localRevisionMeta, + ), + ); + } else if (isInserting) { + context.missing(_localRevisionMeta); + } + if (data.containsKey('origin_device_id')) { + context.handle( + _originDeviceIdMeta, + originDeviceId.isAcceptableOrUnknown( + data['origin_device_id']!, + _originDeviceIdMeta, + ), + ); + } else if (isInserting) { + context.missing(_originDeviceIdMeta); + } + if (data.containsKey('future_owner_profile_id')) { + context.handle( + _futureOwnerProfileIdMeta, + futureOwnerProfileId.isAcceptableOrUnknown( + data['future_owner_profile_id']!, + _futureOwnerProfileIdMeta, + ), + ); + } + if (data.containsKey('last_synced_at')) { + context.handle( + _lastSyncedAtMeta, + lastSyncedAt.isAcceptableOrUnknown( + data['last_synced_at']!, + _lastSyncedAtMeta, + ), + ); + } + if (data.containsKey('remote_revision')) { + context.handle( + _remoteRevisionMeta, + remoteRevision.isAcceptableOrUnknown( + data['remote_revision']!, + _remoteRevisionMeta, + ), + ); + } + if (data.containsKey('name')) { + context.handle( + _nameMeta, + name.isAcceptableOrUnknown(data['name']!, _nameMeta), + ); + } else if (isInserting) { + context.missing(_nameMeta); + } + if (data.containsKey('last_started_at')) { + context.handle( + _lastStartedAtMeta, + lastStartedAt.isAcceptableOrUnknown( + data['last_started_at']!, + _lastStartedAtMeta, + ), + ); + } + return context; + } + + @override + Set get $primaryKey => {id}; + @override + WorkoutTemplate map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return WorkoutTemplate( + id: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}id'], + )!, + createdAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}created_at'], + )!, + updatedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}updated_at'], + )!, + deletedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}deleted_at'], + ), + schemaVersion: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}schema_version'], + )!, + syncState: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}sync_state'], + )!, + localRevision: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}local_revision'], + )!, + originDeviceId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}origin_device_id'], + )!, + futureOwnerProfileId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}future_owner_profile_id'], + ), + lastSyncedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}last_synced_at'], + ), + remoteRevision: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}remote_revision'], + ), + name: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}name'], + )!, + lastStartedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}last_started_at'], + ), + ); + } + + @override + $WorkoutTemplatesTable createAlias(String alias) { + return $WorkoutTemplatesTable(attachedDatabase, alias); + } +} + +class WorkoutTemplate extends DataClass implements Insertable { + final String id; + final DateTime createdAt; + final DateTime updatedAt; + final DateTime? deletedAt; + final int schemaVersion; + final String syncState; + final int localRevision; + final String originDeviceId; + final String? futureOwnerProfileId; + final DateTime? lastSyncedAt; + final String? remoteRevision; + final String name; + final DateTime? lastStartedAt; + const WorkoutTemplate({ + required this.id, + required this.createdAt, + required this.updatedAt, + this.deletedAt, + required this.schemaVersion, + required this.syncState, + required this.localRevision, + required this.originDeviceId, + this.futureOwnerProfileId, + this.lastSyncedAt, + this.remoteRevision, + required this.name, + this.lastStartedAt, + }); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['created_at'] = Variable(createdAt); + map['updated_at'] = Variable(updatedAt); + if (!nullToAbsent || deletedAt != null) { + map['deleted_at'] = Variable(deletedAt); + } + map['schema_version'] = Variable(schemaVersion); + map['sync_state'] = Variable(syncState); + map['local_revision'] = Variable(localRevision); + map['origin_device_id'] = Variable(originDeviceId); + if (!nullToAbsent || futureOwnerProfileId != null) { + map['future_owner_profile_id'] = Variable(futureOwnerProfileId); + } + if (!nullToAbsent || lastSyncedAt != null) { + map['last_synced_at'] = Variable(lastSyncedAt); + } + if (!nullToAbsent || remoteRevision != null) { + map['remote_revision'] = Variable(remoteRevision); + } + map['name'] = Variable(name); + if (!nullToAbsent || lastStartedAt != null) { + map['last_started_at'] = Variable(lastStartedAt); + } + return map; + } + + WorkoutTemplatesCompanion toCompanion(bool nullToAbsent) { + return WorkoutTemplatesCompanion( + id: Value(id), + createdAt: Value(createdAt), + updatedAt: Value(updatedAt), + deletedAt: deletedAt == null && nullToAbsent + ? const Value.absent() + : Value(deletedAt), + schemaVersion: Value(schemaVersion), + syncState: Value(syncState), + localRevision: Value(localRevision), + originDeviceId: Value(originDeviceId), + futureOwnerProfileId: futureOwnerProfileId == null && nullToAbsent + ? const Value.absent() + : Value(futureOwnerProfileId), + lastSyncedAt: lastSyncedAt == null && nullToAbsent + ? const Value.absent() + : Value(lastSyncedAt), + remoteRevision: remoteRevision == null && nullToAbsent + ? const Value.absent() + : Value(remoteRevision), + name: Value(name), + lastStartedAt: lastStartedAt == null && nullToAbsent + ? const Value.absent() + : Value(lastStartedAt), + ); + } + + factory WorkoutTemplate.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return WorkoutTemplate( + id: serializer.fromJson(json['id']), + createdAt: serializer.fromJson(json['createdAt']), + updatedAt: serializer.fromJson(json['updatedAt']), + deletedAt: serializer.fromJson(json['deletedAt']), + schemaVersion: serializer.fromJson(json['schemaVersion']), + syncState: serializer.fromJson(json['syncState']), + localRevision: serializer.fromJson(json['localRevision']), + originDeviceId: serializer.fromJson(json['originDeviceId']), + futureOwnerProfileId: serializer.fromJson( + json['futureOwnerProfileId'], + ), + lastSyncedAt: serializer.fromJson(json['lastSyncedAt']), + remoteRevision: serializer.fromJson(json['remoteRevision']), + name: serializer.fromJson(json['name']), + lastStartedAt: serializer.fromJson(json['lastStartedAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'createdAt': serializer.toJson(createdAt), + 'updatedAt': serializer.toJson(updatedAt), + 'deletedAt': serializer.toJson(deletedAt), + 'schemaVersion': serializer.toJson(schemaVersion), + 'syncState': serializer.toJson(syncState), + 'localRevision': serializer.toJson(localRevision), + 'originDeviceId': serializer.toJson(originDeviceId), + 'futureOwnerProfileId': serializer.toJson(futureOwnerProfileId), + 'lastSyncedAt': serializer.toJson(lastSyncedAt), + 'remoteRevision': serializer.toJson(remoteRevision), + 'name': serializer.toJson(name), + 'lastStartedAt': serializer.toJson(lastStartedAt), + }; + } + + WorkoutTemplate copyWith({ + String? id, + DateTime? createdAt, + DateTime? updatedAt, + Value deletedAt = const Value.absent(), + int? schemaVersion, + String? syncState, + int? localRevision, + String? originDeviceId, + Value futureOwnerProfileId = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + Value remoteRevision = const Value.absent(), + String? name, + Value lastStartedAt = const Value.absent(), + }) => WorkoutTemplate( + id: id ?? this.id, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt.present ? deletedAt.value : this.deletedAt, + schemaVersion: schemaVersion ?? this.schemaVersion, + syncState: syncState ?? this.syncState, + localRevision: localRevision ?? this.localRevision, + originDeviceId: originDeviceId ?? this.originDeviceId, + futureOwnerProfileId: futureOwnerProfileId.present + ? futureOwnerProfileId.value + : this.futureOwnerProfileId, + lastSyncedAt: lastSyncedAt.present ? lastSyncedAt.value : this.lastSyncedAt, + remoteRevision: remoteRevision.present + ? remoteRevision.value + : this.remoteRevision, + name: name ?? this.name, + lastStartedAt: lastStartedAt.present + ? lastStartedAt.value + : this.lastStartedAt, + ); + WorkoutTemplate copyWithCompanion(WorkoutTemplatesCompanion data) { + return WorkoutTemplate( + id: data.id.present ? data.id.value : this.id, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + updatedAt: data.updatedAt.present ? data.updatedAt.value : this.updatedAt, + deletedAt: data.deletedAt.present ? data.deletedAt.value : this.deletedAt, + schemaVersion: data.schemaVersion.present + ? data.schemaVersion.value + : this.schemaVersion, + syncState: data.syncState.present ? data.syncState.value : this.syncState, + localRevision: data.localRevision.present + ? data.localRevision.value + : this.localRevision, + originDeviceId: data.originDeviceId.present + ? data.originDeviceId.value + : this.originDeviceId, + futureOwnerProfileId: data.futureOwnerProfileId.present + ? data.futureOwnerProfileId.value + : this.futureOwnerProfileId, + lastSyncedAt: data.lastSyncedAt.present + ? data.lastSyncedAt.value + : this.lastSyncedAt, + remoteRevision: data.remoteRevision.present + ? data.remoteRevision.value + : this.remoteRevision, + name: data.name.present ? data.name.value : this.name, + lastStartedAt: data.lastStartedAt.present + ? data.lastStartedAt.value + : this.lastStartedAt, + ); + } + + @override + String toString() { + return (StringBuffer('WorkoutTemplate(') + ..write('id: $id, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('schemaVersion: $schemaVersion, ') + ..write('syncState: $syncState, ') + ..write('localRevision: $localRevision, ') + ..write('originDeviceId: $originDeviceId, ') + ..write('futureOwnerProfileId: $futureOwnerProfileId, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('remoteRevision: $remoteRevision, ') + ..write('name: $name, ') + ..write('lastStartedAt: $lastStartedAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash( + id, + createdAt, + updatedAt, + deletedAt, + schemaVersion, + syncState, + localRevision, + originDeviceId, + futureOwnerProfileId, + lastSyncedAt, + remoteRevision, + name, + lastStartedAt, + ); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is WorkoutTemplate && + other.id == this.id && + other.createdAt == this.createdAt && + other.updatedAt == this.updatedAt && + other.deletedAt == this.deletedAt && + other.schemaVersion == this.schemaVersion && + other.syncState == this.syncState && + other.localRevision == this.localRevision && + other.originDeviceId == this.originDeviceId && + other.futureOwnerProfileId == this.futureOwnerProfileId && + other.lastSyncedAt == this.lastSyncedAt && + other.remoteRevision == this.remoteRevision && + other.name == this.name && + other.lastStartedAt == this.lastStartedAt); +} + +class WorkoutTemplatesCompanion extends UpdateCompanion { + final Value id; + final Value createdAt; + final Value updatedAt; + final Value deletedAt; + final Value schemaVersion; + final Value syncState; + final Value localRevision; + final Value originDeviceId; + final Value futureOwnerProfileId; + final Value lastSyncedAt; + final Value remoteRevision; + final Value name; + final Value lastStartedAt; + final Value rowid; + const WorkoutTemplatesCompanion({ + this.id = const Value.absent(), + this.createdAt = const Value.absent(), + this.updatedAt = const Value.absent(), + this.deletedAt = const Value.absent(), + this.schemaVersion = const Value.absent(), + this.syncState = const Value.absent(), + this.localRevision = const Value.absent(), + this.originDeviceId = const Value.absent(), + this.futureOwnerProfileId = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + this.remoteRevision = const Value.absent(), + this.name = const Value.absent(), + this.lastStartedAt = const Value.absent(), + this.rowid = const Value.absent(), + }); + WorkoutTemplatesCompanion.insert({ + required String id, + required DateTime createdAt, + required DateTime updatedAt, + this.deletedAt = const Value.absent(), + this.schemaVersion = const Value.absent(), + required String syncState, + required int localRevision, + required String originDeviceId, + this.futureOwnerProfileId = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + this.remoteRevision = const Value.absent(), + required String name, + this.lastStartedAt = const Value.absent(), + this.rowid = const Value.absent(), + }) : id = Value(id), + createdAt = Value(createdAt), + updatedAt = Value(updatedAt), + syncState = Value(syncState), + localRevision = Value(localRevision), + originDeviceId = Value(originDeviceId), + name = Value(name); + static Insertable custom({ + Expression? id, + Expression? createdAt, + Expression? updatedAt, + Expression? deletedAt, + Expression? schemaVersion, + Expression? syncState, + Expression? localRevision, + Expression? originDeviceId, + Expression? futureOwnerProfileId, + Expression? lastSyncedAt, + Expression? remoteRevision, + Expression? name, + Expression? lastStartedAt, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (createdAt != null) 'created_at': createdAt, + if (updatedAt != null) 'updated_at': updatedAt, + if (deletedAt != null) 'deleted_at': deletedAt, + if (schemaVersion != null) 'schema_version': schemaVersion, + if (syncState != null) 'sync_state': syncState, + if (localRevision != null) 'local_revision': localRevision, + if (originDeviceId != null) 'origin_device_id': originDeviceId, + if (futureOwnerProfileId != null) + 'future_owner_profile_id': futureOwnerProfileId, + if (lastSyncedAt != null) 'last_synced_at': lastSyncedAt, + if (remoteRevision != null) 'remote_revision': remoteRevision, + if (name != null) 'name': name, + if (lastStartedAt != null) 'last_started_at': lastStartedAt, + if (rowid != null) 'rowid': rowid, + }); + } + + WorkoutTemplatesCompanion copyWith({ + Value? id, + Value? createdAt, + Value? updatedAt, + Value? deletedAt, + Value? schemaVersion, + Value? syncState, + Value? localRevision, + Value? originDeviceId, + Value? futureOwnerProfileId, + Value? lastSyncedAt, + Value? remoteRevision, + Value? name, + Value? lastStartedAt, + Value? rowid, + }) { + return WorkoutTemplatesCompanion( + id: id ?? this.id, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt ?? this.deletedAt, + schemaVersion: schemaVersion ?? this.schemaVersion, + syncState: syncState ?? this.syncState, + localRevision: localRevision ?? this.localRevision, + originDeviceId: originDeviceId ?? this.originDeviceId, + futureOwnerProfileId: futureOwnerProfileId ?? this.futureOwnerProfileId, + lastSyncedAt: lastSyncedAt ?? this.lastSyncedAt, + remoteRevision: remoteRevision ?? this.remoteRevision, + name: name ?? this.name, + lastStartedAt: lastStartedAt ?? this.lastStartedAt, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + if (updatedAt.present) { + map['updated_at'] = Variable(updatedAt.value); + } + if (deletedAt.present) { + map['deleted_at'] = Variable(deletedAt.value); + } + if (schemaVersion.present) { + map['schema_version'] = Variable(schemaVersion.value); + } + if (syncState.present) { + map['sync_state'] = Variable(syncState.value); + } + if (localRevision.present) { + map['local_revision'] = Variable(localRevision.value); + } + if (originDeviceId.present) { + map['origin_device_id'] = Variable(originDeviceId.value); + } + if (futureOwnerProfileId.present) { + map['future_owner_profile_id'] = Variable( + futureOwnerProfileId.value, + ); + } + if (lastSyncedAt.present) { + map['last_synced_at'] = Variable(lastSyncedAt.value); + } + if (remoteRevision.present) { + map['remote_revision'] = Variable(remoteRevision.value); + } + if (name.present) { + map['name'] = Variable(name.value); + } + if (lastStartedAt.present) { + map['last_started_at'] = Variable(lastStartedAt.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('WorkoutTemplatesCompanion(') + ..write('id: $id, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('schemaVersion: $schemaVersion, ') + ..write('syncState: $syncState, ') + ..write('localRevision: $localRevision, ') + ..write('originDeviceId: $originDeviceId, ') + ..write('futureOwnerProfileId: $futureOwnerProfileId, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('remoteRevision: $remoteRevision, ') + ..write('name: $name, ') + ..write('lastStartedAt: $lastStartedAt, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class $ActiveWorkoutSessionsTable extends ActiveWorkoutSessions + with TableInfo<$ActiveWorkoutSessionsTable, ActiveWorkoutSession> { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + $ActiveWorkoutSessionsTable(this.attachedDatabase, [this._alias]); + static const VerificationMeta _idMeta = const VerificationMeta('id'); + @override + late final GeneratedColumn id = GeneratedColumn( + 'id', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _createdAtMeta = const VerificationMeta( + 'createdAt', + ); + @override + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + ); + static const VerificationMeta _updatedAtMeta = const VerificationMeta( + 'updatedAt', + ); + @override + late final GeneratedColumn updatedAt = GeneratedColumn( + 'updated_at', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + ); + static const VerificationMeta _deletedAtMeta = const VerificationMeta( + 'deletedAt', + ); + @override + late final GeneratedColumn deletedAt = GeneratedColumn( + 'deleted_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + static const VerificationMeta _schemaVersionMeta = const VerificationMeta( + 'schemaVersion', + ); + @override + late final GeneratedColumn schemaVersion = GeneratedColumn( + 'schema_version', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultValue: const Constant(1), + ); + static const VerificationMeta _syncStateMeta = const VerificationMeta( + 'syncState', + ); + @override + late final GeneratedColumn syncState = GeneratedColumn( + 'sync_state', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: + 'NOT NULL CHECK (sync_state IN (\'localOnly\', \'dirty\', \'synced\', \'deleted\'))', + ); + static const VerificationMeta _localRevisionMeta = const VerificationMeta( + 'localRevision', + ); + @override + late final GeneratedColumn localRevision = GeneratedColumn( + 'local_revision', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL CHECK (local_revision >= 0)', + ); + static const VerificationMeta _originDeviceIdMeta = const VerificationMeta( + 'originDeviceId', + ); + @override + late final GeneratedColumn originDeviceId = GeneratedColumn( + 'origin_device_id', + aliasedName, + false, + additionalChecks: GeneratedColumn.checkTextLength(minTextLength: 1), + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _futureOwnerProfileIdMeta = + const VerificationMeta('futureOwnerProfileId'); + @override + late final GeneratedColumn futureOwnerProfileId = + GeneratedColumn( + 'future_owner_profile_id', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _lastSyncedAtMeta = const VerificationMeta( + 'lastSyncedAt', + ); + @override + late final GeneratedColumn lastSyncedAt = GeneratedColumn( + 'last_synced_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + static const VerificationMeta _remoteRevisionMeta = const VerificationMeta( + 'remoteRevision', + ); + @override + late final GeneratedColumn remoteRevision = GeneratedColumn( + 'remote_revision', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _sourceWorkoutTemplateIdMeta = + const VerificationMeta('sourceWorkoutTemplateId'); + @override + late final GeneratedColumn sourceWorkoutTemplateId = + GeneratedColumn( + 'source_workout_template_id', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'REFERENCES workout_templates (id)', + ), + ); + static const VerificationMeta _statusMeta = const VerificationMeta('status'); + @override + late final GeneratedColumn status = GeneratedColumn( + 'status', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _startedAtMeta = const VerificationMeta( + 'startedAt', + ); + @override + late final GeneratedColumn startedAt = GeneratedColumn( + 'started_at', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + ); + static const VerificationMeta _pausedAtMeta = const VerificationMeta( + 'pausedAt', + ); + @override + late final GeneratedColumn pausedAt = GeneratedColumn( + 'paused_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + static const VerificationMeta _endedAtMeta = const VerificationMeta( + 'endedAt', + ); + @override + late final GeneratedColumn endedAt = GeneratedColumn( + 'ended_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + static const VerificationMeta _lastPersistedAtMeta = const VerificationMeta( + 'lastPersistedAt', + ); + @override + late final GeneratedColumn lastPersistedAt = + GeneratedColumn( + 'last_persisted_at', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + ); + static const VerificationMeta _elapsedActiveMsMeta = const VerificationMeta( + 'elapsedActiveMs', + ); + @override + late final GeneratedColumn elapsedActiveMs = GeneratedColumn( + 'elapsed_active_ms', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + ); + static const VerificationMeta _currentProgramIndexMeta = + const VerificationMeta('currentProgramIndex'); + @override + late final GeneratedColumn currentProgramIndex = GeneratedColumn( + 'current_program_index', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + ); + static const VerificationMeta _currentExerciseIndexMeta = + const VerificationMeta('currentExerciseIndex'); + @override + late final GeneratedColumn currentExerciseIndex = GeneratedColumn( + 'current_exercise_index', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + ); + static const VerificationMeta _currentSetIndexMeta = const VerificationMeta( + 'currentSetIndex', + ); + @override + late final GeneratedColumn currentSetIndex = GeneratedColumn( + 'current_set_index', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + ); + static const VerificationMeta _resolvedTemplateSnapshotJsonMeta = + const VerificationMeta('resolvedTemplateSnapshotJson'); + @override + late final GeneratedColumn resolvedTemplateSnapshotJson = + GeneratedColumn( + 'resolved_template_snapshot_json', + aliasedName, + false, + additionalChecks: GeneratedColumn.checkTextLength(minTextLength: 1), + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + @override + List get $columns => [ + id, + createdAt, + updatedAt, + deletedAt, + schemaVersion, + syncState, + localRevision, + originDeviceId, + futureOwnerProfileId, + lastSyncedAt, + remoteRevision, + sourceWorkoutTemplateId, + status, + startedAt, + pausedAt, + endedAt, + lastPersistedAt, + elapsedActiveMs, + currentProgramIndex, + currentExerciseIndex, + currentSetIndex, + resolvedTemplateSnapshotJson, + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'active_workout_sessions'; + @override + VerificationContext validateIntegrity( + Insertable instance, { + bool isInserting = false, + }) { + final context = VerificationContext(); + final data = instance.toColumns(true); + if (data.containsKey('id')) { + context.handle(_idMeta, id.isAcceptableOrUnknown(data['id']!, _idMeta)); + } else if (isInserting) { + context.missing(_idMeta); + } + if (data.containsKey('created_at')) { + context.handle( + _createdAtMeta, + createdAt.isAcceptableOrUnknown(data['created_at']!, _createdAtMeta), + ); + } else if (isInserting) { + context.missing(_createdAtMeta); + } + if (data.containsKey('updated_at')) { + context.handle( + _updatedAtMeta, + updatedAt.isAcceptableOrUnknown(data['updated_at']!, _updatedAtMeta), + ); + } else if (isInserting) { + context.missing(_updatedAtMeta); + } + if (data.containsKey('deleted_at')) { + context.handle( + _deletedAtMeta, + deletedAt.isAcceptableOrUnknown(data['deleted_at']!, _deletedAtMeta), + ); + } + if (data.containsKey('schema_version')) { + context.handle( + _schemaVersionMeta, + schemaVersion.isAcceptableOrUnknown( + data['schema_version']!, + _schemaVersionMeta, + ), + ); + } + if (data.containsKey('sync_state')) { + context.handle( + _syncStateMeta, + syncState.isAcceptableOrUnknown(data['sync_state']!, _syncStateMeta), + ); + } else if (isInserting) { + context.missing(_syncStateMeta); + } + if (data.containsKey('local_revision')) { + context.handle( + _localRevisionMeta, + localRevision.isAcceptableOrUnknown( + data['local_revision']!, + _localRevisionMeta, + ), + ); + } else if (isInserting) { + context.missing(_localRevisionMeta); + } + if (data.containsKey('origin_device_id')) { + context.handle( + _originDeviceIdMeta, + originDeviceId.isAcceptableOrUnknown( + data['origin_device_id']!, + _originDeviceIdMeta, + ), + ); + } else if (isInserting) { + context.missing(_originDeviceIdMeta); + } + if (data.containsKey('future_owner_profile_id')) { + context.handle( + _futureOwnerProfileIdMeta, + futureOwnerProfileId.isAcceptableOrUnknown( + data['future_owner_profile_id']!, + _futureOwnerProfileIdMeta, + ), + ); + } + if (data.containsKey('last_synced_at')) { + context.handle( + _lastSyncedAtMeta, + lastSyncedAt.isAcceptableOrUnknown( + data['last_synced_at']!, + _lastSyncedAtMeta, + ), + ); + } + if (data.containsKey('remote_revision')) { + context.handle( + _remoteRevisionMeta, + remoteRevision.isAcceptableOrUnknown( + data['remote_revision']!, + _remoteRevisionMeta, + ), + ); + } + if (data.containsKey('source_workout_template_id')) { + context.handle( + _sourceWorkoutTemplateIdMeta, + sourceWorkoutTemplateId.isAcceptableOrUnknown( + data['source_workout_template_id']!, + _sourceWorkoutTemplateIdMeta, + ), + ); + } + if (data.containsKey('status')) { + context.handle( + _statusMeta, + status.isAcceptableOrUnknown(data['status']!, _statusMeta), + ); + } else if (isInserting) { + context.missing(_statusMeta); + } + if (data.containsKey('started_at')) { + context.handle( + _startedAtMeta, + startedAt.isAcceptableOrUnknown(data['started_at']!, _startedAtMeta), + ); + } else if (isInserting) { + context.missing(_startedAtMeta); + } + if (data.containsKey('paused_at')) { + context.handle( + _pausedAtMeta, + pausedAt.isAcceptableOrUnknown(data['paused_at']!, _pausedAtMeta), + ); + } + if (data.containsKey('ended_at')) { + context.handle( + _endedAtMeta, + endedAt.isAcceptableOrUnknown(data['ended_at']!, _endedAtMeta), + ); + } + if (data.containsKey('last_persisted_at')) { + context.handle( + _lastPersistedAtMeta, + lastPersistedAt.isAcceptableOrUnknown( + data['last_persisted_at']!, + _lastPersistedAtMeta, + ), + ); + } else if (isInserting) { + context.missing(_lastPersistedAtMeta); + } + if (data.containsKey('elapsed_active_ms')) { + context.handle( + _elapsedActiveMsMeta, + elapsedActiveMs.isAcceptableOrUnknown( + data['elapsed_active_ms']!, + _elapsedActiveMsMeta, + ), + ); + } else if (isInserting) { + context.missing(_elapsedActiveMsMeta); + } + if (data.containsKey('current_program_index')) { + context.handle( + _currentProgramIndexMeta, + currentProgramIndex.isAcceptableOrUnknown( + data['current_program_index']!, + _currentProgramIndexMeta, + ), + ); + } else if (isInserting) { + context.missing(_currentProgramIndexMeta); + } + if (data.containsKey('current_exercise_index')) { + context.handle( + _currentExerciseIndexMeta, + currentExerciseIndex.isAcceptableOrUnknown( + data['current_exercise_index']!, + _currentExerciseIndexMeta, + ), + ); + } else if (isInserting) { + context.missing(_currentExerciseIndexMeta); + } + if (data.containsKey('current_set_index')) { + context.handle( + _currentSetIndexMeta, + currentSetIndex.isAcceptableOrUnknown( + data['current_set_index']!, + _currentSetIndexMeta, + ), + ); + } else if (isInserting) { + context.missing(_currentSetIndexMeta); + } + if (data.containsKey('resolved_template_snapshot_json')) { + context.handle( + _resolvedTemplateSnapshotJsonMeta, + resolvedTemplateSnapshotJson.isAcceptableOrUnknown( + data['resolved_template_snapshot_json']!, + _resolvedTemplateSnapshotJsonMeta, + ), + ); + } else if (isInserting) { + context.missing(_resolvedTemplateSnapshotJsonMeta); + } + return context; + } + + @override + Set get $primaryKey => {id}; + @override + ActiveWorkoutSession map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return ActiveWorkoutSession( + id: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}id'], + )!, + createdAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}created_at'], + )!, + updatedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}updated_at'], + )!, + deletedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}deleted_at'], + ), + schemaVersion: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}schema_version'], + )!, + syncState: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}sync_state'], + )!, + localRevision: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}local_revision'], + )!, + originDeviceId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}origin_device_id'], + )!, + futureOwnerProfileId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}future_owner_profile_id'], + ), + lastSyncedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}last_synced_at'], + ), + remoteRevision: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}remote_revision'], + ), + sourceWorkoutTemplateId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}source_workout_template_id'], + ), + status: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}status'], + )!, + startedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}started_at'], + )!, + pausedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}paused_at'], + ), + endedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}ended_at'], + ), + lastPersistedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}last_persisted_at'], + )!, + elapsedActiveMs: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}elapsed_active_ms'], + )!, + currentProgramIndex: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}current_program_index'], + )!, + currentExerciseIndex: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}current_exercise_index'], + )!, + currentSetIndex: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}current_set_index'], + )!, + resolvedTemplateSnapshotJson: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}resolved_template_snapshot_json'], + )!, + ); + } + + @override + $ActiveWorkoutSessionsTable createAlias(String alias) { + return $ActiveWorkoutSessionsTable(attachedDatabase, alias); + } +} + +class ActiveWorkoutSession extends DataClass + implements Insertable { + final String id; + final DateTime createdAt; + final DateTime updatedAt; + final DateTime? deletedAt; + final int schemaVersion; + final String syncState; + final int localRevision; + final String originDeviceId; + final String? futureOwnerProfileId; + final DateTime? lastSyncedAt; + final String? remoteRevision; + final String? sourceWorkoutTemplateId; + final String status; + final DateTime startedAt; + final DateTime? pausedAt; + final DateTime? endedAt; + final DateTime lastPersistedAt; + final int elapsedActiveMs; + final int currentProgramIndex; + final int currentExerciseIndex; + final int currentSetIndex; + final String resolvedTemplateSnapshotJson; + const ActiveWorkoutSession({ + required this.id, + required this.createdAt, + required this.updatedAt, + this.deletedAt, + required this.schemaVersion, + required this.syncState, + required this.localRevision, + required this.originDeviceId, + this.futureOwnerProfileId, + this.lastSyncedAt, + this.remoteRevision, + this.sourceWorkoutTemplateId, + required this.status, + required this.startedAt, + this.pausedAt, + this.endedAt, + required this.lastPersistedAt, + required this.elapsedActiveMs, + required this.currentProgramIndex, + required this.currentExerciseIndex, + required this.currentSetIndex, + required this.resolvedTemplateSnapshotJson, + }); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['created_at'] = Variable(createdAt); + map['updated_at'] = Variable(updatedAt); + if (!nullToAbsent || deletedAt != null) { + map['deleted_at'] = Variable(deletedAt); + } + map['schema_version'] = Variable(schemaVersion); + map['sync_state'] = Variable(syncState); + map['local_revision'] = Variable(localRevision); + map['origin_device_id'] = Variable(originDeviceId); + if (!nullToAbsent || futureOwnerProfileId != null) { + map['future_owner_profile_id'] = Variable(futureOwnerProfileId); + } + if (!nullToAbsent || lastSyncedAt != null) { + map['last_synced_at'] = Variable(lastSyncedAt); + } + if (!nullToAbsent || remoteRevision != null) { + map['remote_revision'] = Variable(remoteRevision); + } + if (!nullToAbsent || sourceWorkoutTemplateId != null) { + map['source_workout_template_id'] = Variable( + sourceWorkoutTemplateId, + ); + } + map['status'] = Variable(status); + map['started_at'] = Variable(startedAt); + if (!nullToAbsent || pausedAt != null) { + map['paused_at'] = Variable(pausedAt); + } + if (!nullToAbsent || endedAt != null) { + map['ended_at'] = Variable(endedAt); + } + map['last_persisted_at'] = Variable(lastPersistedAt); + map['elapsed_active_ms'] = Variable(elapsedActiveMs); + map['current_program_index'] = Variable(currentProgramIndex); + map['current_exercise_index'] = Variable(currentExerciseIndex); + map['current_set_index'] = Variable(currentSetIndex); + map['resolved_template_snapshot_json'] = Variable( + resolvedTemplateSnapshotJson, + ); + return map; + } + + ActiveWorkoutSessionsCompanion toCompanion(bool nullToAbsent) { + return ActiveWorkoutSessionsCompanion( + id: Value(id), + createdAt: Value(createdAt), + updatedAt: Value(updatedAt), + deletedAt: deletedAt == null && nullToAbsent + ? const Value.absent() + : Value(deletedAt), + schemaVersion: Value(schemaVersion), + syncState: Value(syncState), + localRevision: Value(localRevision), + originDeviceId: Value(originDeviceId), + futureOwnerProfileId: futureOwnerProfileId == null && nullToAbsent + ? const Value.absent() + : Value(futureOwnerProfileId), + lastSyncedAt: lastSyncedAt == null && nullToAbsent + ? const Value.absent() + : Value(lastSyncedAt), + remoteRevision: remoteRevision == null && nullToAbsent + ? const Value.absent() + : Value(remoteRevision), + sourceWorkoutTemplateId: sourceWorkoutTemplateId == null && nullToAbsent + ? const Value.absent() + : Value(sourceWorkoutTemplateId), + status: Value(status), + startedAt: Value(startedAt), + pausedAt: pausedAt == null && nullToAbsent + ? const Value.absent() + : Value(pausedAt), + endedAt: endedAt == null && nullToAbsent + ? const Value.absent() + : Value(endedAt), + lastPersistedAt: Value(lastPersistedAt), + elapsedActiveMs: Value(elapsedActiveMs), + currentProgramIndex: Value(currentProgramIndex), + currentExerciseIndex: Value(currentExerciseIndex), + currentSetIndex: Value(currentSetIndex), + resolvedTemplateSnapshotJson: Value(resolvedTemplateSnapshotJson), + ); + } + + factory ActiveWorkoutSession.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return ActiveWorkoutSession( + id: serializer.fromJson(json['id']), + createdAt: serializer.fromJson(json['createdAt']), + updatedAt: serializer.fromJson(json['updatedAt']), + deletedAt: serializer.fromJson(json['deletedAt']), + schemaVersion: serializer.fromJson(json['schemaVersion']), + syncState: serializer.fromJson(json['syncState']), + localRevision: serializer.fromJson(json['localRevision']), + originDeviceId: serializer.fromJson(json['originDeviceId']), + futureOwnerProfileId: serializer.fromJson( + json['futureOwnerProfileId'], + ), + lastSyncedAt: serializer.fromJson(json['lastSyncedAt']), + remoteRevision: serializer.fromJson(json['remoteRevision']), + sourceWorkoutTemplateId: serializer.fromJson( + json['sourceWorkoutTemplateId'], + ), + status: serializer.fromJson(json['status']), + startedAt: serializer.fromJson(json['startedAt']), + pausedAt: serializer.fromJson(json['pausedAt']), + endedAt: serializer.fromJson(json['endedAt']), + lastPersistedAt: serializer.fromJson(json['lastPersistedAt']), + elapsedActiveMs: serializer.fromJson(json['elapsedActiveMs']), + currentProgramIndex: serializer.fromJson( + json['currentProgramIndex'], + ), + currentExerciseIndex: serializer.fromJson( + json['currentExerciseIndex'], + ), + currentSetIndex: serializer.fromJson(json['currentSetIndex']), + resolvedTemplateSnapshotJson: serializer.fromJson( + json['resolvedTemplateSnapshotJson'], + ), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'createdAt': serializer.toJson(createdAt), + 'updatedAt': serializer.toJson(updatedAt), + 'deletedAt': serializer.toJson(deletedAt), + 'schemaVersion': serializer.toJson(schemaVersion), + 'syncState': serializer.toJson(syncState), + 'localRevision': serializer.toJson(localRevision), + 'originDeviceId': serializer.toJson(originDeviceId), + 'futureOwnerProfileId': serializer.toJson(futureOwnerProfileId), + 'lastSyncedAt': serializer.toJson(lastSyncedAt), + 'remoteRevision': serializer.toJson(remoteRevision), + 'sourceWorkoutTemplateId': serializer.toJson( + sourceWorkoutTemplateId, + ), + 'status': serializer.toJson(status), + 'startedAt': serializer.toJson(startedAt), + 'pausedAt': serializer.toJson(pausedAt), + 'endedAt': serializer.toJson(endedAt), + 'lastPersistedAt': serializer.toJson(lastPersistedAt), + 'elapsedActiveMs': serializer.toJson(elapsedActiveMs), + 'currentProgramIndex': serializer.toJson(currentProgramIndex), + 'currentExerciseIndex': serializer.toJson(currentExerciseIndex), + 'currentSetIndex': serializer.toJson(currentSetIndex), + 'resolvedTemplateSnapshotJson': serializer.toJson( + resolvedTemplateSnapshotJson, + ), + }; + } + + ActiveWorkoutSession copyWith({ + String? id, + DateTime? createdAt, + DateTime? updatedAt, + Value deletedAt = const Value.absent(), + int? schemaVersion, + String? syncState, + int? localRevision, + String? originDeviceId, + Value futureOwnerProfileId = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + Value remoteRevision = const Value.absent(), + Value sourceWorkoutTemplateId = const Value.absent(), + String? status, + DateTime? startedAt, + Value pausedAt = const Value.absent(), + Value endedAt = const Value.absent(), + DateTime? lastPersistedAt, + int? elapsedActiveMs, + int? currentProgramIndex, + int? currentExerciseIndex, + int? currentSetIndex, + String? resolvedTemplateSnapshotJson, + }) => ActiveWorkoutSession( + id: id ?? this.id, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt.present ? deletedAt.value : this.deletedAt, + schemaVersion: schemaVersion ?? this.schemaVersion, + syncState: syncState ?? this.syncState, + localRevision: localRevision ?? this.localRevision, + originDeviceId: originDeviceId ?? this.originDeviceId, + futureOwnerProfileId: futureOwnerProfileId.present + ? futureOwnerProfileId.value + : this.futureOwnerProfileId, + lastSyncedAt: lastSyncedAt.present ? lastSyncedAt.value : this.lastSyncedAt, + remoteRevision: remoteRevision.present + ? remoteRevision.value + : this.remoteRevision, + sourceWorkoutTemplateId: sourceWorkoutTemplateId.present + ? sourceWorkoutTemplateId.value + : this.sourceWorkoutTemplateId, + status: status ?? this.status, + startedAt: startedAt ?? this.startedAt, + pausedAt: pausedAt.present ? pausedAt.value : this.pausedAt, + endedAt: endedAt.present ? endedAt.value : this.endedAt, + lastPersistedAt: lastPersistedAt ?? this.lastPersistedAt, + elapsedActiveMs: elapsedActiveMs ?? this.elapsedActiveMs, + currentProgramIndex: currentProgramIndex ?? this.currentProgramIndex, + currentExerciseIndex: currentExerciseIndex ?? this.currentExerciseIndex, + currentSetIndex: currentSetIndex ?? this.currentSetIndex, + resolvedTemplateSnapshotJson: + resolvedTemplateSnapshotJson ?? this.resolvedTemplateSnapshotJson, + ); + ActiveWorkoutSession copyWithCompanion(ActiveWorkoutSessionsCompanion data) { + return ActiveWorkoutSession( + id: data.id.present ? data.id.value : this.id, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + updatedAt: data.updatedAt.present ? data.updatedAt.value : this.updatedAt, + deletedAt: data.deletedAt.present ? data.deletedAt.value : this.deletedAt, + schemaVersion: data.schemaVersion.present + ? data.schemaVersion.value + : this.schemaVersion, + syncState: data.syncState.present ? data.syncState.value : this.syncState, + localRevision: data.localRevision.present + ? data.localRevision.value + : this.localRevision, + originDeviceId: data.originDeviceId.present + ? data.originDeviceId.value + : this.originDeviceId, + futureOwnerProfileId: data.futureOwnerProfileId.present + ? data.futureOwnerProfileId.value + : this.futureOwnerProfileId, + lastSyncedAt: data.lastSyncedAt.present + ? data.lastSyncedAt.value + : this.lastSyncedAt, + remoteRevision: data.remoteRevision.present + ? data.remoteRevision.value + : this.remoteRevision, + sourceWorkoutTemplateId: data.sourceWorkoutTemplateId.present + ? data.sourceWorkoutTemplateId.value + : this.sourceWorkoutTemplateId, + status: data.status.present ? data.status.value : this.status, + startedAt: data.startedAt.present ? data.startedAt.value : this.startedAt, + pausedAt: data.pausedAt.present ? data.pausedAt.value : this.pausedAt, + endedAt: data.endedAt.present ? data.endedAt.value : this.endedAt, + lastPersistedAt: data.lastPersistedAt.present + ? data.lastPersistedAt.value + : this.lastPersistedAt, + elapsedActiveMs: data.elapsedActiveMs.present + ? data.elapsedActiveMs.value + : this.elapsedActiveMs, + currentProgramIndex: data.currentProgramIndex.present + ? data.currentProgramIndex.value + : this.currentProgramIndex, + currentExerciseIndex: data.currentExerciseIndex.present + ? data.currentExerciseIndex.value + : this.currentExerciseIndex, + currentSetIndex: data.currentSetIndex.present + ? data.currentSetIndex.value + : this.currentSetIndex, + resolvedTemplateSnapshotJson: data.resolvedTemplateSnapshotJson.present + ? data.resolvedTemplateSnapshotJson.value + : this.resolvedTemplateSnapshotJson, + ); + } + + @override + String toString() { + return (StringBuffer('ActiveWorkoutSession(') + ..write('id: $id, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('schemaVersion: $schemaVersion, ') + ..write('syncState: $syncState, ') + ..write('localRevision: $localRevision, ') + ..write('originDeviceId: $originDeviceId, ') + ..write('futureOwnerProfileId: $futureOwnerProfileId, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('remoteRevision: $remoteRevision, ') + ..write('sourceWorkoutTemplateId: $sourceWorkoutTemplateId, ') + ..write('status: $status, ') + ..write('startedAt: $startedAt, ') + ..write('pausedAt: $pausedAt, ') + ..write('endedAt: $endedAt, ') + ..write('lastPersistedAt: $lastPersistedAt, ') + ..write('elapsedActiveMs: $elapsedActiveMs, ') + ..write('currentProgramIndex: $currentProgramIndex, ') + ..write('currentExerciseIndex: $currentExerciseIndex, ') + ..write('currentSetIndex: $currentSetIndex, ') + ..write('resolvedTemplateSnapshotJson: $resolvedTemplateSnapshotJson') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hashAll([ + id, + createdAt, + updatedAt, + deletedAt, + schemaVersion, + syncState, + localRevision, + originDeviceId, + futureOwnerProfileId, + lastSyncedAt, + remoteRevision, + sourceWorkoutTemplateId, + status, + startedAt, + pausedAt, + endedAt, + lastPersistedAt, + elapsedActiveMs, + currentProgramIndex, + currentExerciseIndex, + currentSetIndex, + resolvedTemplateSnapshotJson, + ]); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is ActiveWorkoutSession && + other.id == this.id && + other.createdAt == this.createdAt && + other.updatedAt == this.updatedAt && + other.deletedAt == this.deletedAt && + other.schemaVersion == this.schemaVersion && + other.syncState == this.syncState && + other.localRevision == this.localRevision && + other.originDeviceId == this.originDeviceId && + other.futureOwnerProfileId == this.futureOwnerProfileId && + other.lastSyncedAt == this.lastSyncedAt && + other.remoteRevision == this.remoteRevision && + other.sourceWorkoutTemplateId == this.sourceWorkoutTemplateId && + other.status == this.status && + other.startedAt == this.startedAt && + other.pausedAt == this.pausedAt && + other.endedAt == this.endedAt && + other.lastPersistedAt == this.lastPersistedAt && + other.elapsedActiveMs == this.elapsedActiveMs && + other.currentProgramIndex == this.currentProgramIndex && + other.currentExerciseIndex == this.currentExerciseIndex && + other.currentSetIndex == this.currentSetIndex && + other.resolvedTemplateSnapshotJson == + this.resolvedTemplateSnapshotJson); +} + +class ActiveWorkoutSessionsCompanion + extends UpdateCompanion { + final Value id; + final Value createdAt; + final Value updatedAt; + final Value deletedAt; + final Value schemaVersion; + final Value syncState; + final Value localRevision; + final Value originDeviceId; + final Value futureOwnerProfileId; + final Value lastSyncedAt; + final Value remoteRevision; + final Value sourceWorkoutTemplateId; + final Value status; + final Value startedAt; + final Value pausedAt; + final Value endedAt; + final Value lastPersistedAt; + final Value elapsedActiveMs; + final Value currentProgramIndex; + final Value currentExerciseIndex; + final Value currentSetIndex; + final Value resolvedTemplateSnapshotJson; + final Value rowid; + const ActiveWorkoutSessionsCompanion({ + this.id = const Value.absent(), + this.createdAt = const Value.absent(), + this.updatedAt = const Value.absent(), + this.deletedAt = const Value.absent(), + this.schemaVersion = const Value.absent(), + this.syncState = const Value.absent(), + this.localRevision = const Value.absent(), + this.originDeviceId = const Value.absent(), + this.futureOwnerProfileId = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + this.remoteRevision = const Value.absent(), + this.sourceWorkoutTemplateId = const Value.absent(), + this.status = const Value.absent(), + this.startedAt = const Value.absent(), + this.pausedAt = const Value.absent(), + this.endedAt = const Value.absent(), + this.lastPersistedAt = const Value.absent(), + this.elapsedActiveMs = const Value.absent(), + this.currentProgramIndex = const Value.absent(), + this.currentExerciseIndex = const Value.absent(), + this.currentSetIndex = const Value.absent(), + this.resolvedTemplateSnapshotJson = const Value.absent(), + this.rowid = const Value.absent(), + }); + ActiveWorkoutSessionsCompanion.insert({ + required String id, + required DateTime createdAt, + required DateTime updatedAt, + this.deletedAt = const Value.absent(), + this.schemaVersion = const Value.absent(), + required String syncState, + required int localRevision, + required String originDeviceId, + this.futureOwnerProfileId = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + this.remoteRevision = const Value.absent(), + this.sourceWorkoutTemplateId = const Value.absent(), + required String status, + required DateTime startedAt, + this.pausedAt = const Value.absent(), + this.endedAt = const Value.absent(), + required DateTime lastPersistedAt, + required int elapsedActiveMs, + required int currentProgramIndex, + required int currentExerciseIndex, + required int currentSetIndex, + required String resolvedTemplateSnapshotJson, + this.rowid = const Value.absent(), + }) : id = Value(id), + createdAt = Value(createdAt), + updatedAt = Value(updatedAt), + syncState = Value(syncState), + localRevision = Value(localRevision), + originDeviceId = Value(originDeviceId), + status = Value(status), + startedAt = Value(startedAt), + lastPersistedAt = Value(lastPersistedAt), + elapsedActiveMs = Value(elapsedActiveMs), + currentProgramIndex = Value(currentProgramIndex), + currentExerciseIndex = Value(currentExerciseIndex), + currentSetIndex = Value(currentSetIndex), + resolvedTemplateSnapshotJson = Value(resolvedTemplateSnapshotJson); + static Insertable custom({ + Expression? id, + Expression? createdAt, + Expression? updatedAt, + Expression? deletedAt, + Expression? schemaVersion, + Expression? syncState, + Expression? localRevision, + Expression? originDeviceId, + Expression? futureOwnerProfileId, + Expression? lastSyncedAt, + Expression? remoteRevision, + Expression? sourceWorkoutTemplateId, + Expression? status, + Expression? startedAt, + Expression? pausedAt, + Expression? endedAt, + Expression? lastPersistedAt, + Expression? elapsedActiveMs, + Expression? currentProgramIndex, + Expression? currentExerciseIndex, + Expression? currentSetIndex, + Expression? resolvedTemplateSnapshotJson, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (createdAt != null) 'created_at': createdAt, + if (updatedAt != null) 'updated_at': updatedAt, + if (deletedAt != null) 'deleted_at': deletedAt, + if (schemaVersion != null) 'schema_version': schemaVersion, + if (syncState != null) 'sync_state': syncState, + if (localRevision != null) 'local_revision': localRevision, + if (originDeviceId != null) 'origin_device_id': originDeviceId, + if (futureOwnerProfileId != null) + 'future_owner_profile_id': futureOwnerProfileId, + if (lastSyncedAt != null) 'last_synced_at': lastSyncedAt, + if (remoteRevision != null) 'remote_revision': remoteRevision, + if (sourceWorkoutTemplateId != null) + 'source_workout_template_id': sourceWorkoutTemplateId, + if (status != null) 'status': status, + if (startedAt != null) 'started_at': startedAt, + if (pausedAt != null) 'paused_at': pausedAt, + if (endedAt != null) 'ended_at': endedAt, + if (lastPersistedAt != null) 'last_persisted_at': lastPersistedAt, + if (elapsedActiveMs != null) 'elapsed_active_ms': elapsedActiveMs, + if (currentProgramIndex != null) + 'current_program_index': currentProgramIndex, + if (currentExerciseIndex != null) + 'current_exercise_index': currentExerciseIndex, + if (currentSetIndex != null) 'current_set_index': currentSetIndex, + if (resolvedTemplateSnapshotJson != null) + 'resolved_template_snapshot_json': resolvedTemplateSnapshotJson, + if (rowid != null) 'rowid': rowid, + }); + } + + ActiveWorkoutSessionsCompanion copyWith({ + Value? id, + Value? createdAt, + Value? updatedAt, + Value? deletedAt, + Value? schemaVersion, + Value? syncState, + Value? localRevision, + Value? originDeviceId, + Value? futureOwnerProfileId, + Value? lastSyncedAt, + Value? remoteRevision, + Value? sourceWorkoutTemplateId, + Value? status, + Value? startedAt, + Value? pausedAt, + Value? endedAt, + Value? lastPersistedAt, + Value? elapsedActiveMs, + Value? currentProgramIndex, + Value? currentExerciseIndex, + Value? currentSetIndex, + Value? resolvedTemplateSnapshotJson, + Value? rowid, + }) { + return ActiveWorkoutSessionsCompanion( + id: id ?? this.id, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt ?? this.deletedAt, + schemaVersion: schemaVersion ?? this.schemaVersion, + syncState: syncState ?? this.syncState, + localRevision: localRevision ?? this.localRevision, + originDeviceId: originDeviceId ?? this.originDeviceId, + futureOwnerProfileId: futureOwnerProfileId ?? this.futureOwnerProfileId, + lastSyncedAt: lastSyncedAt ?? this.lastSyncedAt, + remoteRevision: remoteRevision ?? this.remoteRevision, + sourceWorkoutTemplateId: + sourceWorkoutTemplateId ?? this.sourceWorkoutTemplateId, + status: status ?? this.status, + startedAt: startedAt ?? this.startedAt, + pausedAt: pausedAt ?? this.pausedAt, + endedAt: endedAt ?? this.endedAt, + lastPersistedAt: lastPersistedAt ?? this.lastPersistedAt, + elapsedActiveMs: elapsedActiveMs ?? this.elapsedActiveMs, + currentProgramIndex: currentProgramIndex ?? this.currentProgramIndex, + currentExerciseIndex: currentExerciseIndex ?? this.currentExerciseIndex, + currentSetIndex: currentSetIndex ?? this.currentSetIndex, + resolvedTemplateSnapshotJson: + resolvedTemplateSnapshotJson ?? this.resolvedTemplateSnapshotJson, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + if (updatedAt.present) { + map['updated_at'] = Variable(updatedAt.value); + } + if (deletedAt.present) { + map['deleted_at'] = Variable(deletedAt.value); + } + if (schemaVersion.present) { + map['schema_version'] = Variable(schemaVersion.value); + } + if (syncState.present) { + map['sync_state'] = Variable(syncState.value); + } + if (localRevision.present) { + map['local_revision'] = Variable(localRevision.value); + } + if (originDeviceId.present) { + map['origin_device_id'] = Variable(originDeviceId.value); + } + if (futureOwnerProfileId.present) { + map['future_owner_profile_id'] = Variable( + futureOwnerProfileId.value, + ); + } + if (lastSyncedAt.present) { + map['last_synced_at'] = Variable(lastSyncedAt.value); + } + if (remoteRevision.present) { + map['remote_revision'] = Variable(remoteRevision.value); + } + if (sourceWorkoutTemplateId.present) { + map['source_workout_template_id'] = Variable( + sourceWorkoutTemplateId.value, + ); + } + if (status.present) { + map['status'] = Variable(status.value); + } + if (startedAt.present) { + map['started_at'] = Variable(startedAt.value); + } + if (pausedAt.present) { + map['paused_at'] = Variable(pausedAt.value); + } + if (endedAt.present) { + map['ended_at'] = Variable(endedAt.value); + } + if (lastPersistedAt.present) { + map['last_persisted_at'] = Variable(lastPersistedAt.value); + } + if (elapsedActiveMs.present) { + map['elapsed_active_ms'] = Variable(elapsedActiveMs.value); + } + if (currentProgramIndex.present) { + map['current_program_index'] = Variable(currentProgramIndex.value); + } + if (currentExerciseIndex.present) { + map['current_exercise_index'] = Variable(currentExerciseIndex.value); + } + if (currentSetIndex.present) { + map['current_set_index'] = Variable(currentSetIndex.value); + } + if (resolvedTemplateSnapshotJson.present) { + map['resolved_template_snapshot_json'] = Variable( + resolvedTemplateSnapshotJson.value, + ); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('ActiveWorkoutSessionsCompanion(') + ..write('id: $id, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('schemaVersion: $schemaVersion, ') + ..write('syncState: $syncState, ') + ..write('localRevision: $localRevision, ') + ..write('originDeviceId: $originDeviceId, ') + ..write('futureOwnerProfileId: $futureOwnerProfileId, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('remoteRevision: $remoteRevision, ') + ..write('sourceWorkoutTemplateId: $sourceWorkoutTemplateId, ') + ..write('status: $status, ') + ..write('startedAt: $startedAt, ') + ..write('pausedAt: $pausedAt, ') + ..write('endedAt: $endedAt, ') + ..write('lastPersistedAt: $lastPersistedAt, ') + ..write('elapsedActiveMs: $elapsedActiveMs, ') + ..write('currentProgramIndex: $currentProgramIndex, ') + ..write('currentExerciseIndex: $currentExerciseIndex, ') + ..write('currentSetIndex: $currentSetIndex, ') + ..write( + 'resolvedTemplateSnapshotJson: $resolvedTemplateSnapshotJson, ', + ) + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class $ActiveRestStatesTable extends ActiveRestStates + with TableInfo<$ActiveRestStatesTable, ActiveRestState> { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + $ActiveRestStatesTable(this.attachedDatabase, [this._alias]); + static const VerificationMeta _idMeta = const VerificationMeta('id'); + @override + late final GeneratedColumn id = GeneratedColumn( + 'id', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _createdAtMeta = const VerificationMeta( + 'createdAt', + ); + @override + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + ); + static const VerificationMeta _updatedAtMeta = const VerificationMeta( + 'updatedAt', + ); + @override + late final GeneratedColumn updatedAt = GeneratedColumn( + 'updated_at', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + ); + static const VerificationMeta _deletedAtMeta = const VerificationMeta( + 'deletedAt', + ); + @override + late final GeneratedColumn deletedAt = GeneratedColumn( + 'deleted_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + static const VerificationMeta _schemaVersionMeta = const VerificationMeta( + 'schemaVersion', + ); + @override + late final GeneratedColumn schemaVersion = GeneratedColumn( + 'schema_version', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultValue: const Constant(1), + ); + static const VerificationMeta _syncStateMeta = const VerificationMeta( + 'syncState', + ); + @override + late final GeneratedColumn syncState = GeneratedColumn( + 'sync_state', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: + 'NOT NULL CHECK (sync_state IN (\'localOnly\', \'dirty\', \'synced\', \'deleted\'))', + ); + static const VerificationMeta _localRevisionMeta = const VerificationMeta( + 'localRevision', + ); + @override + late final GeneratedColumn localRevision = GeneratedColumn( + 'local_revision', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL CHECK (local_revision >= 0)', + ); + static const VerificationMeta _originDeviceIdMeta = const VerificationMeta( + 'originDeviceId', + ); + @override + late final GeneratedColumn originDeviceId = GeneratedColumn( + 'origin_device_id', + aliasedName, + false, + additionalChecks: GeneratedColumn.checkTextLength(minTextLength: 1), + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _futureOwnerProfileIdMeta = + const VerificationMeta('futureOwnerProfileId'); + @override + late final GeneratedColumn futureOwnerProfileId = + GeneratedColumn( + 'future_owner_profile_id', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _lastSyncedAtMeta = const VerificationMeta( + 'lastSyncedAt', + ); + @override + late final GeneratedColumn lastSyncedAt = GeneratedColumn( + 'last_synced_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + static const VerificationMeta _remoteRevisionMeta = const VerificationMeta( + 'remoteRevision', + ); + @override + late final GeneratedColumn remoteRevision = GeneratedColumn( + 'remote_revision', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _activeWorkoutSessionIdMeta = + const VerificationMeta('activeWorkoutSessionId'); + @override + late final GeneratedColumn activeWorkoutSessionId = + GeneratedColumn( + 'active_workout_session_id', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'REFERENCES active_workout_sessions (id)', + ), + ); + static const VerificationMeta _afterProgramIndexMeta = const VerificationMeta( + 'afterProgramIndex', + ); + @override + late final GeneratedColumn afterProgramIndex = GeneratedColumn( + 'after_program_index', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + ); + static const VerificationMeta _afterExerciseIndexMeta = + const VerificationMeta('afterExerciseIndex'); + @override + late final GeneratedColumn afterExerciseIndex = GeneratedColumn( + 'after_exercise_index', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + ); + static const VerificationMeta _afterSetIndexMeta = const VerificationMeta( + 'afterSetIndex', + ); + @override + late final GeneratedColumn afterSetIndex = GeneratedColumn( + 'after_set_index', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + ); + static const VerificationMeta _plannedRestSecondsMeta = + const VerificationMeta('plannedRestSeconds'); + @override + late final GeneratedColumn plannedRestSeconds = GeneratedColumn( + 'planned_rest_seconds', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + ); + static const VerificationMeta _adjustedRestSecondsMeta = + const VerificationMeta('adjustedRestSeconds'); + @override + late final GeneratedColumn adjustedRestSeconds = GeneratedColumn( + 'adjusted_rest_seconds', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + ); + static const VerificationMeta _startedAtMeta = const VerificationMeta( + 'startedAt', + ); + @override + late final GeneratedColumn startedAt = GeneratedColumn( + 'started_at', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + ); + static const VerificationMeta _endedAtMeta = const VerificationMeta( + 'endedAt', + ); + @override + late final GeneratedColumn endedAt = GeneratedColumn( + 'ended_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + static const VerificationMeta _skippedAtMeta = const VerificationMeta( + 'skippedAt', + ); + @override + late final GeneratedColumn skippedAt = GeneratedColumn( + 'skipped_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + @override + List get $columns => [ + id, + createdAt, + updatedAt, + deletedAt, + schemaVersion, + syncState, + localRevision, + originDeviceId, + futureOwnerProfileId, + lastSyncedAt, + remoteRevision, + activeWorkoutSessionId, + afterProgramIndex, + afterExerciseIndex, + afterSetIndex, + plannedRestSeconds, + adjustedRestSeconds, + startedAt, + endedAt, + skippedAt, + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'active_rest_states'; + @override + VerificationContext validateIntegrity( + Insertable instance, { + bool isInserting = false, + }) { + final context = VerificationContext(); + final data = instance.toColumns(true); + if (data.containsKey('id')) { + context.handle(_idMeta, id.isAcceptableOrUnknown(data['id']!, _idMeta)); + } else if (isInserting) { + context.missing(_idMeta); + } + if (data.containsKey('created_at')) { + context.handle( + _createdAtMeta, + createdAt.isAcceptableOrUnknown(data['created_at']!, _createdAtMeta), + ); + } else if (isInserting) { + context.missing(_createdAtMeta); + } + if (data.containsKey('updated_at')) { + context.handle( + _updatedAtMeta, + updatedAt.isAcceptableOrUnknown(data['updated_at']!, _updatedAtMeta), + ); + } else if (isInserting) { + context.missing(_updatedAtMeta); + } + if (data.containsKey('deleted_at')) { + context.handle( + _deletedAtMeta, + deletedAt.isAcceptableOrUnknown(data['deleted_at']!, _deletedAtMeta), + ); + } + if (data.containsKey('schema_version')) { + context.handle( + _schemaVersionMeta, + schemaVersion.isAcceptableOrUnknown( + data['schema_version']!, + _schemaVersionMeta, + ), + ); + } + if (data.containsKey('sync_state')) { + context.handle( + _syncStateMeta, + syncState.isAcceptableOrUnknown(data['sync_state']!, _syncStateMeta), + ); + } else if (isInserting) { + context.missing(_syncStateMeta); + } + if (data.containsKey('local_revision')) { + context.handle( + _localRevisionMeta, + localRevision.isAcceptableOrUnknown( + data['local_revision']!, + _localRevisionMeta, + ), + ); + } else if (isInserting) { + context.missing(_localRevisionMeta); + } + if (data.containsKey('origin_device_id')) { + context.handle( + _originDeviceIdMeta, + originDeviceId.isAcceptableOrUnknown( + data['origin_device_id']!, + _originDeviceIdMeta, + ), + ); + } else if (isInserting) { + context.missing(_originDeviceIdMeta); + } + if (data.containsKey('future_owner_profile_id')) { + context.handle( + _futureOwnerProfileIdMeta, + futureOwnerProfileId.isAcceptableOrUnknown( + data['future_owner_profile_id']!, + _futureOwnerProfileIdMeta, + ), + ); + } + if (data.containsKey('last_synced_at')) { + context.handle( + _lastSyncedAtMeta, + lastSyncedAt.isAcceptableOrUnknown( + data['last_synced_at']!, + _lastSyncedAtMeta, + ), + ); + } + if (data.containsKey('remote_revision')) { + context.handle( + _remoteRevisionMeta, + remoteRevision.isAcceptableOrUnknown( + data['remote_revision']!, + _remoteRevisionMeta, + ), + ); + } + if (data.containsKey('active_workout_session_id')) { + context.handle( + _activeWorkoutSessionIdMeta, + activeWorkoutSessionId.isAcceptableOrUnknown( + data['active_workout_session_id']!, + _activeWorkoutSessionIdMeta, + ), + ); + } else if (isInserting) { + context.missing(_activeWorkoutSessionIdMeta); + } + if (data.containsKey('after_program_index')) { + context.handle( + _afterProgramIndexMeta, + afterProgramIndex.isAcceptableOrUnknown( + data['after_program_index']!, + _afterProgramIndexMeta, + ), + ); + } else if (isInserting) { + context.missing(_afterProgramIndexMeta); + } + if (data.containsKey('after_exercise_index')) { + context.handle( + _afterExerciseIndexMeta, + afterExerciseIndex.isAcceptableOrUnknown( + data['after_exercise_index']!, + _afterExerciseIndexMeta, + ), + ); + } else if (isInserting) { + context.missing(_afterExerciseIndexMeta); + } + if (data.containsKey('after_set_index')) { + context.handle( + _afterSetIndexMeta, + afterSetIndex.isAcceptableOrUnknown( + data['after_set_index']!, + _afterSetIndexMeta, + ), + ); + } else if (isInserting) { + context.missing(_afterSetIndexMeta); + } + if (data.containsKey('planned_rest_seconds')) { + context.handle( + _plannedRestSecondsMeta, + plannedRestSeconds.isAcceptableOrUnknown( + data['planned_rest_seconds']!, + _plannedRestSecondsMeta, + ), + ); + } else if (isInserting) { + context.missing(_plannedRestSecondsMeta); + } + if (data.containsKey('adjusted_rest_seconds')) { + context.handle( + _adjustedRestSecondsMeta, + adjustedRestSeconds.isAcceptableOrUnknown( + data['adjusted_rest_seconds']!, + _adjustedRestSecondsMeta, + ), + ); + } else if (isInserting) { + context.missing(_adjustedRestSecondsMeta); + } + if (data.containsKey('started_at')) { + context.handle( + _startedAtMeta, + startedAt.isAcceptableOrUnknown(data['started_at']!, _startedAtMeta), + ); + } else if (isInserting) { + context.missing(_startedAtMeta); + } + if (data.containsKey('ended_at')) { + context.handle( + _endedAtMeta, + endedAt.isAcceptableOrUnknown(data['ended_at']!, _endedAtMeta), + ); + } + if (data.containsKey('skipped_at')) { + context.handle( + _skippedAtMeta, + skippedAt.isAcceptableOrUnknown(data['skipped_at']!, _skippedAtMeta), + ); + } + return context; + } + + @override + Set get $primaryKey => {id}; + @override + ActiveRestState map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return ActiveRestState( + id: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}id'], + )!, + createdAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}created_at'], + )!, + updatedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}updated_at'], + )!, + deletedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}deleted_at'], + ), + schemaVersion: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}schema_version'], + )!, + syncState: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}sync_state'], + )!, + localRevision: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}local_revision'], + )!, + originDeviceId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}origin_device_id'], + )!, + futureOwnerProfileId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}future_owner_profile_id'], + ), + lastSyncedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}last_synced_at'], + ), + remoteRevision: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}remote_revision'], + ), + activeWorkoutSessionId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}active_workout_session_id'], + )!, + afterProgramIndex: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}after_program_index'], + )!, + afterExerciseIndex: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}after_exercise_index'], + )!, + afterSetIndex: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}after_set_index'], + )!, + plannedRestSeconds: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}planned_rest_seconds'], + )!, + adjustedRestSeconds: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}adjusted_rest_seconds'], + )!, + startedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}started_at'], + )!, + endedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}ended_at'], + ), + skippedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}skipped_at'], + ), + ); + } + + @override + $ActiveRestStatesTable createAlias(String alias) { + return $ActiveRestStatesTable(attachedDatabase, alias); + } +} + +class ActiveRestState extends DataClass implements Insertable { + final String id; + final DateTime createdAt; + final DateTime updatedAt; + final DateTime? deletedAt; + final int schemaVersion; + final String syncState; + final int localRevision; + final String originDeviceId; + final String? futureOwnerProfileId; + final DateTime? lastSyncedAt; + final String? remoteRevision; + final String activeWorkoutSessionId; + final int afterProgramIndex; + final int afterExerciseIndex; + final int afterSetIndex; + final int plannedRestSeconds; + final int adjustedRestSeconds; + final DateTime startedAt; + final DateTime? endedAt; + final DateTime? skippedAt; + const ActiveRestState({ + required this.id, + required this.createdAt, + required this.updatedAt, + this.deletedAt, + required this.schemaVersion, + required this.syncState, + required this.localRevision, + required this.originDeviceId, + this.futureOwnerProfileId, + this.lastSyncedAt, + this.remoteRevision, + required this.activeWorkoutSessionId, + required this.afterProgramIndex, + required this.afterExerciseIndex, + required this.afterSetIndex, + required this.plannedRestSeconds, + required this.adjustedRestSeconds, + required this.startedAt, + this.endedAt, + this.skippedAt, + }); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['created_at'] = Variable(createdAt); + map['updated_at'] = Variable(updatedAt); + if (!nullToAbsent || deletedAt != null) { + map['deleted_at'] = Variable(deletedAt); + } + map['schema_version'] = Variable(schemaVersion); + map['sync_state'] = Variable(syncState); + map['local_revision'] = Variable(localRevision); + map['origin_device_id'] = Variable(originDeviceId); + if (!nullToAbsent || futureOwnerProfileId != null) { + map['future_owner_profile_id'] = Variable(futureOwnerProfileId); + } + if (!nullToAbsent || lastSyncedAt != null) { + map['last_synced_at'] = Variable(lastSyncedAt); + } + if (!nullToAbsent || remoteRevision != null) { + map['remote_revision'] = Variable(remoteRevision); + } + map['active_workout_session_id'] = Variable(activeWorkoutSessionId); + map['after_program_index'] = Variable(afterProgramIndex); + map['after_exercise_index'] = Variable(afterExerciseIndex); + map['after_set_index'] = Variable(afterSetIndex); + map['planned_rest_seconds'] = Variable(plannedRestSeconds); + map['adjusted_rest_seconds'] = Variable(adjustedRestSeconds); + map['started_at'] = Variable(startedAt); + if (!nullToAbsent || endedAt != null) { + map['ended_at'] = Variable(endedAt); + } + if (!nullToAbsent || skippedAt != null) { + map['skipped_at'] = Variable(skippedAt); + } + return map; + } + + ActiveRestStatesCompanion toCompanion(bool nullToAbsent) { + return ActiveRestStatesCompanion( + id: Value(id), + createdAt: Value(createdAt), + updatedAt: Value(updatedAt), + deletedAt: deletedAt == null && nullToAbsent + ? const Value.absent() + : Value(deletedAt), + schemaVersion: Value(schemaVersion), + syncState: Value(syncState), + localRevision: Value(localRevision), + originDeviceId: Value(originDeviceId), + futureOwnerProfileId: futureOwnerProfileId == null && nullToAbsent + ? const Value.absent() + : Value(futureOwnerProfileId), + lastSyncedAt: lastSyncedAt == null && nullToAbsent + ? const Value.absent() + : Value(lastSyncedAt), + remoteRevision: remoteRevision == null && nullToAbsent + ? const Value.absent() + : Value(remoteRevision), + activeWorkoutSessionId: Value(activeWorkoutSessionId), + afterProgramIndex: Value(afterProgramIndex), + afterExerciseIndex: Value(afterExerciseIndex), + afterSetIndex: Value(afterSetIndex), + plannedRestSeconds: Value(plannedRestSeconds), + adjustedRestSeconds: Value(adjustedRestSeconds), + startedAt: Value(startedAt), + endedAt: endedAt == null && nullToAbsent + ? const Value.absent() + : Value(endedAt), + skippedAt: skippedAt == null && nullToAbsent + ? const Value.absent() + : Value(skippedAt), + ); + } + + factory ActiveRestState.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return ActiveRestState( + id: serializer.fromJson(json['id']), + createdAt: serializer.fromJson(json['createdAt']), + updatedAt: serializer.fromJson(json['updatedAt']), + deletedAt: serializer.fromJson(json['deletedAt']), + schemaVersion: serializer.fromJson(json['schemaVersion']), + syncState: serializer.fromJson(json['syncState']), + localRevision: serializer.fromJson(json['localRevision']), + originDeviceId: serializer.fromJson(json['originDeviceId']), + futureOwnerProfileId: serializer.fromJson( + json['futureOwnerProfileId'], + ), + lastSyncedAt: serializer.fromJson(json['lastSyncedAt']), + remoteRevision: serializer.fromJson(json['remoteRevision']), + activeWorkoutSessionId: serializer.fromJson( + json['activeWorkoutSessionId'], + ), + afterProgramIndex: serializer.fromJson(json['afterProgramIndex']), + afterExerciseIndex: serializer.fromJson(json['afterExerciseIndex']), + afterSetIndex: serializer.fromJson(json['afterSetIndex']), + plannedRestSeconds: serializer.fromJson(json['plannedRestSeconds']), + adjustedRestSeconds: serializer.fromJson( + json['adjustedRestSeconds'], + ), + startedAt: serializer.fromJson(json['startedAt']), + endedAt: serializer.fromJson(json['endedAt']), + skippedAt: serializer.fromJson(json['skippedAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'createdAt': serializer.toJson(createdAt), + 'updatedAt': serializer.toJson(updatedAt), + 'deletedAt': serializer.toJson(deletedAt), + 'schemaVersion': serializer.toJson(schemaVersion), + 'syncState': serializer.toJson(syncState), + 'localRevision': serializer.toJson(localRevision), + 'originDeviceId': serializer.toJson(originDeviceId), + 'futureOwnerProfileId': serializer.toJson(futureOwnerProfileId), + 'lastSyncedAt': serializer.toJson(lastSyncedAt), + 'remoteRevision': serializer.toJson(remoteRevision), + 'activeWorkoutSessionId': serializer.toJson( + activeWorkoutSessionId, + ), + 'afterProgramIndex': serializer.toJson(afterProgramIndex), + 'afterExerciseIndex': serializer.toJson(afterExerciseIndex), + 'afterSetIndex': serializer.toJson(afterSetIndex), + 'plannedRestSeconds': serializer.toJson(plannedRestSeconds), + 'adjustedRestSeconds': serializer.toJson(adjustedRestSeconds), + 'startedAt': serializer.toJson(startedAt), + 'endedAt': serializer.toJson(endedAt), + 'skippedAt': serializer.toJson(skippedAt), + }; + } + + ActiveRestState copyWith({ + String? id, + DateTime? createdAt, + DateTime? updatedAt, + Value deletedAt = const Value.absent(), + int? schemaVersion, + String? syncState, + int? localRevision, + String? originDeviceId, + Value futureOwnerProfileId = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + Value remoteRevision = const Value.absent(), + String? activeWorkoutSessionId, + int? afterProgramIndex, + int? afterExerciseIndex, + int? afterSetIndex, + int? plannedRestSeconds, + int? adjustedRestSeconds, + DateTime? startedAt, + Value endedAt = const Value.absent(), + Value skippedAt = const Value.absent(), + }) => ActiveRestState( + id: id ?? this.id, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt.present ? deletedAt.value : this.deletedAt, + schemaVersion: schemaVersion ?? this.schemaVersion, + syncState: syncState ?? this.syncState, + localRevision: localRevision ?? this.localRevision, + originDeviceId: originDeviceId ?? this.originDeviceId, + futureOwnerProfileId: futureOwnerProfileId.present + ? futureOwnerProfileId.value + : this.futureOwnerProfileId, + lastSyncedAt: lastSyncedAt.present ? lastSyncedAt.value : this.lastSyncedAt, + remoteRevision: remoteRevision.present + ? remoteRevision.value + : this.remoteRevision, + activeWorkoutSessionId: + activeWorkoutSessionId ?? this.activeWorkoutSessionId, + afterProgramIndex: afterProgramIndex ?? this.afterProgramIndex, + afterExerciseIndex: afterExerciseIndex ?? this.afterExerciseIndex, + afterSetIndex: afterSetIndex ?? this.afterSetIndex, + plannedRestSeconds: plannedRestSeconds ?? this.plannedRestSeconds, + adjustedRestSeconds: adjustedRestSeconds ?? this.adjustedRestSeconds, + startedAt: startedAt ?? this.startedAt, + endedAt: endedAt.present ? endedAt.value : this.endedAt, + skippedAt: skippedAt.present ? skippedAt.value : this.skippedAt, + ); + ActiveRestState copyWithCompanion(ActiveRestStatesCompanion data) { + return ActiveRestState( + id: data.id.present ? data.id.value : this.id, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + updatedAt: data.updatedAt.present ? data.updatedAt.value : this.updatedAt, + deletedAt: data.deletedAt.present ? data.deletedAt.value : this.deletedAt, + schemaVersion: data.schemaVersion.present + ? data.schemaVersion.value + : this.schemaVersion, + syncState: data.syncState.present ? data.syncState.value : this.syncState, + localRevision: data.localRevision.present + ? data.localRevision.value + : this.localRevision, + originDeviceId: data.originDeviceId.present + ? data.originDeviceId.value + : this.originDeviceId, + futureOwnerProfileId: data.futureOwnerProfileId.present + ? data.futureOwnerProfileId.value + : this.futureOwnerProfileId, + lastSyncedAt: data.lastSyncedAt.present + ? data.lastSyncedAt.value + : this.lastSyncedAt, + remoteRevision: data.remoteRevision.present + ? data.remoteRevision.value + : this.remoteRevision, + activeWorkoutSessionId: data.activeWorkoutSessionId.present + ? data.activeWorkoutSessionId.value + : this.activeWorkoutSessionId, + afterProgramIndex: data.afterProgramIndex.present + ? data.afterProgramIndex.value + : this.afterProgramIndex, + afterExerciseIndex: data.afterExerciseIndex.present + ? data.afterExerciseIndex.value + : this.afterExerciseIndex, + afterSetIndex: data.afterSetIndex.present + ? data.afterSetIndex.value + : this.afterSetIndex, + plannedRestSeconds: data.plannedRestSeconds.present + ? data.plannedRestSeconds.value + : this.plannedRestSeconds, + adjustedRestSeconds: data.adjustedRestSeconds.present + ? data.adjustedRestSeconds.value + : this.adjustedRestSeconds, + startedAt: data.startedAt.present ? data.startedAt.value : this.startedAt, + endedAt: data.endedAt.present ? data.endedAt.value : this.endedAt, + skippedAt: data.skippedAt.present ? data.skippedAt.value : this.skippedAt, + ); + } + + @override + String toString() { + return (StringBuffer('ActiveRestState(') + ..write('id: $id, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('schemaVersion: $schemaVersion, ') + ..write('syncState: $syncState, ') + ..write('localRevision: $localRevision, ') + ..write('originDeviceId: $originDeviceId, ') + ..write('futureOwnerProfileId: $futureOwnerProfileId, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('remoteRevision: $remoteRevision, ') + ..write('activeWorkoutSessionId: $activeWorkoutSessionId, ') + ..write('afterProgramIndex: $afterProgramIndex, ') + ..write('afterExerciseIndex: $afterExerciseIndex, ') + ..write('afterSetIndex: $afterSetIndex, ') + ..write('plannedRestSeconds: $plannedRestSeconds, ') + ..write('adjustedRestSeconds: $adjustedRestSeconds, ') + ..write('startedAt: $startedAt, ') + ..write('endedAt: $endedAt, ') + ..write('skippedAt: $skippedAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash( + id, + createdAt, + updatedAt, + deletedAt, + schemaVersion, + syncState, + localRevision, + originDeviceId, + futureOwnerProfileId, + lastSyncedAt, + remoteRevision, + activeWorkoutSessionId, + afterProgramIndex, + afterExerciseIndex, + afterSetIndex, + plannedRestSeconds, + adjustedRestSeconds, + startedAt, + endedAt, + skippedAt, + ); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is ActiveRestState && + other.id == this.id && + other.createdAt == this.createdAt && + other.updatedAt == this.updatedAt && + other.deletedAt == this.deletedAt && + other.schemaVersion == this.schemaVersion && + other.syncState == this.syncState && + other.localRevision == this.localRevision && + other.originDeviceId == this.originDeviceId && + other.futureOwnerProfileId == this.futureOwnerProfileId && + other.lastSyncedAt == this.lastSyncedAt && + other.remoteRevision == this.remoteRevision && + other.activeWorkoutSessionId == this.activeWorkoutSessionId && + other.afterProgramIndex == this.afterProgramIndex && + other.afterExerciseIndex == this.afterExerciseIndex && + other.afterSetIndex == this.afterSetIndex && + other.plannedRestSeconds == this.plannedRestSeconds && + other.adjustedRestSeconds == this.adjustedRestSeconds && + other.startedAt == this.startedAt && + other.endedAt == this.endedAt && + other.skippedAt == this.skippedAt); +} + +class ActiveRestStatesCompanion extends UpdateCompanion { + final Value id; + final Value createdAt; + final Value updatedAt; + final Value deletedAt; + final Value schemaVersion; + final Value syncState; + final Value localRevision; + final Value originDeviceId; + final Value futureOwnerProfileId; + final Value lastSyncedAt; + final Value remoteRevision; + final Value activeWorkoutSessionId; + final Value afterProgramIndex; + final Value afterExerciseIndex; + final Value afterSetIndex; + final Value plannedRestSeconds; + final Value adjustedRestSeconds; + final Value startedAt; + final Value endedAt; + final Value skippedAt; + final Value rowid; + const ActiveRestStatesCompanion({ + this.id = const Value.absent(), + this.createdAt = const Value.absent(), + this.updatedAt = const Value.absent(), + this.deletedAt = const Value.absent(), + this.schemaVersion = const Value.absent(), + this.syncState = const Value.absent(), + this.localRevision = const Value.absent(), + this.originDeviceId = const Value.absent(), + this.futureOwnerProfileId = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + this.remoteRevision = const Value.absent(), + this.activeWorkoutSessionId = const Value.absent(), + this.afterProgramIndex = const Value.absent(), + this.afterExerciseIndex = const Value.absent(), + this.afterSetIndex = const Value.absent(), + this.plannedRestSeconds = const Value.absent(), + this.adjustedRestSeconds = const Value.absent(), + this.startedAt = const Value.absent(), + this.endedAt = const Value.absent(), + this.skippedAt = const Value.absent(), + this.rowid = const Value.absent(), + }); + ActiveRestStatesCompanion.insert({ + required String id, + required DateTime createdAt, + required DateTime updatedAt, + this.deletedAt = const Value.absent(), + this.schemaVersion = const Value.absent(), + required String syncState, + required int localRevision, + required String originDeviceId, + this.futureOwnerProfileId = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + this.remoteRevision = const Value.absent(), + required String activeWorkoutSessionId, + required int afterProgramIndex, + required int afterExerciseIndex, + required int afterSetIndex, + required int plannedRestSeconds, + required int adjustedRestSeconds, + required DateTime startedAt, + this.endedAt = const Value.absent(), + this.skippedAt = const Value.absent(), + this.rowid = const Value.absent(), + }) : id = Value(id), + createdAt = Value(createdAt), + updatedAt = Value(updatedAt), + syncState = Value(syncState), + localRevision = Value(localRevision), + originDeviceId = Value(originDeviceId), + activeWorkoutSessionId = Value(activeWorkoutSessionId), + afterProgramIndex = Value(afterProgramIndex), + afterExerciseIndex = Value(afterExerciseIndex), + afterSetIndex = Value(afterSetIndex), + plannedRestSeconds = Value(plannedRestSeconds), + adjustedRestSeconds = Value(adjustedRestSeconds), + startedAt = Value(startedAt); + static Insertable custom({ + Expression? id, + Expression? createdAt, + Expression? updatedAt, + Expression? deletedAt, + Expression? schemaVersion, + Expression? syncState, + Expression? localRevision, + Expression? originDeviceId, + Expression? futureOwnerProfileId, + Expression? lastSyncedAt, + Expression? remoteRevision, + Expression? activeWorkoutSessionId, + Expression? afterProgramIndex, + Expression? afterExerciseIndex, + Expression? afterSetIndex, + Expression? plannedRestSeconds, + Expression? adjustedRestSeconds, + Expression? startedAt, + Expression? endedAt, + Expression? skippedAt, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (createdAt != null) 'created_at': createdAt, + if (updatedAt != null) 'updated_at': updatedAt, + if (deletedAt != null) 'deleted_at': deletedAt, + if (schemaVersion != null) 'schema_version': schemaVersion, + if (syncState != null) 'sync_state': syncState, + if (localRevision != null) 'local_revision': localRevision, + if (originDeviceId != null) 'origin_device_id': originDeviceId, + if (futureOwnerProfileId != null) + 'future_owner_profile_id': futureOwnerProfileId, + if (lastSyncedAt != null) 'last_synced_at': lastSyncedAt, + if (remoteRevision != null) 'remote_revision': remoteRevision, + if (activeWorkoutSessionId != null) + 'active_workout_session_id': activeWorkoutSessionId, + if (afterProgramIndex != null) 'after_program_index': afterProgramIndex, + if (afterExerciseIndex != null) + 'after_exercise_index': afterExerciseIndex, + if (afterSetIndex != null) 'after_set_index': afterSetIndex, + if (plannedRestSeconds != null) + 'planned_rest_seconds': plannedRestSeconds, + if (adjustedRestSeconds != null) + 'adjusted_rest_seconds': adjustedRestSeconds, + if (startedAt != null) 'started_at': startedAt, + if (endedAt != null) 'ended_at': endedAt, + if (skippedAt != null) 'skipped_at': skippedAt, + if (rowid != null) 'rowid': rowid, + }); + } + + ActiveRestStatesCompanion copyWith({ + Value? id, + Value? createdAt, + Value? updatedAt, + Value? deletedAt, + Value? schemaVersion, + Value? syncState, + Value? localRevision, + Value? originDeviceId, + Value? futureOwnerProfileId, + Value? lastSyncedAt, + Value? remoteRevision, + Value? activeWorkoutSessionId, + Value? afterProgramIndex, + Value? afterExerciseIndex, + Value? afterSetIndex, + Value? plannedRestSeconds, + Value? adjustedRestSeconds, + Value? startedAt, + Value? endedAt, + Value? skippedAt, + Value? rowid, + }) { + return ActiveRestStatesCompanion( + id: id ?? this.id, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt ?? this.deletedAt, + schemaVersion: schemaVersion ?? this.schemaVersion, + syncState: syncState ?? this.syncState, + localRevision: localRevision ?? this.localRevision, + originDeviceId: originDeviceId ?? this.originDeviceId, + futureOwnerProfileId: futureOwnerProfileId ?? this.futureOwnerProfileId, + lastSyncedAt: lastSyncedAt ?? this.lastSyncedAt, + remoteRevision: remoteRevision ?? this.remoteRevision, + activeWorkoutSessionId: + activeWorkoutSessionId ?? this.activeWorkoutSessionId, + afterProgramIndex: afterProgramIndex ?? this.afterProgramIndex, + afterExerciseIndex: afterExerciseIndex ?? this.afterExerciseIndex, + afterSetIndex: afterSetIndex ?? this.afterSetIndex, + plannedRestSeconds: plannedRestSeconds ?? this.plannedRestSeconds, + adjustedRestSeconds: adjustedRestSeconds ?? this.adjustedRestSeconds, + startedAt: startedAt ?? this.startedAt, + endedAt: endedAt ?? this.endedAt, + skippedAt: skippedAt ?? this.skippedAt, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + if (updatedAt.present) { + map['updated_at'] = Variable(updatedAt.value); + } + if (deletedAt.present) { + map['deleted_at'] = Variable(deletedAt.value); + } + if (schemaVersion.present) { + map['schema_version'] = Variable(schemaVersion.value); + } + if (syncState.present) { + map['sync_state'] = Variable(syncState.value); + } + if (localRevision.present) { + map['local_revision'] = Variable(localRevision.value); + } + if (originDeviceId.present) { + map['origin_device_id'] = Variable(originDeviceId.value); + } + if (futureOwnerProfileId.present) { + map['future_owner_profile_id'] = Variable( + futureOwnerProfileId.value, + ); + } + if (lastSyncedAt.present) { + map['last_synced_at'] = Variable(lastSyncedAt.value); + } + if (remoteRevision.present) { + map['remote_revision'] = Variable(remoteRevision.value); + } + if (activeWorkoutSessionId.present) { + map['active_workout_session_id'] = Variable( + activeWorkoutSessionId.value, + ); + } + if (afterProgramIndex.present) { + map['after_program_index'] = Variable(afterProgramIndex.value); + } + if (afterExerciseIndex.present) { + map['after_exercise_index'] = Variable(afterExerciseIndex.value); + } + if (afterSetIndex.present) { + map['after_set_index'] = Variable(afterSetIndex.value); + } + if (plannedRestSeconds.present) { + map['planned_rest_seconds'] = Variable(plannedRestSeconds.value); + } + if (adjustedRestSeconds.present) { + map['adjusted_rest_seconds'] = Variable(adjustedRestSeconds.value); + } + if (startedAt.present) { + map['started_at'] = Variable(startedAt.value); + } + if (endedAt.present) { + map['ended_at'] = Variable(endedAt.value); + } + if (skippedAt.present) { + map['skipped_at'] = Variable(skippedAt.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('ActiveRestStatesCompanion(') + ..write('id: $id, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('schemaVersion: $schemaVersion, ') + ..write('syncState: $syncState, ') + ..write('localRevision: $localRevision, ') + ..write('originDeviceId: $originDeviceId, ') + ..write('futureOwnerProfileId: $futureOwnerProfileId, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('remoteRevision: $remoteRevision, ') + ..write('activeWorkoutSessionId: $activeWorkoutSessionId, ') + ..write('afterProgramIndex: $afterProgramIndex, ') + ..write('afterExerciseIndex: $afterExerciseIndex, ') + ..write('afterSetIndex: $afterSetIndex, ') + ..write('plannedRestSeconds: $plannedRestSeconds, ') + ..write('adjustedRestSeconds: $adjustedRestSeconds, ') + ..write('startedAt: $startedAt, ') + ..write('endedAt: $endedAt, ') + ..write('skippedAt: $skippedAt, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class $ActiveSetResultsTable extends ActiveSetResults + with TableInfo<$ActiveSetResultsTable, ActiveSetResult> { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + $ActiveSetResultsTable(this.attachedDatabase, [this._alias]); + static const VerificationMeta _idMeta = const VerificationMeta('id'); + @override + late final GeneratedColumn id = GeneratedColumn( + 'id', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _createdAtMeta = const VerificationMeta( + 'createdAt', + ); + @override + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + ); + static const VerificationMeta _updatedAtMeta = const VerificationMeta( + 'updatedAt', + ); + @override + late final GeneratedColumn updatedAt = GeneratedColumn( + 'updated_at', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + ); + static const VerificationMeta _deletedAtMeta = const VerificationMeta( + 'deletedAt', + ); + @override + late final GeneratedColumn deletedAt = GeneratedColumn( + 'deleted_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + static const VerificationMeta _schemaVersionMeta = const VerificationMeta( + 'schemaVersion', + ); + @override + late final GeneratedColumn schemaVersion = GeneratedColumn( + 'schema_version', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultValue: const Constant(1), + ); + static const VerificationMeta _syncStateMeta = const VerificationMeta( + 'syncState', + ); + @override + late final GeneratedColumn syncState = GeneratedColumn( + 'sync_state', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: + 'NOT NULL CHECK (sync_state IN (\'localOnly\', \'dirty\', \'synced\', \'deleted\'))', + ); + static const VerificationMeta _localRevisionMeta = const VerificationMeta( + 'localRevision', + ); + @override + late final GeneratedColumn localRevision = GeneratedColumn( + 'local_revision', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL CHECK (local_revision >= 0)', + ); + static const VerificationMeta _originDeviceIdMeta = const VerificationMeta( + 'originDeviceId', + ); + @override + late final GeneratedColumn originDeviceId = GeneratedColumn( + 'origin_device_id', + aliasedName, + false, + additionalChecks: GeneratedColumn.checkTextLength(minTextLength: 1), + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _futureOwnerProfileIdMeta = + const VerificationMeta('futureOwnerProfileId'); + @override + late final GeneratedColumn futureOwnerProfileId = + GeneratedColumn( + 'future_owner_profile_id', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _lastSyncedAtMeta = const VerificationMeta( + 'lastSyncedAt', + ); + @override + late final GeneratedColumn lastSyncedAt = GeneratedColumn( + 'last_synced_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + static const VerificationMeta _remoteRevisionMeta = const VerificationMeta( + 'remoteRevision', + ); + @override + late final GeneratedColumn remoteRevision = GeneratedColumn( + 'remote_revision', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _activeWorkoutSessionIdMeta = + const VerificationMeta('activeWorkoutSessionId'); + @override + late final GeneratedColumn activeWorkoutSessionId = + GeneratedColumn( + 'active_workout_session_id', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'REFERENCES active_workout_sessions (id)', + ), + ); + static const VerificationMeta _programSnapshotIdMeta = const VerificationMeta( + 'programSnapshotId', + ); + @override + late final GeneratedColumn programSnapshotId = + GeneratedColumn( + 'program_snapshot_id', + aliasedName, + false, + additionalChecks: GeneratedColumn.checkTextLength(minTextLength: 1), + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _exerciseSnapshotIdMeta = + const VerificationMeta('exerciseSnapshotId'); + @override + late final GeneratedColumn exerciseSnapshotId = + GeneratedColumn( + 'exercise_snapshot_id', + aliasedName, + false, + additionalChecks: GeneratedColumn.checkTextLength(minTextLength: 1), + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _programIndexMeta = const VerificationMeta( + 'programIndex', + ); + @override + late final GeneratedColumn programIndex = GeneratedColumn( + 'program_index', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + ); + static const VerificationMeta _exerciseIndexMeta = const VerificationMeta( + 'exerciseIndex', + ); + @override + late final GeneratedColumn exerciseIndex = GeneratedColumn( + 'exercise_index', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + ); + static const VerificationMeta _setIndexMeta = const VerificationMeta( + 'setIndex', + ); + @override + late final GeneratedColumn setIndex = GeneratedColumn( + 'set_index', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + ); + static const VerificationMeta _startedAtMeta = const VerificationMeta( + 'startedAt', + ); + @override + late final GeneratedColumn startedAt = GeneratedColumn( + 'started_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + static const VerificationMeta _completedAtMeta = const VerificationMeta( + 'completedAt', + ); + @override + late final GeneratedColumn completedAt = GeneratedColumn( + 'completed_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + static const VerificationMeta _actualTimeMsMeta = const VerificationMeta( + 'actualTimeMs', + ); + @override + late final GeneratedColumn actualTimeMs = GeneratedColumn( + 'actual_time_ms', + aliasedName, + true, + type: DriftSqlType.int, + requiredDuringInsert: false, + ); + static const VerificationMeta _actualRepsMeta = const VerificationMeta( + 'actualReps', + ); + @override + late final GeneratedColumn actualReps = GeneratedColumn( + 'actual_reps', + aliasedName, + true, + type: DriftSqlType.int, + requiredDuringInsert: false, + ); + static const VerificationMeta _actualScoreMeta = const VerificationMeta( + 'actualScore', + ); + @override + late final GeneratedColumn actualScore = GeneratedColumn( + 'actual_score', + aliasedName, + true, + type: DriftSqlType.double, + requiredDuringInsert: false, + ); + static const VerificationMeta _scoreLabelSnapshotMeta = + const VerificationMeta('scoreLabelSnapshot'); + @override + late final GeneratedColumn scoreLabelSnapshot = + GeneratedColumn( + 'score_label_snapshot', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _scoreUnitSnapshotMeta = const VerificationMeta( + 'scoreUnitSnapshot', + ); + @override + late final GeneratedColumn scoreUnitSnapshot = + GeneratedColumn( + 'score_unit_snapshot', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _noteMeta = const VerificationMeta('note'); + @override + late final GeneratedColumn note = GeneratedColumn( + 'note', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + @override + List get $columns => [ + id, + createdAt, + updatedAt, + deletedAt, + schemaVersion, + syncState, + localRevision, + originDeviceId, + futureOwnerProfileId, + lastSyncedAt, + remoteRevision, + activeWorkoutSessionId, + programSnapshotId, + exerciseSnapshotId, + programIndex, + exerciseIndex, + setIndex, + startedAt, + completedAt, + actualTimeMs, + actualReps, + actualScore, + scoreLabelSnapshot, + scoreUnitSnapshot, + note, + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'active_set_results'; + @override + VerificationContext validateIntegrity( + Insertable instance, { + bool isInserting = false, + }) { + final context = VerificationContext(); + final data = instance.toColumns(true); + if (data.containsKey('id')) { + context.handle(_idMeta, id.isAcceptableOrUnknown(data['id']!, _idMeta)); + } else if (isInserting) { + context.missing(_idMeta); + } + if (data.containsKey('created_at')) { + context.handle( + _createdAtMeta, + createdAt.isAcceptableOrUnknown(data['created_at']!, _createdAtMeta), + ); + } else if (isInserting) { + context.missing(_createdAtMeta); + } + if (data.containsKey('updated_at')) { + context.handle( + _updatedAtMeta, + updatedAt.isAcceptableOrUnknown(data['updated_at']!, _updatedAtMeta), + ); + } else if (isInserting) { + context.missing(_updatedAtMeta); + } + if (data.containsKey('deleted_at')) { + context.handle( + _deletedAtMeta, + deletedAt.isAcceptableOrUnknown(data['deleted_at']!, _deletedAtMeta), + ); + } + if (data.containsKey('schema_version')) { + context.handle( + _schemaVersionMeta, + schemaVersion.isAcceptableOrUnknown( + data['schema_version']!, + _schemaVersionMeta, + ), + ); + } + if (data.containsKey('sync_state')) { + context.handle( + _syncStateMeta, + syncState.isAcceptableOrUnknown(data['sync_state']!, _syncStateMeta), + ); + } else if (isInserting) { + context.missing(_syncStateMeta); + } + if (data.containsKey('local_revision')) { + context.handle( + _localRevisionMeta, + localRevision.isAcceptableOrUnknown( + data['local_revision']!, + _localRevisionMeta, + ), + ); + } else if (isInserting) { + context.missing(_localRevisionMeta); + } + if (data.containsKey('origin_device_id')) { + context.handle( + _originDeviceIdMeta, + originDeviceId.isAcceptableOrUnknown( + data['origin_device_id']!, + _originDeviceIdMeta, + ), + ); + } else if (isInserting) { + context.missing(_originDeviceIdMeta); + } + if (data.containsKey('future_owner_profile_id')) { + context.handle( + _futureOwnerProfileIdMeta, + futureOwnerProfileId.isAcceptableOrUnknown( + data['future_owner_profile_id']!, + _futureOwnerProfileIdMeta, + ), + ); + } + if (data.containsKey('last_synced_at')) { + context.handle( + _lastSyncedAtMeta, + lastSyncedAt.isAcceptableOrUnknown( + data['last_synced_at']!, + _lastSyncedAtMeta, + ), + ); + } + if (data.containsKey('remote_revision')) { + context.handle( + _remoteRevisionMeta, + remoteRevision.isAcceptableOrUnknown( + data['remote_revision']!, + _remoteRevisionMeta, + ), + ); + } + if (data.containsKey('active_workout_session_id')) { + context.handle( + _activeWorkoutSessionIdMeta, + activeWorkoutSessionId.isAcceptableOrUnknown( + data['active_workout_session_id']!, + _activeWorkoutSessionIdMeta, + ), + ); + } else if (isInserting) { + context.missing(_activeWorkoutSessionIdMeta); + } + if (data.containsKey('program_snapshot_id')) { + context.handle( + _programSnapshotIdMeta, + programSnapshotId.isAcceptableOrUnknown( + data['program_snapshot_id']!, + _programSnapshotIdMeta, + ), + ); + } else if (isInserting) { + context.missing(_programSnapshotIdMeta); + } + if (data.containsKey('exercise_snapshot_id')) { + context.handle( + _exerciseSnapshotIdMeta, + exerciseSnapshotId.isAcceptableOrUnknown( + data['exercise_snapshot_id']!, + _exerciseSnapshotIdMeta, + ), + ); + } else if (isInserting) { + context.missing(_exerciseSnapshotIdMeta); + } + if (data.containsKey('program_index')) { + context.handle( + _programIndexMeta, + programIndex.isAcceptableOrUnknown( + data['program_index']!, + _programIndexMeta, + ), + ); + } else if (isInserting) { + context.missing(_programIndexMeta); + } + if (data.containsKey('exercise_index')) { + context.handle( + _exerciseIndexMeta, + exerciseIndex.isAcceptableOrUnknown( + data['exercise_index']!, + _exerciseIndexMeta, + ), + ); + } else if (isInserting) { + context.missing(_exerciseIndexMeta); + } + if (data.containsKey('set_index')) { + context.handle( + _setIndexMeta, + setIndex.isAcceptableOrUnknown(data['set_index']!, _setIndexMeta), + ); + } else if (isInserting) { + context.missing(_setIndexMeta); + } + if (data.containsKey('started_at')) { + context.handle( + _startedAtMeta, + startedAt.isAcceptableOrUnknown(data['started_at']!, _startedAtMeta), + ); + } + if (data.containsKey('completed_at')) { + context.handle( + _completedAtMeta, + completedAt.isAcceptableOrUnknown( + data['completed_at']!, + _completedAtMeta, + ), + ); + } + if (data.containsKey('actual_time_ms')) { + context.handle( + _actualTimeMsMeta, + actualTimeMs.isAcceptableOrUnknown( + data['actual_time_ms']!, + _actualTimeMsMeta, + ), + ); + } + if (data.containsKey('actual_reps')) { + context.handle( + _actualRepsMeta, + actualReps.isAcceptableOrUnknown(data['actual_reps']!, _actualRepsMeta), + ); + } + if (data.containsKey('actual_score')) { + context.handle( + _actualScoreMeta, + actualScore.isAcceptableOrUnknown( + data['actual_score']!, + _actualScoreMeta, + ), + ); + } + if (data.containsKey('score_label_snapshot')) { + context.handle( + _scoreLabelSnapshotMeta, + scoreLabelSnapshot.isAcceptableOrUnknown( + data['score_label_snapshot']!, + _scoreLabelSnapshotMeta, + ), + ); + } + if (data.containsKey('score_unit_snapshot')) { + context.handle( + _scoreUnitSnapshotMeta, + scoreUnitSnapshot.isAcceptableOrUnknown( + data['score_unit_snapshot']!, + _scoreUnitSnapshotMeta, + ), + ); + } + if (data.containsKey('note')) { + context.handle( + _noteMeta, + note.isAcceptableOrUnknown(data['note']!, _noteMeta), + ); + } + return context; + } + + @override + Set get $primaryKey => {id}; + @override + ActiveSetResult map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return ActiveSetResult( + id: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}id'], + )!, + createdAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}created_at'], + )!, + updatedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}updated_at'], + )!, + deletedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}deleted_at'], + ), + schemaVersion: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}schema_version'], + )!, + syncState: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}sync_state'], + )!, + localRevision: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}local_revision'], + )!, + originDeviceId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}origin_device_id'], + )!, + futureOwnerProfileId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}future_owner_profile_id'], + ), + lastSyncedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}last_synced_at'], + ), + remoteRevision: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}remote_revision'], + ), + activeWorkoutSessionId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}active_workout_session_id'], + )!, + programSnapshotId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}program_snapshot_id'], + )!, + exerciseSnapshotId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}exercise_snapshot_id'], + )!, + programIndex: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}program_index'], + )!, + exerciseIndex: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}exercise_index'], + )!, + setIndex: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}set_index'], + )!, + startedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}started_at'], + ), + completedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}completed_at'], + ), + actualTimeMs: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}actual_time_ms'], + ), + actualReps: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}actual_reps'], + ), + actualScore: attachedDatabase.typeMapping.read( + DriftSqlType.double, + data['${effectivePrefix}actual_score'], + ), + scoreLabelSnapshot: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}score_label_snapshot'], + ), + scoreUnitSnapshot: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}score_unit_snapshot'], + ), + note: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}note'], + ), + ); + } + + @override + $ActiveSetResultsTable createAlias(String alias) { + return $ActiveSetResultsTable(attachedDatabase, alias); + } +} + +class ActiveSetResult extends DataClass implements Insertable { + final String id; + final DateTime createdAt; + final DateTime updatedAt; + final DateTime? deletedAt; + final int schemaVersion; + final String syncState; + final int localRevision; + final String originDeviceId; + final String? futureOwnerProfileId; + final DateTime? lastSyncedAt; + final String? remoteRevision; + final String activeWorkoutSessionId; + final String programSnapshotId; + final String exerciseSnapshotId; + final int programIndex; + final int exerciseIndex; + final int setIndex; + final DateTime? startedAt; + final DateTime? completedAt; + final int? actualTimeMs; + final int? actualReps; + final double? actualScore; + final String? scoreLabelSnapshot; + final String? scoreUnitSnapshot; + final String? note; + const ActiveSetResult({ + required this.id, + required this.createdAt, + required this.updatedAt, + this.deletedAt, + required this.schemaVersion, + required this.syncState, + required this.localRevision, + required this.originDeviceId, + this.futureOwnerProfileId, + this.lastSyncedAt, + this.remoteRevision, + required this.activeWorkoutSessionId, + required this.programSnapshotId, + required this.exerciseSnapshotId, + required this.programIndex, + required this.exerciseIndex, + required this.setIndex, + this.startedAt, + this.completedAt, + this.actualTimeMs, + this.actualReps, + this.actualScore, + this.scoreLabelSnapshot, + this.scoreUnitSnapshot, + this.note, + }); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['created_at'] = Variable(createdAt); + map['updated_at'] = Variable(updatedAt); + if (!nullToAbsent || deletedAt != null) { + map['deleted_at'] = Variable(deletedAt); + } + map['schema_version'] = Variable(schemaVersion); + map['sync_state'] = Variable(syncState); + map['local_revision'] = Variable(localRevision); + map['origin_device_id'] = Variable(originDeviceId); + if (!nullToAbsent || futureOwnerProfileId != null) { + map['future_owner_profile_id'] = Variable(futureOwnerProfileId); + } + if (!nullToAbsent || lastSyncedAt != null) { + map['last_synced_at'] = Variable(lastSyncedAt); + } + if (!nullToAbsent || remoteRevision != null) { + map['remote_revision'] = Variable(remoteRevision); + } + map['active_workout_session_id'] = Variable(activeWorkoutSessionId); + map['program_snapshot_id'] = Variable(programSnapshotId); + map['exercise_snapshot_id'] = Variable(exerciseSnapshotId); + map['program_index'] = Variable(programIndex); + map['exercise_index'] = Variable(exerciseIndex); + map['set_index'] = Variable(setIndex); + if (!nullToAbsent || startedAt != null) { + map['started_at'] = Variable(startedAt); + } + if (!nullToAbsent || completedAt != null) { + map['completed_at'] = Variable(completedAt); + } + if (!nullToAbsent || actualTimeMs != null) { + map['actual_time_ms'] = Variable(actualTimeMs); + } + if (!nullToAbsent || actualReps != null) { + map['actual_reps'] = Variable(actualReps); + } + if (!nullToAbsent || actualScore != null) { + map['actual_score'] = Variable(actualScore); + } + if (!nullToAbsent || scoreLabelSnapshot != null) { + map['score_label_snapshot'] = Variable(scoreLabelSnapshot); + } + if (!nullToAbsent || scoreUnitSnapshot != null) { + map['score_unit_snapshot'] = Variable(scoreUnitSnapshot); + } + if (!nullToAbsent || note != null) { + map['note'] = Variable(note); + } + return map; + } + + ActiveSetResultsCompanion toCompanion(bool nullToAbsent) { + return ActiveSetResultsCompanion( + id: Value(id), + createdAt: Value(createdAt), + updatedAt: Value(updatedAt), + deletedAt: deletedAt == null && nullToAbsent + ? const Value.absent() + : Value(deletedAt), + schemaVersion: Value(schemaVersion), + syncState: Value(syncState), + localRevision: Value(localRevision), + originDeviceId: Value(originDeviceId), + futureOwnerProfileId: futureOwnerProfileId == null && nullToAbsent + ? const Value.absent() + : Value(futureOwnerProfileId), + lastSyncedAt: lastSyncedAt == null && nullToAbsent + ? const Value.absent() + : Value(lastSyncedAt), + remoteRevision: remoteRevision == null && nullToAbsent + ? const Value.absent() + : Value(remoteRevision), + activeWorkoutSessionId: Value(activeWorkoutSessionId), + programSnapshotId: Value(programSnapshotId), + exerciseSnapshotId: Value(exerciseSnapshotId), + programIndex: Value(programIndex), + exerciseIndex: Value(exerciseIndex), + setIndex: Value(setIndex), + startedAt: startedAt == null && nullToAbsent + ? const Value.absent() + : Value(startedAt), + completedAt: completedAt == null && nullToAbsent + ? const Value.absent() + : Value(completedAt), + actualTimeMs: actualTimeMs == null && nullToAbsent + ? const Value.absent() + : Value(actualTimeMs), + actualReps: actualReps == null && nullToAbsent + ? const Value.absent() + : Value(actualReps), + actualScore: actualScore == null && nullToAbsent + ? const Value.absent() + : Value(actualScore), + scoreLabelSnapshot: scoreLabelSnapshot == null && nullToAbsent + ? const Value.absent() + : Value(scoreLabelSnapshot), + scoreUnitSnapshot: scoreUnitSnapshot == null && nullToAbsent + ? const Value.absent() + : Value(scoreUnitSnapshot), + note: note == null && nullToAbsent ? const Value.absent() : Value(note), + ); + } + + factory ActiveSetResult.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return ActiveSetResult( + id: serializer.fromJson(json['id']), + createdAt: serializer.fromJson(json['createdAt']), + updatedAt: serializer.fromJson(json['updatedAt']), + deletedAt: serializer.fromJson(json['deletedAt']), + schemaVersion: serializer.fromJson(json['schemaVersion']), + syncState: serializer.fromJson(json['syncState']), + localRevision: serializer.fromJson(json['localRevision']), + originDeviceId: serializer.fromJson(json['originDeviceId']), + futureOwnerProfileId: serializer.fromJson( + json['futureOwnerProfileId'], + ), + lastSyncedAt: serializer.fromJson(json['lastSyncedAt']), + remoteRevision: serializer.fromJson(json['remoteRevision']), + activeWorkoutSessionId: serializer.fromJson( + json['activeWorkoutSessionId'], + ), + programSnapshotId: serializer.fromJson(json['programSnapshotId']), + exerciseSnapshotId: serializer.fromJson( + json['exerciseSnapshotId'], + ), + programIndex: serializer.fromJson(json['programIndex']), + exerciseIndex: serializer.fromJson(json['exerciseIndex']), + setIndex: serializer.fromJson(json['setIndex']), + startedAt: serializer.fromJson(json['startedAt']), + completedAt: serializer.fromJson(json['completedAt']), + actualTimeMs: serializer.fromJson(json['actualTimeMs']), + actualReps: serializer.fromJson(json['actualReps']), + actualScore: serializer.fromJson(json['actualScore']), + scoreLabelSnapshot: serializer.fromJson( + json['scoreLabelSnapshot'], + ), + scoreUnitSnapshot: serializer.fromJson( + json['scoreUnitSnapshot'], + ), + note: serializer.fromJson(json['note']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'createdAt': serializer.toJson(createdAt), + 'updatedAt': serializer.toJson(updatedAt), + 'deletedAt': serializer.toJson(deletedAt), + 'schemaVersion': serializer.toJson(schemaVersion), + 'syncState': serializer.toJson(syncState), + 'localRevision': serializer.toJson(localRevision), + 'originDeviceId': serializer.toJson(originDeviceId), + 'futureOwnerProfileId': serializer.toJson(futureOwnerProfileId), + 'lastSyncedAt': serializer.toJson(lastSyncedAt), + 'remoteRevision': serializer.toJson(remoteRevision), + 'activeWorkoutSessionId': serializer.toJson( + activeWorkoutSessionId, + ), + 'programSnapshotId': serializer.toJson(programSnapshotId), + 'exerciseSnapshotId': serializer.toJson(exerciseSnapshotId), + 'programIndex': serializer.toJson(programIndex), + 'exerciseIndex': serializer.toJson(exerciseIndex), + 'setIndex': serializer.toJson(setIndex), + 'startedAt': serializer.toJson(startedAt), + 'completedAt': serializer.toJson(completedAt), + 'actualTimeMs': serializer.toJson(actualTimeMs), + 'actualReps': serializer.toJson(actualReps), + 'actualScore': serializer.toJson(actualScore), + 'scoreLabelSnapshot': serializer.toJson(scoreLabelSnapshot), + 'scoreUnitSnapshot': serializer.toJson(scoreUnitSnapshot), + 'note': serializer.toJson(note), + }; + } + + ActiveSetResult copyWith({ + String? id, + DateTime? createdAt, + DateTime? updatedAt, + Value deletedAt = const Value.absent(), + int? schemaVersion, + String? syncState, + int? localRevision, + String? originDeviceId, + Value futureOwnerProfileId = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + Value remoteRevision = const Value.absent(), + String? activeWorkoutSessionId, + String? programSnapshotId, + String? exerciseSnapshotId, + int? programIndex, + int? exerciseIndex, + int? setIndex, + Value startedAt = const Value.absent(), + Value completedAt = const Value.absent(), + Value actualTimeMs = const Value.absent(), + Value actualReps = const Value.absent(), + Value actualScore = const Value.absent(), + Value scoreLabelSnapshot = const Value.absent(), + Value scoreUnitSnapshot = const Value.absent(), + Value note = const Value.absent(), + }) => ActiveSetResult( + id: id ?? this.id, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt.present ? deletedAt.value : this.deletedAt, + schemaVersion: schemaVersion ?? this.schemaVersion, + syncState: syncState ?? this.syncState, + localRevision: localRevision ?? this.localRevision, + originDeviceId: originDeviceId ?? this.originDeviceId, + futureOwnerProfileId: futureOwnerProfileId.present + ? futureOwnerProfileId.value + : this.futureOwnerProfileId, + lastSyncedAt: lastSyncedAt.present ? lastSyncedAt.value : this.lastSyncedAt, + remoteRevision: remoteRevision.present + ? remoteRevision.value + : this.remoteRevision, + activeWorkoutSessionId: + activeWorkoutSessionId ?? this.activeWorkoutSessionId, + programSnapshotId: programSnapshotId ?? this.programSnapshotId, + exerciseSnapshotId: exerciseSnapshotId ?? this.exerciseSnapshotId, + programIndex: programIndex ?? this.programIndex, + exerciseIndex: exerciseIndex ?? this.exerciseIndex, + setIndex: setIndex ?? this.setIndex, + startedAt: startedAt.present ? startedAt.value : this.startedAt, + completedAt: completedAt.present ? completedAt.value : this.completedAt, + actualTimeMs: actualTimeMs.present ? actualTimeMs.value : this.actualTimeMs, + actualReps: actualReps.present ? actualReps.value : this.actualReps, + actualScore: actualScore.present ? actualScore.value : this.actualScore, + scoreLabelSnapshot: scoreLabelSnapshot.present + ? scoreLabelSnapshot.value + : this.scoreLabelSnapshot, + scoreUnitSnapshot: scoreUnitSnapshot.present + ? scoreUnitSnapshot.value + : this.scoreUnitSnapshot, + note: note.present ? note.value : this.note, + ); + ActiveSetResult copyWithCompanion(ActiveSetResultsCompanion data) { + return ActiveSetResult( + id: data.id.present ? data.id.value : this.id, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + updatedAt: data.updatedAt.present ? data.updatedAt.value : this.updatedAt, + deletedAt: data.deletedAt.present ? data.deletedAt.value : this.deletedAt, + schemaVersion: data.schemaVersion.present + ? data.schemaVersion.value + : this.schemaVersion, + syncState: data.syncState.present ? data.syncState.value : this.syncState, + localRevision: data.localRevision.present + ? data.localRevision.value + : this.localRevision, + originDeviceId: data.originDeviceId.present + ? data.originDeviceId.value + : this.originDeviceId, + futureOwnerProfileId: data.futureOwnerProfileId.present + ? data.futureOwnerProfileId.value + : this.futureOwnerProfileId, + lastSyncedAt: data.lastSyncedAt.present + ? data.lastSyncedAt.value + : this.lastSyncedAt, + remoteRevision: data.remoteRevision.present + ? data.remoteRevision.value + : this.remoteRevision, + activeWorkoutSessionId: data.activeWorkoutSessionId.present + ? data.activeWorkoutSessionId.value + : this.activeWorkoutSessionId, + programSnapshotId: data.programSnapshotId.present + ? data.programSnapshotId.value + : this.programSnapshotId, + exerciseSnapshotId: data.exerciseSnapshotId.present + ? data.exerciseSnapshotId.value + : this.exerciseSnapshotId, + programIndex: data.programIndex.present + ? data.programIndex.value + : this.programIndex, + exerciseIndex: data.exerciseIndex.present + ? data.exerciseIndex.value + : this.exerciseIndex, + setIndex: data.setIndex.present ? data.setIndex.value : this.setIndex, + startedAt: data.startedAt.present ? data.startedAt.value : this.startedAt, + completedAt: data.completedAt.present + ? data.completedAt.value + : this.completedAt, + actualTimeMs: data.actualTimeMs.present + ? data.actualTimeMs.value + : this.actualTimeMs, + actualReps: data.actualReps.present + ? data.actualReps.value + : this.actualReps, + actualScore: data.actualScore.present + ? data.actualScore.value + : this.actualScore, + scoreLabelSnapshot: data.scoreLabelSnapshot.present + ? data.scoreLabelSnapshot.value + : this.scoreLabelSnapshot, + scoreUnitSnapshot: data.scoreUnitSnapshot.present + ? data.scoreUnitSnapshot.value + : this.scoreUnitSnapshot, + note: data.note.present ? data.note.value : this.note, + ); + } + + @override + String toString() { + return (StringBuffer('ActiveSetResult(') + ..write('id: $id, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('schemaVersion: $schemaVersion, ') + ..write('syncState: $syncState, ') + ..write('localRevision: $localRevision, ') + ..write('originDeviceId: $originDeviceId, ') + ..write('futureOwnerProfileId: $futureOwnerProfileId, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('remoteRevision: $remoteRevision, ') + ..write('activeWorkoutSessionId: $activeWorkoutSessionId, ') + ..write('programSnapshotId: $programSnapshotId, ') + ..write('exerciseSnapshotId: $exerciseSnapshotId, ') + ..write('programIndex: $programIndex, ') + ..write('exerciseIndex: $exerciseIndex, ') + ..write('setIndex: $setIndex, ') + ..write('startedAt: $startedAt, ') + ..write('completedAt: $completedAt, ') + ..write('actualTimeMs: $actualTimeMs, ') + ..write('actualReps: $actualReps, ') + ..write('actualScore: $actualScore, ') + ..write('scoreLabelSnapshot: $scoreLabelSnapshot, ') + ..write('scoreUnitSnapshot: $scoreUnitSnapshot, ') + ..write('note: $note') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hashAll([ + id, + createdAt, + updatedAt, + deletedAt, + schemaVersion, + syncState, + localRevision, + originDeviceId, + futureOwnerProfileId, + lastSyncedAt, + remoteRevision, + activeWorkoutSessionId, + programSnapshotId, + exerciseSnapshotId, + programIndex, + exerciseIndex, + setIndex, + startedAt, + completedAt, + actualTimeMs, + actualReps, + actualScore, + scoreLabelSnapshot, + scoreUnitSnapshot, + note, + ]); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is ActiveSetResult && + other.id == this.id && + other.createdAt == this.createdAt && + other.updatedAt == this.updatedAt && + other.deletedAt == this.deletedAt && + other.schemaVersion == this.schemaVersion && + other.syncState == this.syncState && + other.localRevision == this.localRevision && + other.originDeviceId == this.originDeviceId && + other.futureOwnerProfileId == this.futureOwnerProfileId && + other.lastSyncedAt == this.lastSyncedAt && + other.remoteRevision == this.remoteRevision && + other.activeWorkoutSessionId == this.activeWorkoutSessionId && + other.programSnapshotId == this.programSnapshotId && + other.exerciseSnapshotId == this.exerciseSnapshotId && + other.programIndex == this.programIndex && + other.exerciseIndex == this.exerciseIndex && + other.setIndex == this.setIndex && + other.startedAt == this.startedAt && + other.completedAt == this.completedAt && + other.actualTimeMs == this.actualTimeMs && + other.actualReps == this.actualReps && + other.actualScore == this.actualScore && + other.scoreLabelSnapshot == this.scoreLabelSnapshot && + other.scoreUnitSnapshot == this.scoreUnitSnapshot && + other.note == this.note); +} + +class ActiveSetResultsCompanion extends UpdateCompanion { + final Value id; + final Value createdAt; + final Value updatedAt; + final Value deletedAt; + final Value schemaVersion; + final Value syncState; + final Value localRevision; + final Value originDeviceId; + final Value futureOwnerProfileId; + final Value lastSyncedAt; + final Value remoteRevision; + final Value activeWorkoutSessionId; + final Value programSnapshotId; + final Value exerciseSnapshotId; + final Value programIndex; + final Value exerciseIndex; + final Value setIndex; + final Value startedAt; + final Value completedAt; + final Value actualTimeMs; + final Value actualReps; + final Value actualScore; + final Value scoreLabelSnapshot; + final Value scoreUnitSnapshot; + final Value note; + final Value rowid; + const ActiveSetResultsCompanion({ + this.id = const Value.absent(), + this.createdAt = const Value.absent(), + this.updatedAt = const Value.absent(), + this.deletedAt = const Value.absent(), + this.schemaVersion = const Value.absent(), + this.syncState = const Value.absent(), + this.localRevision = const Value.absent(), + this.originDeviceId = const Value.absent(), + this.futureOwnerProfileId = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + this.remoteRevision = const Value.absent(), + this.activeWorkoutSessionId = const Value.absent(), + this.programSnapshotId = const Value.absent(), + this.exerciseSnapshotId = const Value.absent(), + this.programIndex = const Value.absent(), + this.exerciseIndex = const Value.absent(), + this.setIndex = const Value.absent(), + this.startedAt = const Value.absent(), + this.completedAt = const Value.absent(), + this.actualTimeMs = const Value.absent(), + this.actualReps = const Value.absent(), + this.actualScore = const Value.absent(), + this.scoreLabelSnapshot = const Value.absent(), + this.scoreUnitSnapshot = const Value.absent(), + this.note = const Value.absent(), + this.rowid = const Value.absent(), + }); + ActiveSetResultsCompanion.insert({ + required String id, + required DateTime createdAt, + required DateTime updatedAt, + this.deletedAt = const Value.absent(), + this.schemaVersion = const Value.absent(), + required String syncState, + required int localRevision, + required String originDeviceId, + this.futureOwnerProfileId = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + this.remoteRevision = const Value.absent(), + required String activeWorkoutSessionId, + required String programSnapshotId, + required String exerciseSnapshotId, + required int programIndex, + required int exerciseIndex, + required int setIndex, + this.startedAt = const Value.absent(), + this.completedAt = const Value.absent(), + this.actualTimeMs = const Value.absent(), + this.actualReps = const Value.absent(), + this.actualScore = const Value.absent(), + this.scoreLabelSnapshot = const Value.absent(), + this.scoreUnitSnapshot = const Value.absent(), + this.note = const Value.absent(), + this.rowid = const Value.absent(), + }) : id = Value(id), + createdAt = Value(createdAt), + updatedAt = Value(updatedAt), + syncState = Value(syncState), + localRevision = Value(localRevision), + originDeviceId = Value(originDeviceId), + activeWorkoutSessionId = Value(activeWorkoutSessionId), + programSnapshotId = Value(programSnapshotId), + exerciseSnapshotId = Value(exerciseSnapshotId), + programIndex = Value(programIndex), + exerciseIndex = Value(exerciseIndex), + setIndex = Value(setIndex); + static Insertable custom({ + Expression? id, + Expression? createdAt, + Expression? updatedAt, + Expression? deletedAt, + Expression? schemaVersion, + Expression? syncState, + Expression? localRevision, + Expression? originDeviceId, + Expression? futureOwnerProfileId, + Expression? lastSyncedAt, + Expression? remoteRevision, + Expression? activeWorkoutSessionId, + Expression? programSnapshotId, + Expression? exerciseSnapshotId, + Expression? programIndex, + Expression? exerciseIndex, + Expression? setIndex, + Expression? startedAt, + Expression? completedAt, + Expression? actualTimeMs, + Expression? actualReps, + Expression? actualScore, + Expression? scoreLabelSnapshot, + Expression? scoreUnitSnapshot, + Expression? note, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (createdAt != null) 'created_at': createdAt, + if (updatedAt != null) 'updated_at': updatedAt, + if (deletedAt != null) 'deleted_at': deletedAt, + if (schemaVersion != null) 'schema_version': schemaVersion, + if (syncState != null) 'sync_state': syncState, + if (localRevision != null) 'local_revision': localRevision, + if (originDeviceId != null) 'origin_device_id': originDeviceId, + if (futureOwnerProfileId != null) + 'future_owner_profile_id': futureOwnerProfileId, + if (lastSyncedAt != null) 'last_synced_at': lastSyncedAt, + if (remoteRevision != null) 'remote_revision': remoteRevision, + if (activeWorkoutSessionId != null) + 'active_workout_session_id': activeWorkoutSessionId, + if (programSnapshotId != null) 'program_snapshot_id': programSnapshotId, + if (exerciseSnapshotId != null) + 'exercise_snapshot_id': exerciseSnapshotId, + if (programIndex != null) 'program_index': programIndex, + if (exerciseIndex != null) 'exercise_index': exerciseIndex, + if (setIndex != null) 'set_index': setIndex, + if (startedAt != null) 'started_at': startedAt, + if (completedAt != null) 'completed_at': completedAt, + if (actualTimeMs != null) 'actual_time_ms': actualTimeMs, + if (actualReps != null) 'actual_reps': actualReps, + if (actualScore != null) 'actual_score': actualScore, + if (scoreLabelSnapshot != null) + 'score_label_snapshot': scoreLabelSnapshot, + if (scoreUnitSnapshot != null) 'score_unit_snapshot': scoreUnitSnapshot, + if (note != null) 'note': note, + if (rowid != null) 'rowid': rowid, + }); + } + + ActiveSetResultsCompanion copyWith({ + Value? id, + Value? createdAt, + Value? updatedAt, + Value? deletedAt, + Value? schemaVersion, + Value? syncState, + Value? localRevision, + Value? originDeviceId, + Value? futureOwnerProfileId, + Value? lastSyncedAt, + Value? remoteRevision, + Value? activeWorkoutSessionId, + Value? programSnapshotId, + Value? exerciseSnapshotId, + Value? programIndex, + Value? exerciseIndex, + Value? setIndex, + Value? startedAt, + Value? completedAt, + Value? actualTimeMs, + Value? actualReps, + Value? actualScore, + Value? scoreLabelSnapshot, + Value? scoreUnitSnapshot, + Value? note, + Value? rowid, + }) { + return ActiveSetResultsCompanion( + id: id ?? this.id, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt ?? this.deletedAt, + schemaVersion: schemaVersion ?? this.schemaVersion, + syncState: syncState ?? this.syncState, + localRevision: localRevision ?? this.localRevision, + originDeviceId: originDeviceId ?? this.originDeviceId, + futureOwnerProfileId: futureOwnerProfileId ?? this.futureOwnerProfileId, + lastSyncedAt: lastSyncedAt ?? this.lastSyncedAt, + remoteRevision: remoteRevision ?? this.remoteRevision, + activeWorkoutSessionId: + activeWorkoutSessionId ?? this.activeWorkoutSessionId, + programSnapshotId: programSnapshotId ?? this.programSnapshotId, + exerciseSnapshotId: exerciseSnapshotId ?? this.exerciseSnapshotId, + programIndex: programIndex ?? this.programIndex, + exerciseIndex: exerciseIndex ?? this.exerciseIndex, + setIndex: setIndex ?? this.setIndex, + startedAt: startedAt ?? this.startedAt, + completedAt: completedAt ?? this.completedAt, + actualTimeMs: actualTimeMs ?? this.actualTimeMs, + actualReps: actualReps ?? this.actualReps, + actualScore: actualScore ?? this.actualScore, + scoreLabelSnapshot: scoreLabelSnapshot ?? this.scoreLabelSnapshot, + scoreUnitSnapshot: scoreUnitSnapshot ?? this.scoreUnitSnapshot, + note: note ?? this.note, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + if (updatedAt.present) { + map['updated_at'] = Variable(updatedAt.value); + } + if (deletedAt.present) { + map['deleted_at'] = Variable(deletedAt.value); + } + if (schemaVersion.present) { + map['schema_version'] = Variable(schemaVersion.value); + } + if (syncState.present) { + map['sync_state'] = Variable(syncState.value); + } + if (localRevision.present) { + map['local_revision'] = Variable(localRevision.value); + } + if (originDeviceId.present) { + map['origin_device_id'] = Variable(originDeviceId.value); + } + if (futureOwnerProfileId.present) { + map['future_owner_profile_id'] = Variable( + futureOwnerProfileId.value, + ); + } + if (lastSyncedAt.present) { + map['last_synced_at'] = Variable(lastSyncedAt.value); + } + if (remoteRevision.present) { + map['remote_revision'] = Variable(remoteRevision.value); + } + if (activeWorkoutSessionId.present) { + map['active_workout_session_id'] = Variable( + activeWorkoutSessionId.value, + ); + } + if (programSnapshotId.present) { + map['program_snapshot_id'] = Variable(programSnapshotId.value); + } + if (exerciseSnapshotId.present) { + map['exercise_snapshot_id'] = Variable(exerciseSnapshotId.value); + } + if (programIndex.present) { + map['program_index'] = Variable(programIndex.value); + } + if (exerciseIndex.present) { + map['exercise_index'] = Variable(exerciseIndex.value); + } + if (setIndex.present) { + map['set_index'] = Variable(setIndex.value); + } + if (startedAt.present) { + map['started_at'] = Variable(startedAt.value); + } + if (completedAt.present) { + map['completed_at'] = Variable(completedAt.value); + } + if (actualTimeMs.present) { + map['actual_time_ms'] = Variable(actualTimeMs.value); + } + if (actualReps.present) { + map['actual_reps'] = Variable(actualReps.value); + } + if (actualScore.present) { + map['actual_score'] = Variable(actualScore.value); + } + if (scoreLabelSnapshot.present) { + map['score_label_snapshot'] = Variable(scoreLabelSnapshot.value); + } + if (scoreUnitSnapshot.present) { + map['score_unit_snapshot'] = Variable(scoreUnitSnapshot.value); + } + if (note.present) { + map['note'] = Variable(note.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('ActiveSetResultsCompanion(') + ..write('id: $id, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('schemaVersion: $schemaVersion, ') + ..write('syncState: $syncState, ') + ..write('localRevision: $localRevision, ') + ..write('originDeviceId: $originDeviceId, ') + ..write('futureOwnerProfileId: $futureOwnerProfileId, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('remoteRevision: $remoteRevision, ') + ..write('activeWorkoutSessionId: $activeWorkoutSessionId, ') + ..write('programSnapshotId: $programSnapshotId, ') + ..write('exerciseSnapshotId: $exerciseSnapshotId, ') + ..write('programIndex: $programIndex, ') + ..write('exerciseIndex: $exerciseIndex, ') + ..write('setIndex: $setIndex, ') + ..write('startedAt: $startedAt, ') + ..write('completedAt: $completedAt, ') + ..write('actualTimeMs: $actualTimeMs, ') + ..write('actualReps: $actualReps, ') + ..write('actualScore: $actualScore, ') + ..write('scoreLabelSnapshot: $scoreLabelSnapshot, ') + ..write('scoreUnitSnapshot: $scoreUnitSnapshot, ') + ..write('note: $note, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class $ChangeLogEntriesTable extends ChangeLogEntries + with TableInfo<$ChangeLogEntriesTable, ChangeLogEntry> { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + $ChangeLogEntriesTable(this.attachedDatabase, [this._alias]); + static const VerificationMeta _idMeta = const VerificationMeta('id'); + @override + late final GeneratedColumn id = GeneratedColumn( + 'id', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _entityTypeMeta = const VerificationMeta( + 'entityType', + ); + @override + late final GeneratedColumn entityType = GeneratedColumn( + 'entity_type', + aliasedName, + false, + additionalChecks: GeneratedColumn.checkTextLength(minTextLength: 1), + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _entityIdMeta = const VerificationMeta( + 'entityId', + ); + @override + late final GeneratedColumn entityId = GeneratedColumn( + 'entity_id', + aliasedName, + false, + additionalChecks: GeneratedColumn.checkTextLength(minTextLength: 1), + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _operationMeta = const VerificationMeta( + 'operation', + ); + @override + late final GeneratedColumn operation = GeneratedColumn( + 'operation', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _payloadHashMeta = const VerificationMeta( + 'payloadHash', + ); + @override + late final GeneratedColumn payloadHash = GeneratedColumn( + 'payload_hash', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _localRevisionMeta = const VerificationMeta( + 'localRevision', + ); + @override + late final GeneratedColumn localRevision = GeneratedColumn( + 'local_revision', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + ); + static const VerificationMeta _originDeviceIdMeta = const VerificationMeta( + 'originDeviceId', + ); + @override + late final GeneratedColumn originDeviceId = GeneratedColumn( + 'origin_device_id', + aliasedName, + false, + additionalChecks: GeneratedColumn.checkTextLength(minTextLength: 1), + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _createdAtMeta = const VerificationMeta( + 'createdAt', + ); + @override + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + ); + static const VerificationMeta _syncedAtMeta = const VerificationMeta( + 'syncedAt', + ); + @override + late final GeneratedColumn syncedAt = GeneratedColumn( + 'synced_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + @override + List get $columns => [ + id, + entityType, + entityId, + operation, + payloadHash, + localRevision, + originDeviceId, + createdAt, + syncedAt, + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'change_log'; + @override + VerificationContext validateIntegrity( + Insertable instance, { + bool isInserting = false, + }) { + final context = VerificationContext(); + final data = instance.toColumns(true); + if (data.containsKey('id')) { + context.handle(_idMeta, id.isAcceptableOrUnknown(data['id']!, _idMeta)); + } else if (isInserting) { + context.missing(_idMeta); + } + if (data.containsKey('entity_type')) { + context.handle( + _entityTypeMeta, + entityType.isAcceptableOrUnknown(data['entity_type']!, _entityTypeMeta), + ); + } else if (isInserting) { + context.missing(_entityTypeMeta); + } + if (data.containsKey('entity_id')) { + context.handle( + _entityIdMeta, + entityId.isAcceptableOrUnknown(data['entity_id']!, _entityIdMeta), + ); + } else if (isInserting) { + context.missing(_entityIdMeta); + } + if (data.containsKey('operation')) { + context.handle( + _operationMeta, + operation.isAcceptableOrUnknown(data['operation']!, _operationMeta), + ); + } else if (isInserting) { + context.missing(_operationMeta); + } + if (data.containsKey('payload_hash')) { + context.handle( + _payloadHashMeta, + payloadHash.isAcceptableOrUnknown( + data['payload_hash']!, + _payloadHashMeta, + ), + ); + } + if (data.containsKey('local_revision')) { + context.handle( + _localRevisionMeta, + localRevision.isAcceptableOrUnknown( + data['local_revision']!, + _localRevisionMeta, + ), + ); + } else if (isInserting) { + context.missing(_localRevisionMeta); + } + if (data.containsKey('origin_device_id')) { + context.handle( + _originDeviceIdMeta, + originDeviceId.isAcceptableOrUnknown( + data['origin_device_id']!, + _originDeviceIdMeta, + ), + ); + } else if (isInserting) { + context.missing(_originDeviceIdMeta); + } + if (data.containsKey('created_at')) { + context.handle( + _createdAtMeta, + createdAt.isAcceptableOrUnknown(data['created_at']!, _createdAtMeta), + ); + } else if (isInserting) { + context.missing(_createdAtMeta); + } + if (data.containsKey('synced_at')) { + context.handle( + _syncedAtMeta, + syncedAt.isAcceptableOrUnknown(data['synced_at']!, _syncedAtMeta), + ); + } + return context; + } + + @override + Set get $primaryKey => {id}; + @override + ChangeLogEntry map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return ChangeLogEntry( + id: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}id'], + )!, + entityType: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}entity_type'], + )!, + entityId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}entity_id'], + )!, + operation: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}operation'], + )!, + payloadHash: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}payload_hash'], + ), + localRevision: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}local_revision'], + )!, + originDeviceId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}origin_device_id'], + )!, + createdAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}created_at'], + )!, + syncedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}synced_at'], + ), + ); + } + + @override + $ChangeLogEntriesTable createAlias(String alias) { + return $ChangeLogEntriesTable(attachedDatabase, alias); + } +} + +class ChangeLogEntry extends DataClass implements Insertable { + final String id; + final String entityType; + final String entityId; + final String operation; + final String? payloadHash; + final int localRevision; + final String originDeviceId; + final DateTime createdAt; + final DateTime? syncedAt; + const ChangeLogEntry({ + required this.id, + required this.entityType, + required this.entityId, + required this.operation, + this.payloadHash, + required this.localRevision, + required this.originDeviceId, + required this.createdAt, + this.syncedAt, + }); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['entity_type'] = Variable(entityType); + map['entity_id'] = Variable(entityId); + map['operation'] = Variable(operation); + if (!nullToAbsent || payloadHash != null) { + map['payload_hash'] = Variable(payloadHash); + } + map['local_revision'] = Variable(localRevision); + map['origin_device_id'] = Variable(originDeviceId); + map['created_at'] = Variable(createdAt); + if (!nullToAbsent || syncedAt != null) { + map['synced_at'] = Variable(syncedAt); + } + return map; + } + + ChangeLogEntriesCompanion toCompanion(bool nullToAbsent) { + return ChangeLogEntriesCompanion( + id: Value(id), + entityType: Value(entityType), + entityId: Value(entityId), + operation: Value(operation), + payloadHash: payloadHash == null && nullToAbsent + ? const Value.absent() + : Value(payloadHash), + localRevision: Value(localRevision), + originDeviceId: Value(originDeviceId), + createdAt: Value(createdAt), + syncedAt: syncedAt == null && nullToAbsent + ? const Value.absent() + : Value(syncedAt), + ); + } + + factory ChangeLogEntry.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return ChangeLogEntry( + id: serializer.fromJson(json['id']), + entityType: serializer.fromJson(json['entityType']), + entityId: serializer.fromJson(json['entityId']), + operation: serializer.fromJson(json['operation']), + payloadHash: serializer.fromJson(json['payloadHash']), + localRevision: serializer.fromJson(json['localRevision']), + originDeviceId: serializer.fromJson(json['originDeviceId']), + createdAt: serializer.fromJson(json['createdAt']), + syncedAt: serializer.fromJson(json['syncedAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'entityType': serializer.toJson(entityType), + 'entityId': serializer.toJson(entityId), + 'operation': serializer.toJson(operation), + 'payloadHash': serializer.toJson(payloadHash), + 'localRevision': serializer.toJson(localRevision), + 'originDeviceId': serializer.toJson(originDeviceId), + 'createdAt': serializer.toJson(createdAt), + 'syncedAt': serializer.toJson(syncedAt), + }; + } + + ChangeLogEntry copyWith({ + String? id, + String? entityType, + String? entityId, + String? operation, + Value payloadHash = const Value.absent(), + int? localRevision, + String? originDeviceId, + DateTime? createdAt, + Value syncedAt = const Value.absent(), + }) => ChangeLogEntry( + id: id ?? this.id, + entityType: entityType ?? this.entityType, + entityId: entityId ?? this.entityId, + operation: operation ?? this.operation, + payloadHash: payloadHash.present ? payloadHash.value : this.payloadHash, + localRevision: localRevision ?? this.localRevision, + originDeviceId: originDeviceId ?? this.originDeviceId, + createdAt: createdAt ?? this.createdAt, + syncedAt: syncedAt.present ? syncedAt.value : this.syncedAt, + ); + ChangeLogEntry copyWithCompanion(ChangeLogEntriesCompanion data) { + return ChangeLogEntry( + id: data.id.present ? data.id.value : this.id, + entityType: data.entityType.present + ? data.entityType.value + : this.entityType, + entityId: data.entityId.present ? data.entityId.value : this.entityId, + operation: data.operation.present ? data.operation.value : this.operation, + payloadHash: data.payloadHash.present + ? data.payloadHash.value + : this.payloadHash, + localRevision: data.localRevision.present + ? data.localRevision.value + : this.localRevision, + originDeviceId: data.originDeviceId.present + ? data.originDeviceId.value + : this.originDeviceId, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + syncedAt: data.syncedAt.present ? data.syncedAt.value : this.syncedAt, + ); + } + + @override + String toString() { + return (StringBuffer('ChangeLogEntry(') + ..write('id: $id, ') + ..write('entityType: $entityType, ') + ..write('entityId: $entityId, ') + ..write('operation: $operation, ') + ..write('payloadHash: $payloadHash, ') + ..write('localRevision: $localRevision, ') + ..write('originDeviceId: $originDeviceId, ') + ..write('createdAt: $createdAt, ') + ..write('syncedAt: $syncedAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash( + id, + entityType, + entityId, + operation, + payloadHash, + localRevision, + originDeviceId, + createdAt, + syncedAt, + ); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is ChangeLogEntry && + other.id == this.id && + other.entityType == this.entityType && + other.entityId == this.entityId && + other.operation == this.operation && + other.payloadHash == this.payloadHash && + other.localRevision == this.localRevision && + other.originDeviceId == this.originDeviceId && + other.createdAt == this.createdAt && + other.syncedAt == this.syncedAt); +} + +class ChangeLogEntriesCompanion extends UpdateCompanion { + final Value id; + final Value entityType; + final Value entityId; + final Value operation; + final Value payloadHash; + final Value localRevision; + final Value originDeviceId; + final Value createdAt; + final Value syncedAt; + final Value rowid; + const ChangeLogEntriesCompanion({ + this.id = const Value.absent(), + this.entityType = const Value.absent(), + this.entityId = const Value.absent(), + this.operation = const Value.absent(), + this.payloadHash = const Value.absent(), + this.localRevision = const Value.absent(), + this.originDeviceId = const Value.absent(), + this.createdAt = const Value.absent(), + this.syncedAt = const Value.absent(), + this.rowid = const Value.absent(), + }); + ChangeLogEntriesCompanion.insert({ + required String id, + required String entityType, + required String entityId, + required String operation, + this.payloadHash = const Value.absent(), + required int localRevision, + required String originDeviceId, + required DateTime createdAt, + this.syncedAt = const Value.absent(), + this.rowid = const Value.absent(), + }) : id = Value(id), + entityType = Value(entityType), + entityId = Value(entityId), + operation = Value(operation), + localRevision = Value(localRevision), + originDeviceId = Value(originDeviceId), + createdAt = Value(createdAt); + static Insertable custom({ + Expression? id, + Expression? entityType, + Expression? entityId, + Expression? operation, + Expression? payloadHash, + Expression? localRevision, + Expression? originDeviceId, + Expression? createdAt, + Expression? syncedAt, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (entityType != null) 'entity_type': entityType, + if (entityId != null) 'entity_id': entityId, + if (operation != null) 'operation': operation, + if (payloadHash != null) 'payload_hash': payloadHash, + if (localRevision != null) 'local_revision': localRevision, + if (originDeviceId != null) 'origin_device_id': originDeviceId, + if (createdAt != null) 'created_at': createdAt, + if (syncedAt != null) 'synced_at': syncedAt, + if (rowid != null) 'rowid': rowid, + }); + } + + ChangeLogEntriesCompanion copyWith({ + Value? id, + Value? entityType, + Value? entityId, + Value? operation, + Value? payloadHash, + Value? localRevision, + Value? originDeviceId, + Value? createdAt, + Value? syncedAt, + Value? rowid, + }) { + return ChangeLogEntriesCompanion( + id: id ?? this.id, + entityType: entityType ?? this.entityType, + entityId: entityId ?? this.entityId, + operation: operation ?? this.operation, + payloadHash: payloadHash ?? this.payloadHash, + localRevision: localRevision ?? this.localRevision, + originDeviceId: originDeviceId ?? this.originDeviceId, + createdAt: createdAt ?? this.createdAt, + syncedAt: syncedAt ?? this.syncedAt, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (entityType.present) { + map['entity_type'] = Variable(entityType.value); + } + if (entityId.present) { + map['entity_id'] = Variable(entityId.value); + } + if (operation.present) { + map['operation'] = Variable(operation.value); + } + if (payloadHash.present) { + map['payload_hash'] = Variable(payloadHash.value); + } + if (localRevision.present) { + map['local_revision'] = Variable(localRevision.value); + } + if (originDeviceId.present) { + map['origin_device_id'] = Variable(originDeviceId.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + if (syncedAt.present) { + map['synced_at'] = Variable(syncedAt.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('ChangeLogEntriesCompanion(') + ..write('id: $id, ') + ..write('entityType: $entityType, ') + ..write('entityId: $entityId, ') + ..write('operation: $operation, ') + ..write('payloadHash: $payloadHash, ') + ..write('localRevision: $localRevision, ') + ..write('originDeviceId: $originDeviceId, ') + ..write('createdAt: $createdAt, ') + ..write('syncedAt: $syncedAt, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class $MediaAssetsTable extends MediaAssets + with TableInfo<$MediaAssetsTable, MediaAsset> { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + $MediaAssetsTable(this.attachedDatabase, [this._alias]); + static const VerificationMeta _idMeta = const VerificationMeta('id'); + @override + late final GeneratedColumn id = GeneratedColumn( + 'id', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _createdAtMeta = const VerificationMeta( + 'createdAt', + ); + @override + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + ); + static const VerificationMeta _updatedAtMeta = const VerificationMeta( + 'updatedAt', + ); + @override + late final GeneratedColumn updatedAt = GeneratedColumn( + 'updated_at', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + ); + static const VerificationMeta _deletedAtMeta = const VerificationMeta( + 'deletedAt', + ); + @override + late final GeneratedColumn deletedAt = GeneratedColumn( + 'deleted_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + static const VerificationMeta _schemaVersionMeta = const VerificationMeta( + 'schemaVersion', + ); + @override + late final GeneratedColumn schemaVersion = GeneratedColumn( + 'schema_version', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultValue: const Constant(1), + ); + static const VerificationMeta _syncStateMeta = const VerificationMeta( + 'syncState', + ); + @override + late final GeneratedColumn syncState = GeneratedColumn( + 'sync_state', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: + 'NOT NULL CHECK (sync_state IN (\'localOnly\', \'dirty\', \'synced\', \'deleted\'))', + ); + static const VerificationMeta _localRevisionMeta = const VerificationMeta( + 'localRevision', + ); + @override + late final GeneratedColumn localRevision = GeneratedColumn( + 'local_revision', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL CHECK (local_revision >= 0)', + ); + static const VerificationMeta _originDeviceIdMeta = const VerificationMeta( + 'originDeviceId', + ); + @override + late final GeneratedColumn originDeviceId = GeneratedColumn( + 'origin_device_id', + aliasedName, + false, + additionalChecks: GeneratedColumn.checkTextLength(minTextLength: 1), + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _futureOwnerProfileIdMeta = + const VerificationMeta('futureOwnerProfileId'); + @override + late final GeneratedColumn futureOwnerProfileId = + GeneratedColumn( + 'future_owner_profile_id', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _lastSyncedAtMeta = const VerificationMeta( + 'lastSyncedAt', + ); + @override + late final GeneratedColumn lastSyncedAt = GeneratedColumn( + 'last_synced_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + static const VerificationMeta _remoteRevisionMeta = const VerificationMeta( + 'remoteRevision', + ); + @override + late final GeneratedColumn remoteRevision = GeneratedColumn( + 'remote_revision', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _kindMeta = const VerificationMeta('kind'); + @override + late final GeneratedColumn kind = GeneratedColumn( + 'kind', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _localUriMeta = const VerificationMeta( + 'localUri', + ); + @override + late final GeneratedColumn localUri = GeneratedColumn( + 'local_uri', + aliasedName, + false, + additionalChecks: GeneratedColumn.checkTextLength(minTextLength: 1), + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _mimeTypeMeta = const VerificationMeta( + 'mimeType', + ); + @override + late final GeneratedColumn mimeType = GeneratedColumn( + 'mime_type', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _sizeBytesMeta = const VerificationMeta( + 'sizeBytes', + ); + @override + late final GeneratedColumn sizeBytes = GeneratedColumn( + 'size_bytes', + aliasedName, + true, + type: DriftSqlType.int, + requiredDuringInsert: false, + ); + static const VerificationMeta _widthMeta = const VerificationMeta('width'); + @override + late final GeneratedColumn width = GeneratedColumn( + 'width', + aliasedName, + true, + type: DriftSqlType.int, + requiredDuringInsert: false, + ); + static const VerificationMeta _heightMeta = const VerificationMeta('height'); + @override + late final GeneratedColumn height = GeneratedColumn( + 'height', + aliasedName, + true, + type: DriftSqlType.int, + requiredDuringInsert: false, + ); + static const VerificationMeta _durationMsMeta = const VerificationMeta( + 'durationMs', + ); + @override + late final GeneratedColumn durationMs = GeneratedColumn( + 'duration_ms', + aliasedName, + true, + type: DriftSqlType.int, + requiredDuringInsert: false, + ); + static const VerificationMeta _checksumMeta = const VerificationMeta( + 'checksum', + ); + @override + late final GeneratedColumn checksum = GeneratedColumn( + 'checksum', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _remoteUriMeta = const VerificationMeta( + 'remoteUri', + ); + @override + late final GeneratedColumn remoteUri = GeneratedColumn( + 'remote_uri', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _thumbnailLocalUriMeta = const VerificationMeta( + 'thumbnailLocalUri', + ); + @override + late final GeneratedColumn thumbnailLocalUri = + GeneratedColumn( + 'thumbnail_local_uri', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + @override + List get $columns => [ + id, + createdAt, + updatedAt, + deletedAt, + schemaVersion, + syncState, + localRevision, + originDeviceId, + futureOwnerProfileId, + lastSyncedAt, + remoteRevision, + kind, + localUri, + mimeType, + sizeBytes, + width, + height, + durationMs, + checksum, + remoteUri, + thumbnailLocalUri, + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'media_assets'; + @override + VerificationContext validateIntegrity( + Insertable instance, { + bool isInserting = false, + }) { + final context = VerificationContext(); + final data = instance.toColumns(true); + if (data.containsKey('id')) { + context.handle(_idMeta, id.isAcceptableOrUnknown(data['id']!, _idMeta)); + } else if (isInserting) { + context.missing(_idMeta); + } + if (data.containsKey('created_at')) { + context.handle( + _createdAtMeta, + createdAt.isAcceptableOrUnknown(data['created_at']!, _createdAtMeta), + ); + } else if (isInserting) { + context.missing(_createdAtMeta); + } + if (data.containsKey('updated_at')) { + context.handle( + _updatedAtMeta, + updatedAt.isAcceptableOrUnknown(data['updated_at']!, _updatedAtMeta), + ); + } else if (isInserting) { + context.missing(_updatedAtMeta); + } + if (data.containsKey('deleted_at')) { + context.handle( + _deletedAtMeta, + deletedAt.isAcceptableOrUnknown(data['deleted_at']!, _deletedAtMeta), + ); + } + if (data.containsKey('schema_version')) { + context.handle( + _schemaVersionMeta, + schemaVersion.isAcceptableOrUnknown( + data['schema_version']!, + _schemaVersionMeta, + ), + ); + } + if (data.containsKey('sync_state')) { + context.handle( + _syncStateMeta, + syncState.isAcceptableOrUnknown(data['sync_state']!, _syncStateMeta), + ); + } else if (isInserting) { + context.missing(_syncStateMeta); + } + if (data.containsKey('local_revision')) { + context.handle( + _localRevisionMeta, + localRevision.isAcceptableOrUnknown( + data['local_revision']!, + _localRevisionMeta, + ), + ); + } else if (isInserting) { + context.missing(_localRevisionMeta); + } + if (data.containsKey('origin_device_id')) { + context.handle( + _originDeviceIdMeta, + originDeviceId.isAcceptableOrUnknown( + data['origin_device_id']!, + _originDeviceIdMeta, + ), + ); + } else if (isInserting) { + context.missing(_originDeviceIdMeta); + } + if (data.containsKey('future_owner_profile_id')) { + context.handle( + _futureOwnerProfileIdMeta, + futureOwnerProfileId.isAcceptableOrUnknown( + data['future_owner_profile_id']!, + _futureOwnerProfileIdMeta, + ), + ); + } + if (data.containsKey('last_synced_at')) { + context.handle( + _lastSyncedAtMeta, + lastSyncedAt.isAcceptableOrUnknown( + data['last_synced_at']!, + _lastSyncedAtMeta, + ), + ); + } + if (data.containsKey('remote_revision')) { + context.handle( + _remoteRevisionMeta, + remoteRevision.isAcceptableOrUnknown( + data['remote_revision']!, + _remoteRevisionMeta, + ), + ); + } + if (data.containsKey('kind')) { + context.handle( + _kindMeta, + kind.isAcceptableOrUnknown(data['kind']!, _kindMeta), + ); + } else if (isInserting) { + context.missing(_kindMeta); + } + if (data.containsKey('local_uri')) { + context.handle( + _localUriMeta, + localUri.isAcceptableOrUnknown(data['local_uri']!, _localUriMeta), + ); + } else if (isInserting) { + context.missing(_localUriMeta); + } + if (data.containsKey('mime_type')) { + context.handle( + _mimeTypeMeta, + mimeType.isAcceptableOrUnknown(data['mime_type']!, _mimeTypeMeta), + ); + } + if (data.containsKey('size_bytes')) { + context.handle( + _sizeBytesMeta, + sizeBytes.isAcceptableOrUnknown(data['size_bytes']!, _sizeBytesMeta), + ); + } + if (data.containsKey('width')) { + context.handle( + _widthMeta, + width.isAcceptableOrUnknown(data['width']!, _widthMeta), + ); + } + if (data.containsKey('height')) { + context.handle( + _heightMeta, + height.isAcceptableOrUnknown(data['height']!, _heightMeta), + ); + } + if (data.containsKey('duration_ms')) { + context.handle( + _durationMsMeta, + durationMs.isAcceptableOrUnknown(data['duration_ms']!, _durationMsMeta), + ); + } + if (data.containsKey('checksum')) { + context.handle( + _checksumMeta, + checksum.isAcceptableOrUnknown(data['checksum']!, _checksumMeta), + ); + } + if (data.containsKey('remote_uri')) { + context.handle( + _remoteUriMeta, + remoteUri.isAcceptableOrUnknown(data['remote_uri']!, _remoteUriMeta), + ); + } + if (data.containsKey('thumbnail_local_uri')) { + context.handle( + _thumbnailLocalUriMeta, + thumbnailLocalUri.isAcceptableOrUnknown( + data['thumbnail_local_uri']!, + _thumbnailLocalUriMeta, + ), + ); + } + return context; + } + + @override + Set get $primaryKey => {id}; + @override + MediaAsset map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return MediaAsset( + id: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}id'], + )!, + createdAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}created_at'], + )!, + updatedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}updated_at'], + )!, + deletedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}deleted_at'], + ), + schemaVersion: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}schema_version'], + )!, + syncState: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}sync_state'], + )!, + localRevision: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}local_revision'], + )!, + originDeviceId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}origin_device_id'], + )!, + futureOwnerProfileId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}future_owner_profile_id'], + ), + lastSyncedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}last_synced_at'], + ), + remoteRevision: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}remote_revision'], + ), + kind: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}kind'], + )!, + localUri: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}local_uri'], + )!, + mimeType: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}mime_type'], + ), + sizeBytes: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}size_bytes'], + ), + width: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}width'], + ), + height: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}height'], + ), + durationMs: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}duration_ms'], + ), + checksum: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}checksum'], + ), + remoteUri: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}remote_uri'], + ), + thumbnailLocalUri: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}thumbnail_local_uri'], + ), + ); + } + + @override + $MediaAssetsTable createAlias(String alias) { + return $MediaAssetsTable(attachedDatabase, alias); + } +} + +class MediaAsset extends DataClass implements Insertable { + final String id; + final DateTime createdAt; + final DateTime updatedAt; + final DateTime? deletedAt; + final int schemaVersion; + final String syncState; + final int localRevision; + final String originDeviceId; + final String? futureOwnerProfileId; + final DateTime? lastSyncedAt; + final String? remoteRevision; + final String kind; + final String localUri; + final String? mimeType; + final int? sizeBytes; + final int? width; + final int? height; + final int? durationMs; + final String? checksum; + final String? remoteUri; + final String? thumbnailLocalUri; + const MediaAsset({ + required this.id, + required this.createdAt, + required this.updatedAt, + this.deletedAt, + required this.schemaVersion, + required this.syncState, + required this.localRevision, + required this.originDeviceId, + this.futureOwnerProfileId, + this.lastSyncedAt, + this.remoteRevision, + required this.kind, + required this.localUri, + this.mimeType, + this.sizeBytes, + this.width, + this.height, + this.durationMs, + this.checksum, + this.remoteUri, + this.thumbnailLocalUri, + }); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['created_at'] = Variable(createdAt); + map['updated_at'] = Variable(updatedAt); + if (!nullToAbsent || deletedAt != null) { + map['deleted_at'] = Variable(deletedAt); + } + map['schema_version'] = Variable(schemaVersion); + map['sync_state'] = Variable(syncState); + map['local_revision'] = Variable(localRevision); + map['origin_device_id'] = Variable(originDeviceId); + if (!nullToAbsent || futureOwnerProfileId != null) { + map['future_owner_profile_id'] = Variable(futureOwnerProfileId); + } + if (!nullToAbsent || lastSyncedAt != null) { + map['last_synced_at'] = Variable(lastSyncedAt); + } + if (!nullToAbsent || remoteRevision != null) { + map['remote_revision'] = Variable(remoteRevision); + } + map['kind'] = Variable(kind); + map['local_uri'] = Variable(localUri); + if (!nullToAbsent || mimeType != null) { + map['mime_type'] = Variable(mimeType); + } + if (!nullToAbsent || sizeBytes != null) { + map['size_bytes'] = Variable(sizeBytes); + } + if (!nullToAbsent || width != null) { + map['width'] = Variable(width); + } + if (!nullToAbsent || height != null) { + map['height'] = Variable(height); + } + if (!nullToAbsent || durationMs != null) { + map['duration_ms'] = Variable(durationMs); + } + if (!nullToAbsent || checksum != null) { + map['checksum'] = Variable(checksum); + } + if (!nullToAbsent || remoteUri != null) { + map['remote_uri'] = Variable(remoteUri); + } + if (!nullToAbsent || thumbnailLocalUri != null) { + map['thumbnail_local_uri'] = Variable(thumbnailLocalUri); + } + return map; + } + + MediaAssetsCompanion toCompanion(bool nullToAbsent) { + return MediaAssetsCompanion( + id: Value(id), + createdAt: Value(createdAt), + updatedAt: Value(updatedAt), + deletedAt: deletedAt == null && nullToAbsent + ? const Value.absent() + : Value(deletedAt), + schemaVersion: Value(schemaVersion), + syncState: Value(syncState), + localRevision: Value(localRevision), + originDeviceId: Value(originDeviceId), + futureOwnerProfileId: futureOwnerProfileId == null && nullToAbsent + ? const Value.absent() + : Value(futureOwnerProfileId), + lastSyncedAt: lastSyncedAt == null && nullToAbsent + ? const Value.absent() + : Value(lastSyncedAt), + remoteRevision: remoteRevision == null && nullToAbsent + ? const Value.absent() + : Value(remoteRevision), + kind: Value(kind), + localUri: Value(localUri), + mimeType: mimeType == null && nullToAbsent + ? const Value.absent() + : Value(mimeType), + sizeBytes: sizeBytes == null && nullToAbsent + ? const Value.absent() + : Value(sizeBytes), + width: width == null && nullToAbsent + ? const Value.absent() + : Value(width), + height: height == null && nullToAbsent + ? const Value.absent() + : Value(height), + durationMs: durationMs == null && nullToAbsent + ? const Value.absent() + : Value(durationMs), + checksum: checksum == null && nullToAbsent + ? const Value.absent() + : Value(checksum), + remoteUri: remoteUri == null && nullToAbsent + ? const Value.absent() + : Value(remoteUri), + thumbnailLocalUri: thumbnailLocalUri == null && nullToAbsent + ? const Value.absent() + : Value(thumbnailLocalUri), + ); + } + + factory MediaAsset.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return MediaAsset( + id: serializer.fromJson(json['id']), + createdAt: serializer.fromJson(json['createdAt']), + updatedAt: serializer.fromJson(json['updatedAt']), + deletedAt: serializer.fromJson(json['deletedAt']), + schemaVersion: serializer.fromJson(json['schemaVersion']), + syncState: serializer.fromJson(json['syncState']), + localRevision: serializer.fromJson(json['localRevision']), + originDeviceId: serializer.fromJson(json['originDeviceId']), + futureOwnerProfileId: serializer.fromJson( + json['futureOwnerProfileId'], + ), + lastSyncedAt: serializer.fromJson(json['lastSyncedAt']), + remoteRevision: serializer.fromJson(json['remoteRevision']), + kind: serializer.fromJson(json['kind']), + localUri: serializer.fromJson(json['localUri']), + mimeType: serializer.fromJson(json['mimeType']), + sizeBytes: serializer.fromJson(json['sizeBytes']), + width: serializer.fromJson(json['width']), + height: serializer.fromJson(json['height']), + durationMs: serializer.fromJson(json['durationMs']), + checksum: serializer.fromJson(json['checksum']), + remoteUri: serializer.fromJson(json['remoteUri']), + thumbnailLocalUri: serializer.fromJson( + json['thumbnailLocalUri'], + ), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'createdAt': serializer.toJson(createdAt), + 'updatedAt': serializer.toJson(updatedAt), + 'deletedAt': serializer.toJson(deletedAt), + 'schemaVersion': serializer.toJson(schemaVersion), + 'syncState': serializer.toJson(syncState), + 'localRevision': serializer.toJson(localRevision), + 'originDeviceId': serializer.toJson(originDeviceId), + 'futureOwnerProfileId': serializer.toJson(futureOwnerProfileId), + 'lastSyncedAt': serializer.toJson(lastSyncedAt), + 'remoteRevision': serializer.toJson(remoteRevision), + 'kind': serializer.toJson(kind), + 'localUri': serializer.toJson(localUri), + 'mimeType': serializer.toJson(mimeType), + 'sizeBytes': serializer.toJson(sizeBytes), + 'width': serializer.toJson(width), + 'height': serializer.toJson(height), + 'durationMs': serializer.toJson(durationMs), + 'checksum': serializer.toJson(checksum), + 'remoteUri': serializer.toJson(remoteUri), + 'thumbnailLocalUri': serializer.toJson(thumbnailLocalUri), + }; + } + + MediaAsset copyWith({ + String? id, + DateTime? createdAt, + DateTime? updatedAt, + Value deletedAt = const Value.absent(), + int? schemaVersion, + String? syncState, + int? localRevision, + String? originDeviceId, + Value futureOwnerProfileId = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + Value remoteRevision = const Value.absent(), + String? kind, + String? localUri, + Value mimeType = const Value.absent(), + Value sizeBytes = const Value.absent(), + Value width = const Value.absent(), + Value height = const Value.absent(), + Value durationMs = const Value.absent(), + Value checksum = const Value.absent(), + Value remoteUri = const Value.absent(), + Value thumbnailLocalUri = const Value.absent(), + }) => MediaAsset( + id: id ?? this.id, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt.present ? deletedAt.value : this.deletedAt, + schemaVersion: schemaVersion ?? this.schemaVersion, + syncState: syncState ?? this.syncState, + localRevision: localRevision ?? this.localRevision, + originDeviceId: originDeviceId ?? this.originDeviceId, + futureOwnerProfileId: futureOwnerProfileId.present + ? futureOwnerProfileId.value + : this.futureOwnerProfileId, + lastSyncedAt: lastSyncedAt.present ? lastSyncedAt.value : this.lastSyncedAt, + remoteRevision: remoteRevision.present + ? remoteRevision.value + : this.remoteRevision, + kind: kind ?? this.kind, + localUri: localUri ?? this.localUri, + mimeType: mimeType.present ? mimeType.value : this.mimeType, + sizeBytes: sizeBytes.present ? sizeBytes.value : this.sizeBytes, + width: width.present ? width.value : this.width, + height: height.present ? height.value : this.height, + durationMs: durationMs.present ? durationMs.value : this.durationMs, + checksum: checksum.present ? checksum.value : this.checksum, + remoteUri: remoteUri.present ? remoteUri.value : this.remoteUri, + thumbnailLocalUri: thumbnailLocalUri.present + ? thumbnailLocalUri.value + : this.thumbnailLocalUri, + ); + MediaAsset copyWithCompanion(MediaAssetsCompanion data) { + return MediaAsset( + id: data.id.present ? data.id.value : this.id, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + updatedAt: data.updatedAt.present ? data.updatedAt.value : this.updatedAt, + deletedAt: data.deletedAt.present ? data.deletedAt.value : this.deletedAt, + schemaVersion: data.schemaVersion.present + ? data.schemaVersion.value + : this.schemaVersion, + syncState: data.syncState.present ? data.syncState.value : this.syncState, + localRevision: data.localRevision.present + ? data.localRevision.value + : this.localRevision, + originDeviceId: data.originDeviceId.present + ? data.originDeviceId.value + : this.originDeviceId, + futureOwnerProfileId: data.futureOwnerProfileId.present + ? data.futureOwnerProfileId.value + : this.futureOwnerProfileId, + lastSyncedAt: data.lastSyncedAt.present + ? data.lastSyncedAt.value + : this.lastSyncedAt, + remoteRevision: data.remoteRevision.present + ? data.remoteRevision.value + : this.remoteRevision, + kind: data.kind.present ? data.kind.value : this.kind, + localUri: data.localUri.present ? data.localUri.value : this.localUri, + mimeType: data.mimeType.present ? data.mimeType.value : this.mimeType, + sizeBytes: data.sizeBytes.present ? data.sizeBytes.value : this.sizeBytes, + width: data.width.present ? data.width.value : this.width, + height: data.height.present ? data.height.value : this.height, + durationMs: data.durationMs.present + ? data.durationMs.value + : this.durationMs, + checksum: data.checksum.present ? data.checksum.value : this.checksum, + remoteUri: data.remoteUri.present ? data.remoteUri.value : this.remoteUri, + thumbnailLocalUri: data.thumbnailLocalUri.present + ? data.thumbnailLocalUri.value + : this.thumbnailLocalUri, + ); + } + + @override + String toString() { + return (StringBuffer('MediaAsset(') + ..write('id: $id, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('schemaVersion: $schemaVersion, ') + ..write('syncState: $syncState, ') + ..write('localRevision: $localRevision, ') + ..write('originDeviceId: $originDeviceId, ') + ..write('futureOwnerProfileId: $futureOwnerProfileId, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('remoteRevision: $remoteRevision, ') + ..write('kind: $kind, ') + ..write('localUri: $localUri, ') + ..write('mimeType: $mimeType, ') + ..write('sizeBytes: $sizeBytes, ') + ..write('width: $width, ') + ..write('height: $height, ') + ..write('durationMs: $durationMs, ') + ..write('checksum: $checksum, ') + ..write('remoteUri: $remoteUri, ') + ..write('thumbnailLocalUri: $thumbnailLocalUri') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hashAll([ + id, + createdAt, + updatedAt, + deletedAt, + schemaVersion, + syncState, + localRevision, + originDeviceId, + futureOwnerProfileId, + lastSyncedAt, + remoteRevision, + kind, + localUri, + mimeType, + sizeBytes, + width, + height, + durationMs, + checksum, + remoteUri, + thumbnailLocalUri, + ]); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is MediaAsset && + other.id == this.id && + other.createdAt == this.createdAt && + other.updatedAt == this.updatedAt && + other.deletedAt == this.deletedAt && + other.schemaVersion == this.schemaVersion && + other.syncState == this.syncState && + other.localRevision == this.localRevision && + other.originDeviceId == this.originDeviceId && + other.futureOwnerProfileId == this.futureOwnerProfileId && + other.lastSyncedAt == this.lastSyncedAt && + other.remoteRevision == this.remoteRevision && + other.kind == this.kind && + other.localUri == this.localUri && + other.mimeType == this.mimeType && + other.sizeBytes == this.sizeBytes && + other.width == this.width && + other.height == this.height && + other.durationMs == this.durationMs && + other.checksum == this.checksum && + other.remoteUri == this.remoteUri && + other.thumbnailLocalUri == this.thumbnailLocalUri); +} + +class MediaAssetsCompanion extends UpdateCompanion { + final Value id; + final Value createdAt; + final Value updatedAt; + final Value deletedAt; + final Value schemaVersion; + final Value syncState; + final Value localRevision; + final Value originDeviceId; + final Value futureOwnerProfileId; + final Value lastSyncedAt; + final Value remoteRevision; + final Value kind; + final Value localUri; + final Value mimeType; + final Value sizeBytes; + final Value width; + final Value height; + final Value durationMs; + final Value checksum; + final Value remoteUri; + final Value thumbnailLocalUri; + final Value rowid; + const MediaAssetsCompanion({ + this.id = const Value.absent(), + this.createdAt = const Value.absent(), + this.updatedAt = const Value.absent(), + this.deletedAt = const Value.absent(), + this.schemaVersion = const Value.absent(), + this.syncState = const Value.absent(), + this.localRevision = const Value.absent(), + this.originDeviceId = const Value.absent(), + this.futureOwnerProfileId = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + this.remoteRevision = const Value.absent(), + this.kind = const Value.absent(), + this.localUri = const Value.absent(), + this.mimeType = const Value.absent(), + this.sizeBytes = const Value.absent(), + this.width = const Value.absent(), + this.height = const Value.absent(), + this.durationMs = const Value.absent(), + this.checksum = const Value.absent(), + this.remoteUri = const Value.absent(), + this.thumbnailLocalUri = const Value.absent(), + this.rowid = const Value.absent(), + }); + MediaAssetsCompanion.insert({ + required String id, + required DateTime createdAt, + required DateTime updatedAt, + this.deletedAt = const Value.absent(), + this.schemaVersion = const Value.absent(), + required String syncState, + required int localRevision, + required String originDeviceId, + this.futureOwnerProfileId = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + this.remoteRevision = const Value.absent(), + required String kind, + required String localUri, + this.mimeType = const Value.absent(), + this.sizeBytes = const Value.absent(), + this.width = const Value.absent(), + this.height = const Value.absent(), + this.durationMs = const Value.absent(), + this.checksum = const Value.absent(), + this.remoteUri = const Value.absent(), + this.thumbnailLocalUri = const Value.absent(), + this.rowid = const Value.absent(), + }) : id = Value(id), + createdAt = Value(createdAt), + updatedAt = Value(updatedAt), + syncState = Value(syncState), + localRevision = Value(localRevision), + originDeviceId = Value(originDeviceId), + kind = Value(kind), + localUri = Value(localUri); + static Insertable custom({ + Expression? id, + Expression? createdAt, + Expression? updatedAt, + Expression? deletedAt, + Expression? schemaVersion, + Expression? syncState, + Expression? localRevision, + Expression? originDeviceId, + Expression? futureOwnerProfileId, + Expression? lastSyncedAt, + Expression? remoteRevision, + Expression? kind, + Expression? localUri, + Expression? mimeType, + Expression? sizeBytes, + Expression? width, + Expression? height, + Expression? durationMs, + Expression? checksum, + Expression? remoteUri, + Expression? thumbnailLocalUri, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (createdAt != null) 'created_at': createdAt, + if (updatedAt != null) 'updated_at': updatedAt, + if (deletedAt != null) 'deleted_at': deletedAt, + if (schemaVersion != null) 'schema_version': schemaVersion, + if (syncState != null) 'sync_state': syncState, + if (localRevision != null) 'local_revision': localRevision, + if (originDeviceId != null) 'origin_device_id': originDeviceId, + if (futureOwnerProfileId != null) + 'future_owner_profile_id': futureOwnerProfileId, + if (lastSyncedAt != null) 'last_synced_at': lastSyncedAt, + if (remoteRevision != null) 'remote_revision': remoteRevision, + if (kind != null) 'kind': kind, + if (localUri != null) 'local_uri': localUri, + if (mimeType != null) 'mime_type': mimeType, + if (sizeBytes != null) 'size_bytes': sizeBytes, + if (width != null) 'width': width, + if (height != null) 'height': height, + if (durationMs != null) 'duration_ms': durationMs, + if (checksum != null) 'checksum': checksum, + if (remoteUri != null) 'remote_uri': remoteUri, + if (thumbnailLocalUri != null) 'thumbnail_local_uri': thumbnailLocalUri, + if (rowid != null) 'rowid': rowid, + }); + } + + MediaAssetsCompanion copyWith({ + Value? id, + Value? createdAt, + Value? updatedAt, + Value? deletedAt, + Value? schemaVersion, + Value? syncState, + Value? localRevision, + Value? originDeviceId, + Value? futureOwnerProfileId, + Value? lastSyncedAt, + Value? remoteRevision, + Value? kind, + Value? localUri, + Value? mimeType, + Value? sizeBytes, + Value? width, + Value? height, + Value? durationMs, + Value? checksum, + Value? remoteUri, + Value? thumbnailLocalUri, + Value? rowid, + }) { + return MediaAssetsCompanion( + id: id ?? this.id, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt ?? this.deletedAt, + schemaVersion: schemaVersion ?? this.schemaVersion, + syncState: syncState ?? this.syncState, + localRevision: localRevision ?? this.localRevision, + originDeviceId: originDeviceId ?? this.originDeviceId, + futureOwnerProfileId: futureOwnerProfileId ?? this.futureOwnerProfileId, + lastSyncedAt: lastSyncedAt ?? this.lastSyncedAt, + remoteRevision: remoteRevision ?? this.remoteRevision, + kind: kind ?? this.kind, + localUri: localUri ?? this.localUri, + mimeType: mimeType ?? this.mimeType, + sizeBytes: sizeBytes ?? this.sizeBytes, + width: width ?? this.width, + height: height ?? this.height, + durationMs: durationMs ?? this.durationMs, + checksum: checksum ?? this.checksum, + remoteUri: remoteUri ?? this.remoteUri, + thumbnailLocalUri: thumbnailLocalUri ?? this.thumbnailLocalUri, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + if (updatedAt.present) { + map['updated_at'] = Variable(updatedAt.value); + } + if (deletedAt.present) { + map['deleted_at'] = Variable(deletedAt.value); + } + if (schemaVersion.present) { + map['schema_version'] = Variable(schemaVersion.value); + } + if (syncState.present) { + map['sync_state'] = Variable(syncState.value); + } + if (localRevision.present) { + map['local_revision'] = Variable(localRevision.value); + } + if (originDeviceId.present) { + map['origin_device_id'] = Variable(originDeviceId.value); + } + if (futureOwnerProfileId.present) { + map['future_owner_profile_id'] = Variable( + futureOwnerProfileId.value, + ); + } + if (lastSyncedAt.present) { + map['last_synced_at'] = Variable(lastSyncedAt.value); + } + if (remoteRevision.present) { + map['remote_revision'] = Variable(remoteRevision.value); + } + if (kind.present) { + map['kind'] = Variable(kind.value); + } + if (localUri.present) { + map['local_uri'] = Variable(localUri.value); + } + if (mimeType.present) { + map['mime_type'] = Variable(mimeType.value); + } + if (sizeBytes.present) { + map['size_bytes'] = Variable(sizeBytes.value); + } + if (width.present) { + map['width'] = Variable(width.value); + } + if (height.present) { + map['height'] = Variable(height.value); + } + if (durationMs.present) { + map['duration_ms'] = Variable(durationMs.value); + } + if (checksum.present) { + map['checksum'] = Variable(checksum.value); + } + if (remoteUri.present) { + map['remote_uri'] = Variable(remoteUri.value); + } + if (thumbnailLocalUri.present) { + map['thumbnail_local_uri'] = Variable(thumbnailLocalUri.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('MediaAssetsCompanion(') + ..write('id: $id, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('schemaVersion: $schemaVersion, ') + ..write('syncState: $syncState, ') + ..write('localRevision: $localRevision, ') + ..write('originDeviceId: $originDeviceId, ') + ..write('futureOwnerProfileId: $futureOwnerProfileId, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('remoteRevision: $remoteRevision, ') + ..write('kind: $kind, ') + ..write('localUri: $localUri, ') + ..write('mimeType: $mimeType, ') + ..write('sizeBytes: $sizeBytes, ') + ..write('width: $width, ') + ..write('height: $height, ') + ..write('durationMs: $durationMs, ') + ..write('checksum: $checksum, ') + ..write('remoteUri: $remoteUri, ') + ..write('thumbnailLocalUri: $thumbnailLocalUri, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class $ExercisesTable extends Exercises + with TableInfo<$ExercisesTable, Exercise> { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + $ExercisesTable(this.attachedDatabase, [this._alias]); + static const VerificationMeta _idMeta = const VerificationMeta('id'); + @override + late final GeneratedColumn id = GeneratedColumn( + 'id', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _createdAtMeta = const VerificationMeta( + 'createdAt', + ); + @override + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + ); + static const VerificationMeta _updatedAtMeta = const VerificationMeta( + 'updatedAt', + ); + @override + late final GeneratedColumn updatedAt = GeneratedColumn( + 'updated_at', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + ); + static const VerificationMeta _deletedAtMeta = const VerificationMeta( + 'deletedAt', + ); + @override + late final GeneratedColumn deletedAt = GeneratedColumn( + 'deleted_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + static const VerificationMeta _schemaVersionMeta = const VerificationMeta( + 'schemaVersion', + ); + @override + late final GeneratedColumn schemaVersion = GeneratedColumn( + 'schema_version', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultValue: const Constant(1), + ); + static const VerificationMeta _syncStateMeta = const VerificationMeta( + 'syncState', + ); + @override + late final GeneratedColumn syncState = GeneratedColumn( + 'sync_state', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: + 'NOT NULL CHECK (sync_state IN (\'localOnly\', \'dirty\', \'synced\', \'deleted\'))', + ); + static const VerificationMeta _localRevisionMeta = const VerificationMeta( + 'localRevision', + ); + @override + late final GeneratedColumn localRevision = GeneratedColumn( + 'local_revision', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL CHECK (local_revision >= 0)', + ); + static const VerificationMeta _originDeviceIdMeta = const VerificationMeta( + 'originDeviceId', + ); + @override + late final GeneratedColumn originDeviceId = GeneratedColumn( + 'origin_device_id', + aliasedName, + false, + additionalChecks: GeneratedColumn.checkTextLength(minTextLength: 1), + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _futureOwnerProfileIdMeta = + const VerificationMeta('futureOwnerProfileId'); + @override + late final GeneratedColumn futureOwnerProfileId = + GeneratedColumn( + 'future_owner_profile_id', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _lastSyncedAtMeta = const VerificationMeta( + 'lastSyncedAt', + ); + @override + late final GeneratedColumn lastSyncedAt = GeneratedColumn( + 'last_synced_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + static const VerificationMeta _remoteRevisionMeta = const VerificationMeta( + 'remoteRevision', + ); + @override + late final GeneratedColumn remoteRevision = GeneratedColumn( + 'remote_revision', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _nameMeta = const VerificationMeta('name'); + @override + late final GeneratedColumn name = GeneratedColumn( + 'name', + aliasedName, + false, + additionalChecks: GeneratedColumn.checkTextLength(minTextLength: 1), + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _descriptionMeta = const VerificationMeta( + 'description', + ); + @override + late final GeneratedColumn description = GeneratedColumn( + 'description', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _imageMediaIdMeta = const VerificationMeta( + 'imageMediaId', + ); + @override + late final GeneratedColumn imageMediaId = GeneratedColumn( + 'image_media_id', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'REFERENCES media_assets (id)', + ), + ); + static const VerificationMeta _videoMediaIdMeta = const VerificationMeta( + 'videoMediaId', + ); + @override + late final GeneratedColumn videoMediaId = GeneratedColumn( + 'video_media_id', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'REFERENCES media_assets (id)', + ), + ); + static const VerificationMeta _hasTimeMeasureMeta = const VerificationMeta( + 'hasTimeMeasure', + ); + @override + late final GeneratedColumn hasTimeMeasure = GeneratedColumn( + 'has_time_measure', + aliasedName, + false, + type: DriftSqlType.bool, + requiredDuringInsert: true, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("has_time_measure" IN (0, 1))', + ), + ); + static const VerificationMeta _hasRepsMeasureMeta = const VerificationMeta( + 'hasRepsMeasure', + ); + @override + late final GeneratedColumn hasRepsMeasure = GeneratedColumn( + 'has_reps_measure', + aliasedName, + false, + type: DriftSqlType.bool, + requiredDuringInsert: true, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("has_reps_measure" IN (0, 1))', + ), + ); + static const VerificationMeta _hasScoreMeasureMeta = const VerificationMeta( + 'hasScoreMeasure', + ); + @override + late final GeneratedColumn hasScoreMeasure = GeneratedColumn( + 'has_score_measure', + aliasedName, + false, + type: DriftSqlType.bool, + requiredDuringInsert: true, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("has_score_measure" IN (0, 1))', + ), + ); + static const VerificationMeta _scoreLabelMeta = const VerificationMeta( + 'scoreLabel', + ); + @override + late final GeneratedColumn scoreLabel = GeneratedColumn( + 'score_label', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _scoreUnitMeta = const VerificationMeta( + 'scoreUnit', + ); + @override + late final GeneratedColumn scoreUnit = GeneratedColumn( + 'score_unit', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _archivedAtMeta = const VerificationMeta( + 'archivedAt', + ); + @override + late final GeneratedColumn archivedAt = GeneratedColumn( + 'archived_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + @override + List get $columns => [ + id, + createdAt, + updatedAt, + deletedAt, + schemaVersion, + syncState, + localRevision, + originDeviceId, + futureOwnerProfileId, + lastSyncedAt, + remoteRevision, + name, + description, + imageMediaId, + videoMediaId, + hasTimeMeasure, + hasRepsMeasure, + hasScoreMeasure, + scoreLabel, + scoreUnit, + archivedAt, + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'exercises'; + @override + VerificationContext validateIntegrity( + Insertable instance, { + bool isInserting = false, + }) { + final context = VerificationContext(); + final data = instance.toColumns(true); + if (data.containsKey('id')) { + context.handle(_idMeta, id.isAcceptableOrUnknown(data['id']!, _idMeta)); + } else if (isInserting) { + context.missing(_idMeta); + } + if (data.containsKey('created_at')) { + context.handle( + _createdAtMeta, + createdAt.isAcceptableOrUnknown(data['created_at']!, _createdAtMeta), + ); + } else if (isInserting) { + context.missing(_createdAtMeta); + } + if (data.containsKey('updated_at')) { + context.handle( + _updatedAtMeta, + updatedAt.isAcceptableOrUnknown(data['updated_at']!, _updatedAtMeta), + ); + } else if (isInserting) { + context.missing(_updatedAtMeta); + } + if (data.containsKey('deleted_at')) { + context.handle( + _deletedAtMeta, + deletedAt.isAcceptableOrUnknown(data['deleted_at']!, _deletedAtMeta), + ); + } + if (data.containsKey('schema_version')) { + context.handle( + _schemaVersionMeta, + schemaVersion.isAcceptableOrUnknown( + data['schema_version']!, + _schemaVersionMeta, + ), + ); + } + if (data.containsKey('sync_state')) { + context.handle( + _syncStateMeta, + syncState.isAcceptableOrUnknown(data['sync_state']!, _syncStateMeta), + ); + } else if (isInserting) { + context.missing(_syncStateMeta); + } + if (data.containsKey('local_revision')) { + context.handle( + _localRevisionMeta, + localRevision.isAcceptableOrUnknown( + data['local_revision']!, + _localRevisionMeta, + ), + ); + } else if (isInserting) { + context.missing(_localRevisionMeta); + } + if (data.containsKey('origin_device_id')) { + context.handle( + _originDeviceIdMeta, + originDeviceId.isAcceptableOrUnknown( + data['origin_device_id']!, + _originDeviceIdMeta, + ), + ); + } else if (isInserting) { + context.missing(_originDeviceIdMeta); + } + if (data.containsKey('future_owner_profile_id')) { + context.handle( + _futureOwnerProfileIdMeta, + futureOwnerProfileId.isAcceptableOrUnknown( + data['future_owner_profile_id']!, + _futureOwnerProfileIdMeta, + ), + ); + } + if (data.containsKey('last_synced_at')) { + context.handle( + _lastSyncedAtMeta, + lastSyncedAt.isAcceptableOrUnknown( + data['last_synced_at']!, + _lastSyncedAtMeta, + ), + ); + } + if (data.containsKey('remote_revision')) { + context.handle( + _remoteRevisionMeta, + remoteRevision.isAcceptableOrUnknown( + data['remote_revision']!, + _remoteRevisionMeta, + ), + ); + } + if (data.containsKey('name')) { + context.handle( + _nameMeta, + name.isAcceptableOrUnknown(data['name']!, _nameMeta), + ); + } else if (isInserting) { + context.missing(_nameMeta); + } + if (data.containsKey('description')) { + context.handle( + _descriptionMeta, + description.isAcceptableOrUnknown( + data['description']!, + _descriptionMeta, + ), + ); + } + if (data.containsKey('image_media_id')) { + context.handle( + _imageMediaIdMeta, + imageMediaId.isAcceptableOrUnknown( + data['image_media_id']!, + _imageMediaIdMeta, + ), + ); + } + if (data.containsKey('video_media_id')) { + context.handle( + _videoMediaIdMeta, + videoMediaId.isAcceptableOrUnknown( + data['video_media_id']!, + _videoMediaIdMeta, + ), + ); + } + if (data.containsKey('has_time_measure')) { + context.handle( + _hasTimeMeasureMeta, + hasTimeMeasure.isAcceptableOrUnknown( + data['has_time_measure']!, + _hasTimeMeasureMeta, + ), + ); + } else if (isInserting) { + context.missing(_hasTimeMeasureMeta); + } + if (data.containsKey('has_reps_measure')) { + context.handle( + _hasRepsMeasureMeta, + hasRepsMeasure.isAcceptableOrUnknown( + data['has_reps_measure']!, + _hasRepsMeasureMeta, + ), + ); + } else if (isInserting) { + context.missing(_hasRepsMeasureMeta); + } + if (data.containsKey('has_score_measure')) { + context.handle( + _hasScoreMeasureMeta, + hasScoreMeasure.isAcceptableOrUnknown( + data['has_score_measure']!, + _hasScoreMeasureMeta, + ), + ); + } else if (isInserting) { + context.missing(_hasScoreMeasureMeta); + } + if (data.containsKey('score_label')) { + context.handle( + _scoreLabelMeta, + scoreLabel.isAcceptableOrUnknown(data['score_label']!, _scoreLabelMeta), + ); + } + if (data.containsKey('score_unit')) { + context.handle( + _scoreUnitMeta, + scoreUnit.isAcceptableOrUnknown(data['score_unit']!, _scoreUnitMeta), + ); + } + if (data.containsKey('archived_at')) { + context.handle( + _archivedAtMeta, + archivedAt.isAcceptableOrUnknown(data['archived_at']!, _archivedAtMeta), + ); + } + return context; + } + + @override + Set get $primaryKey => {id}; + @override + Exercise map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return Exercise( + id: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}id'], + )!, + createdAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}created_at'], + )!, + updatedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}updated_at'], + )!, + deletedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}deleted_at'], + ), + schemaVersion: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}schema_version'], + )!, + syncState: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}sync_state'], + )!, + localRevision: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}local_revision'], + )!, + originDeviceId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}origin_device_id'], + )!, + futureOwnerProfileId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}future_owner_profile_id'], + ), + lastSyncedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}last_synced_at'], + ), + remoteRevision: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}remote_revision'], + ), + name: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}name'], + )!, + description: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}description'], + ), + imageMediaId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}image_media_id'], + ), + videoMediaId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}video_media_id'], + ), + hasTimeMeasure: attachedDatabase.typeMapping.read( + DriftSqlType.bool, + data['${effectivePrefix}has_time_measure'], + )!, + hasRepsMeasure: attachedDatabase.typeMapping.read( + DriftSqlType.bool, + data['${effectivePrefix}has_reps_measure'], + )!, + hasScoreMeasure: attachedDatabase.typeMapping.read( + DriftSqlType.bool, + data['${effectivePrefix}has_score_measure'], + )!, + scoreLabel: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}score_label'], + ), + scoreUnit: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}score_unit'], + ), + archivedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}archived_at'], + ), + ); + } + + @override + $ExercisesTable createAlias(String alias) { + return $ExercisesTable(attachedDatabase, alias); + } +} + +class Exercise extends DataClass implements Insertable { + final String id; + final DateTime createdAt; + final DateTime updatedAt; + final DateTime? deletedAt; + final int schemaVersion; + final String syncState; + final int localRevision; + final String originDeviceId; + final String? futureOwnerProfileId; + final DateTime? lastSyncedAt; + final String? remoteRevision; + final String name; + final String? description; + final String? imageMediaId; + final String? videoMediaId; + final bool hasTimeMeasure; + final bool hasRepsMeasure; + final bool hasScoreMeasure; + final String? scoreLabel; + final String? scoreUnit; + final DateTime? archivedAt; + const Exercise({ + required this.id, + required this.createdAt, + required this.updatedAt, + this.deletedAt, + required this.schemaVersion, + required this.syncState, + required this.localRevision, + required this.originDeviceId, + this.futureOwnerProfileId, + this.lastSyncedAt, + this.remoteRevision, + required this.name, + this.description, + this.imageMediaId, + this.videoMediaId, + required this.hasTimeMeasure, + required this.hasRepsMeasure, + required this.hasScoreMeasure, + this.scoreLabel, + this.scoreUnit, + this.archivedAt, + }); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['created_at'] = Variable(createdAt); + map['updated_at'] = Variable(updatedAt); + if (!nullToAbsent || deletedAt != null) { + map['deleted_at'] = Variable(deletedAt); + } + map['schema_version'] = Variable(schemaVersion); + map['sync_state'] = Variable(syncState); + map['local_revision'] = Variable(localRevision); + map['origin_device_id'] = Variable(originDeviceId); + if (!nullToAbsent || futureOwnerProfileId != null) { + map['future_owner_profile_id'] = Variable(futureOwnerProfileId); + } + if (!nullToAbsent || lastSyncedAt != null) { + map['last_synced_at'] = Variable(lastSyncedAt); + } + if (!nullToAbsent || remoteRevision != null) { + map['remote_revision'] = Variable(remoteRevision); + } + map['name'] = Variable(name); + if (!nullToAbsent || description != null) { + map['description'] = Variable(description); + } + if (!nullToAbsent || imageMediaId != null) { + map['image_media_id'] = Variable(imageMediaId); + } + if (!nullToAbsent || videoMediaId != null) { + map['video_media_id'] = Variable(videoMediaId); + } + map['has_time_measure'] = Variable(hasTimeMeasure); + map['has_reps_measure'] = Variable(hasRepsMeasure); + map['has_score_measure'] = Variable(hasScoreMeasure); + if (!nullToAbsent || scoreLabel != null) { + map['score_label'] = Variable(scoreLabel); + } + if (!nullToAbsent || scoreUnit != null) { + map['score_unit'] = Variable(scoreUnit); + } + if (!nullToAbsent || archivedAt != null) { + map['archived_at'] = Variable(archivedAt); + } + return map; + } + + ExercisesCompanion toCompanion(bool nullToAbsent) { + return ExercisesCompanion( + id: Value(id), + createdAt: Value(createdAt), + updatedAt: Value(updatedAt), + deletedAt: deletedAt == null && nullToAbsent + ? const Value.absent() + : Value(deletedAt), + schemaVersion: Value(schemaVersion), + syncState: Value(syncState), + localRevision: Value(localRevision), + originDeviceId: Value(originDeviceId), + futureOwnerProfileId: futureOwnerProfileId == null && nullToAbsent + ? const Value.absent() + : Value(futureOwnerProfileId), + lastSyncedAt: lastSyncedAt == null && nullToAbsent + ? const Value.absent() + : Value(lastSyncedAt), + remoteRevision: remoteRevision == null && nullToAbsent + ? const Value.absent() + : Value(remoteRevision), + name: Value(name), + description: description == null && nullToAbsent + ? const Value.absent() + : Value(description), + imageMediaId: imageMediaId == null && nullToAbsent + ? const Value.absent() + : Value(imageMediaId), + videoMediaId: videoMediaId == null && nullToAbsent + ? const Value.absent() + : Value(videoMediaId), + hasTimeMeasure: Value(hasTimeMeasure), + hasRepsMeasure: Value(hasRepsMeasure), + hasScoreMeasure: Value(hasScoreMeasure), + scoreLabel: scoreLabel == null && nullToAbsent + ? const Value.absent() + : Value(scoreLabel), + scoreUnit: scoreUnit == null && nullToAbsent + ? const Value.absent() + : Value(scoreUnit), + archivedAt: archivedAt == null && nullToAbsent + ? const Value.absent() + : Value(archivedAt), + ); + } + + factory Exercise.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return Exercise( + id: serializer.fromJson(json['id']), + createdAt: serializer.fromJson(json['createdAt']), + updatedAt: serializer.fromJson(json['updatedAt']), + deletedAt: serializer.fromJson(json['deletedAt']), + schemaVersion: serializer.fromJson(json['schemaVersion']), + syncState: serializer.fromJson(json['syncState']), + localRevision: serializer.fromJson(json['localRevision']), + originDeviceId: serializer.fromJson(json['originDeviceId']), + futureOwnerProfileId: serializer.fromJson( + json['futureOwnerProfileId'], + ), + lastSyncedAt: serializer.fromJson(json['lastSyncedAt']), + remoteRevision: serializer.fromJson(json['remoteRevision']), + name: serializer.fromJson(json['name']), + description: serializer.fromJson(json['description']), + imageMediaId: serializer.fromJson(json['imageMediaId']), + videoMediaId: serializer.fromJson(json['videoMediaId']), + hasTimeMeasure: serializer.fromJson(json['hasTimeMeasure']), + hasRepsMeasure: serializer.fromJson(json['hasRepsMeasure']), + hasScoreMeasure: serializer.fromJson(json['hasScoreMeasure']), + scoreLabel: serializer.fromJson(json['scoreLabel']), + scoreUnit: serializer.fromJson(json['scoreUnit']), + archivedAt: serializer.fromJson(json['archivedAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'createdAt': serializer.toJson(createdAt), + 'updatedAt': serializer.toJson(updatedAt), + 'deletedAt': serializer.toJson(deletedAt), + 'schemaVersion': serializer.toJson(schemaVersion), + 'syncState': serializer.toJson(syncState), + 'localRevision': serializer.toJson(localRevision), + 'originDeviceId': serializer.toJson(originDeviceId), + 'futureOwnerProfileId': serializer.toJson(futureOwnerProfileId), + 'lastSyncedAt': serializer.toJson(lastSyncedAt), + 'remoteRevision': serializer.toJson(remoteRevision), + 'name': serializer.toJson(name), + 'description': serializer.toJson(description), + 'imageMediaId': serializer.toJson(imageMediaId), + 'videoMediaId': serializer.toJson(videoMediaId), + 'hasTimeMeasure': serializer.toJson(hasTimeMeasure), + 'hasRepsMeasure': serializer.toJson(hasRepsMeasure), + 'hasScoreMeasure': serializer.toJson(hasScoreMeasure), + 'scoreLabel': serializer.toJson(scoreLabel), + 'scoreUnit': serializer.toJson(scoreUnit), + 'archivedAt': serializer.toJson(archivedAt), + }; + } + + Exercise copyWith({ + String? id, + DateTime? createdAt, + DateTime? updatedAt, + Value deletedAt = const Value.absent(), + int? schemaVersion, + String? syncState, + int? localRevision, + String? originDeviceId, + Value futureOwnerProfileId = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + Value remoteRevision = const Value.absent(), + String? name, + Value description = const Value.absent(), + Value imageMediaId = const Value.absent(), + Value videoMediaId = const Value.absent(), + bool? hasTimeMeasure, + bool? hasRepsMeasure, + bool? hasScoreMeasure, + Value scoreLabel = const Value.absent(), + Value scoreUnit = const Value.absent(), + Value archivedAt = const Value.absent(), + }) => Exercise( + id: id ?? this.id, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt.present ? deletedAt.value : this.deletedAt, + schemaVersion: schemaVersion ?? this.schemaVersion, + syncState: syncState ?? this.syncState, + localRevision: localRevision ?? this.localRevision, + originDeviceId: originDeviceId ?? this.originDeviceId, + futureOwnerProfileId: futureOwnerProfileId.present + ? futureOwnerProfileId.value + : this.futureOwnerProfileId, + lastSyncedAt: lastSyncedAt.present ? lastSyncedAt.value : this.lastSyncedAt, + remoteRevision: remoteRevision.present + ? remoteRevision.value + : this.remoteRevision, + name: name ?? this.name, + description: description.present ? description.value : this.description, + imageMediaId: imageMediaId.present ? imageMediaId.value : this.imageMediaId, + videoMediaId: videoMediaId.present ? videoMediaId.value : this.videoMediaId, + hasTimeMeasure: hasTimeMeasure ?? this.hasTimeMeasure, + hasRepsMeasure: hasRepsMeasure ?? this.hasRepsMeasure, + hasScoreMeasure: hasScoreMeasure ?? this.hasScoreMeasure, + scoreLabel: scoreLabel.present ? scoreLabel.value : this.scoreLabel, + scoreUnit: scoreUnit.present ? scoreUnit.value : this.scoreUnit, + archivedAt: archivedAt.present ? archivedAt.value : this.archivedAt, + ); + Exercise copyWithCompanion(ExercisesCompanion data) { + return Exercise( + id: data.id.present ? data.id.value : this.id, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + updatedAt: data.updatedAt.present ? data.updatedAt.value : this.updatedAt, + deletedAt: data.deletedAt.present ? data.deletedAt.value : this.deletedAt, + schemaVersion: data.schemaVersion.present + ? data.schemaVersion.value + : this.schemaVersion, + syncState: data.syncState.present ? data.syncState.value : this.syncState, + localRevision: data.localRevision.present + ? data.localRevision.value + : this.localRevision, + originDeviceId: data.originDeviceId.present + ? data.originDeviceId.value + : this.originDeviceId, + futureOwnerProfileId: data.futureOwnerProfileId.present + ? data.futureOwnerProfileId.value + : this.futureOwnerProfileId, + lastSyncedAt: data.lastSyncedAt.present + ? data.lastSyncedAt.value + : this.lastSyncedAt, + remoteRevision: data.remoteRevision.present + ? data.remoteRevision.value + : this.remoteRevision, + name: data.name.present ? data.name.value : this.name, + description: data.description.present + ? data.description.value + : this.description, + imageMediaId: data.imageMediaId.present + ? data.imageMediaId.value + : this.imageMediaId, + videoMediaId: data.videoMediaId.present + ? data.videoMediaId.value + : this.videoMediaId, + hasTimeMeasure: data.hasTimeMeasure.present + ? data.hasTimeMeasure.value + : this.hasTimeMeasure, + hasRepsMeasure: data.hasRepsMeasure.present + ? data.hasRepsMeasure.value + : this.hasRepsMeasure, + hasScoreMeasure: data.hasScoreMeasure.present + ? data.hasScoreMeasure.value + : this.hasScoreMeasure, + scoreLabel: data.scoreLabel.present + ? data.scoreLabel.value + : this.scoreLabel, + scoreUnit: data.scoreUnit.present ? data.scoreUnit.value : this.scoreUnit, + archivedAt: data.archivedAt.present + ? data.archivedAt.value + : this.archivedAt, + ); + } + + @override + String toString() { + return (StringBuffer('Exercise(') + ..write('id: $id, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('schemaVersion: $schemaVersion, ') + ..write('syncState: $syncState, ') + ..write('localRevision: $localRevision, ') + ..write('originDeviceId: $originDeviceId, ') + ..write('futureOwnerProfileId: $futureOwnerProfileId, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('remoteRevision: $remoteRevision, ') + ..write('name: $name, ') + ..write('description: $description, ') + ..write('imageMediaId: $imageMediaId, ') + ..write('videoMediaId: $videoMediaId, ') + ..write('hasTimeMeasure: $hasTimeMeasure, ') + ..write('hasRepsMeasure: $hasRepsMeasure, ') + ..write('hasScoreMeasure: $hasScoreMeasure, ') + ..write('scoreLabel: $scoreLabel, ') + ..write('scoreUnit: $scoreUnit, ') + ..write('archivedAt: $archivedAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hashAll([ + id, + createdAt, + updatedAt, + deletedAt, + schemaVersion, + syncState, + localRevision, + originDeviceId, + futureOwnerProfileId, + lastSyncedAt, + remoteRevision, + name, + description, + imageMediaId, + videoMediaId, + hasTimeMeasure, + hasRepsMeasure, + hasScoreMeasure, + scoreLabel, + scoreUnit, + archivedAt, + ]); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is Exercise && + other.id == this.id && + other.createdAt == this.createdAt && + other.updatedAt == this.updatedAt && + other.deletedAt == this.deletedAt && + other.schemaVersion == this.schemaVersion && + other.syncState == this.syncState && + other.localRevision == this.localRevision && + other.originDeviceId == this.originDeviceId && + other.futureOwnerProfileId == this.futureOwnerProfileId && + other.lastSyncedAt == this.lastSyncedAt && + other.remoteRevision == this.remoteRevision && + other.name == this.name && + other.description == this.description && + other.imageMediaId == this.imageMediaId && + other.videoMediaId == this.videoMediaId && + other.hasTimeMeasure == this.hasTimeMeasure && + other.hasRepsMeasure == this.hasRepsMeasure && + other.hasScoreMeasure == this.hasScoreMeasure && + other.scoreLabel == this.scoreLabel && + other.scoreUnit == this.scoreUnit && + other.archivedAt == this.archivedAt); +} + +class ExercisesCompanion extends UpdateCompanion { + final Value id; + final Value createdAt; + final Value updatedAt; + final Value deletedAt; + final Value schemaVersion; + final Value syncState; + final Value localRevision; + final Value originDeviceId; + final Value futureOwnerProfileId; + final Value lastSyncedAt; + final Value remoteRevision; + final Value name; + final Value description; + final Value imageMediaId; + final Value videoMediaId; + final Value hasTimeMeasure; + final Value hasRepsMeasure; + final Value hasScoreMeasure; + final Value scoreLabel; + final Value scoreUnit; + final Value archivedAt; + final Value rowid; + const ExercisesCompanion({ + this.id = const Value.absent(), + this.createdAt = const Value.absent(), + this.updatedAt = const Value.absent(), + this.deletedAt = const Value.absent(), + this.schemaVersion = const Value.absent(), + this.syncState = const Value.absent(), + this.localRevision = const Value.absent(), + this.originDeviceId = const Value.absent(), + this.futureOwnerProfileId = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + this.remoteRevision = const Value.absent(), + this.name = const Value.absent(), + this.description = const Value.absent(), + this.imageMediaId = const Value.absent(), + this.videoMediaId = const Value.absent(), + this.hasTimeMeasure = const Value.absent(), + this.hasRepsMeasure = const Value.absent(), + this.hasScoreMeasure = const Value.absent(), + this.scoreLabel = const Value.absent(), + this.scoreUnit = const Value.absent(), + this.archivedAt = const Value.absent(), + this.rowid = const Value.absent(), + }); + ExercisesCompanion.insert({ + required String id, + required DateTime createdAt, + required DateTime updatedAt, + this.deletedAt = const Value.absent(), + this.schemaVersion = const Value.absent(), + required String syncState, + required int localRevision, + required String originDeviceId, + this.futureOwnerProfileId = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + this.remoteRevision = const Value.absent(), + required String name, + this.description = const Value.absent(), + this.imageMediaId = const Value.absent(), + this.videoMediaId = const Value.absent(), + required bool hasTimeMeasure, + required bool hasRepsMeasure, + required bool hasScoreMeasure, + this.scoreLabel = const Value.absent(), + this.scoreUnit = const Value.absent(), + this.archivedAt = const Value.absent(), + this.rowid = const Value.absent(), + }) : id = Value(id), + createdAt = Value(createdAt), + updatedAt = Value(updatedAt), + syncState = Value(syncState), + localRevision = Value(localRevision), + originDeviceId = Value(originDeviceId), + name = Value(name), + hasTimeMeasure = Value(hasTimeMeasure), + hasRepsMeasure = Value(hasRepsMeasure), + hasScoreMeasure = Value(hasScoreMeasure); + static Insertable custom({ + Expression? id, + Expression? createdAt, + Expression? updatedAt, + Expression? deletedAt, + Expression? schemaVersion, + Expression? syncState, + Expression? localRevision, + Expression? originDeviceId, + Expression? futureOwnerProfileId, + Expression? lastSyncedAt, + Expression? remoteRevision, + Expression? name, + Expression? description, + Expression? imageMediaId, + Expression? videoMediaId, + Expression? hasTimeMeasure, + Expression? hasRepsMeasure, + Expression? hasScoreMeasure, + Expression? scoreLabel, + Expression? scoreUnit, + Expression? archivedAt, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (createdAt != null) 'created_at': createdAt, + if (updatedAt != null) 'updated_at': updatedAt, + if (deletedAt != null) 'deleted_at': deletedAt, + if (schemaVersion != null) 'schema_version': schemaVersion, + if (syncState != null) 'sync_state': syncState, + if (localRevision != null) 'local_revision': localRevision, + if (originDeviceId != null) 'origin_device_id': originDeviceId, + if (futureOwnerProfileId != null) + 'future_owner_profile_id': futureOwnerProfileId, + if (lastSyncedAt != null) 'last_synced_at': lastSyncedAt, + if (remoteRevision != null) 'remote_revision': remoteRevision, + if (name != null) 'name': name, + if (description != null) 'description': description, + if (imageMediaId != null) 'image_media_id': imageMediaId, + if (videoMediaId != null) 'video_media_id': videoMediaId, + if (hasTimeMeasure != null) 'has_time_measure': hasTimeMeasure, + if (hasRepsMeasure != null) 'has_reps_measure': hasRepsMeasure, + if (hasScoreMeasure != null) 'has_score_measure': hasScoreMeasure, + if (scoreLabel != null) 'score_label': scoreLabel, + if (scoreUnit != null) 'score_unit': scoreUnit, + if (archivedAt != null) 'archived_at': archivedAt, + if (rowid != null) 'rowid': rowid, + }); + } + + ExercisesCompanion copyWith({ + Value? id, + Value? createdAt, + Value? updatedAt, + Value? deletedAt, + Value? schemaVersion, + Value? syncState, + Value? localRevision, + Value? originDeviceId, + Value? futureOwnerProfileId, + Value? lastSyncedAt, + Value? remoteRevision, + Value? name, + Value? description, + Value? imageMediaId, + Value? videoMediaId, + Value? hasTimeMeasure, + Value? hasRepsMeasure, + Value? hasScoreMeasure, + Value? scoreLabel, + Value? scoreUnit, + Value? archivedAt, + Value? rowid, + }) { + return ExercisesCompanion( + id: id ?? this.id, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt ?? this.deletedAt, + schemaVersion: schemaVersion ?? this.schemaVersion, + syncState: syncState ?? this.syncState, + localRevision: localRevision ?? this.localRevision, + originDeviceId: originDeviceId ?? this.originDeviceId, + futureOwnerProfileId: futureOwnerProfileId ?? this.futureOwnerProfileId, + lastSyncedAt: lastSyncedAt ?? this.lastSyncedAt, + remoteRevision: remoteRevision ?? this.remoteRevision, + name: name ?? this.name, + description: description ?? this.description, + imageMediaId: imageMediaId ?? this.imageMediaId, + videoMediaId: videoMediaId ?? this.videoMediaId, + hasTimeMeasure: hasTimeMeasure ?? this.hasTimeMeasure, + hasRepsMeasure: hasRepsMeasure ?? this.hasRepsMeasure, + hasScoreMeasure: hasScoreMeasure ?? this.hasScoreMeasure, + scoreLabel: scoreLabel ?? this.scoreLabel, + scoreUnit: scoreUnit ?? this.scoreUnit, + archivedAt: archivedAt ?? this.archivedAt, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + if (updatedAt.present) { + map['updated_at'] = Variable(updatedAt.value); + } + if (deletedAt.present) { + map['deleted_at'] = Variable(deletedAt.value); + } + if (schemaVersion.present) { + map['schema_version'] = Variable(schemaVersion.value); + } + if (syncState.present) { + map['sync_state'] = Variable(syncState.value); + } + if (localRevision.present) { + map['local_revision'] = Variable(localRevision.value); + } + if (originDeviceId.present) { + map['origin_device_id'] = Variable(originDeviceId.value); + } + if (futureOwnerProfileId.present) { + map['future_owner_profile_id'] = Variable( + futureOwnerProfileId.value, + ); + } + if (lastSyncedAt.present) { + map['last_synced_at'] = Variable(lastSyncedAt.value); + } + if (remoteRevision.present) { + map['remote_revision'] = Variable(remoteRevision.value); + } + if (name.present) { + map['name'] = Variable(name.value); + } + if (description.present) { + map['description'] = Variable(description.value); + } + if (imageMediaId.present) { + map['image_media_id'] = Variable(imageMediaId.value); + } + if (videoMediaId.present) { + map['video_media_id'] = Variable(videoMediaId.value); + } + if (hasTimeMeasure.present) { + map['has_time_measure'] = Variable(hasTimeMeasure.value); + } + if (hasRepsMeasure.present) { + map['has_reps_measure'] = Variable(hasRepsMeasure.value); + } + if (hasScoreMeasure.present) { + map['has_score_measure'] = Variable(hasScoreMeasure.value); + } + if (scoreLabel.present) { + map['score_label'] = Variable(scoreLabel.value); + } + if (scoreUnit.present) { + map['score_unit'] = Variable(scoreUnit.value); + } + if (archivedAt.present) { + map['archived_at'] = Variable(archivedAt.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('ExercisesCompanion(') + ..write('id: $id, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('schemaVersion: $schemaVersion, ') + ..write('syncState: $syncState, ') + ..write('localRevision: $localRevision, ') + ..write('originDeviceId: $originDeviceId, ') + ..write('futureOwnerProfileId: $futureOwnerProfileId, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('remoteRevision: $remoteRevision, ') + ..write('name: $name, ') + ..write('description: $description, ') + ..write('imageMediaId: $imageMediaId, ') + ..write('videoMediaId: $videoMediaId, ') + ..write('hasTimeMeasure: $hasTimeMeasure, ') + ..write('hasRepsMeasure: $hasRepsMeasure, ') + ..write('hasScoreMeasure: $hasScoreMeasure, ') + ..write('scoreLabel: $scoreLabel, ') + ..write('scoreUnit: $scoreUnit, ') + ..write('archivedAt: $archivedAt, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class $ProgramsTable extends Programs with TableInfo<$ProgramsTable, Program> { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + $ProgramsTable(this.attachedDatabase, [this._alias]); + static const VerificationMeta _idMeta = const VerificationMeta('id'); + @override + late final GeneratedColumn id = GeneratedColumn( + 'id', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _createdAtMeta = const VerificationMeta( + 'createdAt', + ); + @override + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + ); + static const VerificationMeta _updatedAtMeta = const VerificationMeta( + 'updatedAt', + ); + @override + late final GeneratedColumn updatedAt = GeneratedColumn( + 'updated_at', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + ); + static const VerificationMeta _deletedAtMeta = const VerificationMeta( + 'deletedAt', + ); + @override + late final GeneratedColumn deletedAt = GeneratedColumn( + 'deleted_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + static const VerificationMeta _schemaVersionMeta = const VerificationMeta( + 'schemaVersion', + ); + @override + late final GeneratedColumn schemaVersion = GeneratedColumn( + 'schema_version', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultValue: const Constant(1), + ); + static const VerificationMeta _syncStateMeta = const VerificationMeta( + 'syncState', + ); + @override + late final GeneratedColumn syncState = GeneratedColumn( + 'sync_state', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: + 'NOT NULL CHECK (sync_state IN (\'localOnly\', \'dirty\', \'synced\', \'deleted\'))', + ); + static const VerificationMeta _localRevisionMeta = const VerificationMeta( + 'localRevision', + ); + @override + late final GeneratedColumn localRevision = GeneratedColumn( + 'local_revision', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL CHECK (local_revision >= 0)', + ); + static const VerificationMeta _originDeviceIdMeta = const VerificationMeta( + 'originDeviceId', + ); + @override + late final GeneratedColumn originDeviceId = GeneratedColumn( + 'origin_device_id', + aliasedName, + false, + additionalChecks: GeneratedColumn.checkTextLength(minTextLength: 1), + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _futureOwnerProfileIdMeta = + const VerificationMeta('futureOwnerProfileId'); + @override + late final GeneratedColumn futureOwnerProfileId = + GeneratedColumn( + 'future_owner_profile_id', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _lastSyncedAtMeta = const VerificationMeta( + 'lastSyncedAt', + ); + @override + late final GeneratedColumn lastSyncedAt = GeneratedColumn( + 'last_synced_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + static const VerificationMeta _remoteRevisionMeta = const VerificationMeta( + 'remoteRevision', + ); + @override + late final GeneratedColumn remoteRevision = GeneratedColumn( + 'remote_revision', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _nameMeta = const VerificationMeta('name'); + @override + late final GeneratedColumn name = GeneratedColumn( + 'name', + aliasedName, + false, + additionalChecks: GeneratedColumn.checkTextLength(minTextLength: 1), + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _defaultRestSecondsMeta = + const VerificationMeta('defaultRestSeconds'); + @override + late final GeneratedColumn defaultRestSeconds = GeneratedColumn( + 'default_rest_seconds', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + ); + @override + List get $columns => [ + id, + createdAt, + updatedAt, + deletedAt, + schemaVersion, + syncState, + localRevision, + originDeviceId, + futureOwnerProfileId, + lastSyncedAt, + remoteRevision, + name, + defaultRestSeconds, + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'programs'; + @override + VerificationContext validateIntegrity( + Insertable instance, { + bool isInserting = false, + }) { + final context = VerificationContext(); + final data = instance.toColumns(true); + if (data.containsKey('id')) { + context.handle(_idMeta, id.isAcceptableOrUnknown(data['id']!, _idMeta)); + } else if (isInserting) { + context.missing(_idMeta); + } + if (data.containsKey('created_at')) { + context.handle( + _createdAtMeta, + createdAt.isAcceptableOrUnknown(data['created_at']!, _createdAtMeta), + ); + } else if (isInserting) { + context.missing(_createdAtMeta); + } + if (data.containsKey('updated_at')) { + context.handle( + _updatedAtMeta, + updatedAt.isAcceptableOrUnknown(data['updated_at']!, _updatedAtMeta), + ); + } else if (isInserting) { + context.missing(_updatedAtMeta); + } + if (data.containsKey('deleted_at')) { + context.handle( + _deletedAtMeta, + deletedAt.isAcceptableOrUnknown(data['deleted_at']!, _deletedAtMeta), + ); + } + if (data.containsKey('schema_version')) { + context.handle( + _schemaVersionMeta, + schemaVersion.isAcceptableOrUnknown( + data['schema_version']!, + _schemaVersionMeta, + ), + ); + } + if (data.containsKey('sync_state')) { + context.handle( + _syncStateMeta, + syncState.isAcceptableOrUnknown(data['sync_state']!, _syncStateMeta), + ); + } else if (isInserting) { + context.missing(_syncStateMeta); + } + if (data.containsKey('local_revision')) { + context.handle( + _localRevisionMeta, + localRevision.isAcceptableOrUnknown( + data['local_revision']!, + _localRevisionMeta, + ), + ); + } else if (isInserting) { + context.missing(_localRevisionMeta); + } + if (data.containsKey('origin_device_id')) { + context.handle( + _originDeviceIdMeta, + originDeviceId.isAcceptableOrUnknown( + data['origin_device_id']!, + _originDeviceIdMeta, + ), + ); + } else if (isInserting) { + context.missing(_originDeviceIdMeta); + } + if (data.containsKey('future_owner_profile_id')) { + context.handle( + _futureOwnerProfileIdMeta, + futureOwnerProfileId.isAcceptableOrUnknown( + data['future_owner_profile_id']!, + _futureOwnerProfileIdMeta, + ), + ); + } + if (data.containsKey('last_synced_at')) { + context.handle( + _lastSyncedAtMeta, + lastSyncedAt.isAcceptableOrUnknown( + data['last_synced_at']!, + _lastSyncedAtMeta, + ), + ); + } + if (data.containsKey('remote_revision')) { + context.handle( + _remoteRevisionMeta, + remoteRevision.isAcceptableOrUnknown( + data['remote_revision']!, + _remoteRevisionMeta, + ), + ); + } + if (data.containsKey('name')) { + context.handle( + _nameMeta, + name.isAcceptableOrUnknown(data['name']!, _nameMeta), + ); + } else if (isInserting) { + context.missing(_nameMeta); + } + if (data.containsKey('default_rest_seconds')) { + context.handle( + _defaultRestSecondsMeta, + defaultRestSeconds.isAcceptableOrUnknown( + data['default_rest_seconds']!, + _defaultRestSecondsMeta, + ), + ); + } else if (isInserting) { + context.missing(_defaultRestSecondsMeta); + } + return context; + } + + @override + Set get $primaryKey => {id}; + @override + Program map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return Program( + id: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}id'], + )!, + createdAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}created_at'], + )!, + updatedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}updated_at'], + )!, + deletedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}deleted_at'], + ), + schemaVersion: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}schema_version'], + )!, + syncState: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}sync_state'], + )!, + localRevision: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}local_revision'], + )!, + originDeviceId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}origin_device_id'], + )!, + futureOwnerProfileId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}future_owner_profile_id'], + ), + lastSyncedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}last_synced_at'], + ), + remoteRevision: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}remote_revision'], + ), + name: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}name'], + )!, + defaultRestSeconds: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}default_rest_seconds'], + )!, + ); + } + + @override + $ProgramsTable createAlias(String alias) { + return $ProgramsTable(attachedDatabase, alias); + } +} + +class Program extends DataClass implements Insertable { + final String id; + final DateTime createdAt; + final DateTime updatedAt; + final DateTime? deletedAt; + final int schemaVersion; + final String syncState; + final int localRevision; + final String originDeviceId; + final String? futureOwnerProfileId; + final DateTime? lastSyncedAt; + final String? remoteRevision; + final String name; + final int defaultRestSeconds; + const Program({ + required this.id, + required this.createdAt, + required this.updatedAt, + this.deletedAt, + required this.schemaVersion, + required this.syncState, + required this.localRevision, + required this.originDeviceId, + this.futureOwnerProfileId, + this.lastSyncedAt, + this.remoteRevision, + required this.name, + required this.defaultRestSeconds, + }); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['created_at'] = Variable(createdAt); + map['updated_at'] = Variable(updatedAt); + if (!nullToAbsent || deletedAt != null) { + map['deleted_at'] = Variable(deletedAt); + } + map['schema_version'] = Variable(schemaVersion); + map['sync_state'] = Variable(syncState); + map['local_revision'] = Variable(localRevision); + map['origin_device_id'] = Variable(originDeviceId); + if (!nullToAbsent || futureOwnerProfileId != null) { + map['future_owner_profile_id'] = Variable(futureOwnerProfileId); + } + if (!nullToAbsent || lastSyncedAt != null) { + map['last_synced_at'] = Variable(lastSyncedAt); + } + if (!nullToAbsent || remoteRevision != null) { + map['remote_revision'] = Variable(remoteRevision); + } + map['name'] = Variable(name); + map['default_rest_seconds'] = Variable(defaultRestSeconds); + return map; + } + + ProgramsCompanion toCompanion(bool nullToAbsent) { + return ProgramsCompanion( + id: Value(id), + createdAt: Value(createdAt), + updatedAt: Value(updatedAt), + deletedAt: deletedAt == null && nullToAbsent + ? const Value.absent() + : Value(deletedAt), + schemaVersion: Value(schemaVersion), + syncState: Value(syncState), + localRevision: Value(localRevision), + originDeviceId: Value(originDeviceId), + futureOwnerProfileId: futureOwnerProfileId == null && nullToAbsent + ? const Value.absent() + : Value(futureOwnerProfileId), + lastSyncedAt: lastSyncedAt == null && nullToAbsent + ? const Value.absent() + : Value(lastSyncedAt), + remoteRevision: remoteRevision == null && nullToAbsent + ? const Value.absent() + : Value(remoteRevision), + name: Value(name), + defaultRestSeconds: Value(defaultRestSeconds), + ); + } + + factory Program.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return Program( + id: serializer.fromJson(json['id']), + createdAt: serializer.fromJson(json['createdAt']), + updatedAt: serializer.fromJson(json['updatedAt']), + deletedAt: serializer.fromJson(json['deletedAt']), + schemaVersion: serializer.fromJson(json['schemaVersion']), + syncState: serializer.fromJson(json['syncState']), + localRevision: serializer.fromJson(json['localRevision']), + originDeviceId: serializer.fromJson(json['originDeviceId']), + futureOwnerProfileId: serializer.fromJson( + json['futureOwnerProfileId'], + ), + lastSyncedAt: serializer.fromJson(json['lastSyncedAt']), + remoteRevision: serializer.fromJson(json['remoteRevision']), + name: serializer.fromJson(json['name']), + defaultRestSeconds: serializer.fromJson(json['defaultRestSeconds']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'createdAt': serializer.toJson(createdAt), + 'updatedAt': serializer.toJson(updatedAt), + 'deletedAt': serializer.toJson(deletedAt), + 'schemaVersion': serializer.toJson(schemaVersion), + 'syncState': serializer.toJson(syncState), + 'localRevision': serializer.toJson(localRevision), + 'originDeviceId': serializer.toJson(originDeviceId), + 'futureOwnerProfileId': serializer.toJson(futureOwnerProfileId), + 'lastSyncedAt': serializer.toJson(lastSyncedAt), + 'remoteRevision': serializer.toJson(remoteRevision), + 'name': serializer.toJson(name), + 'defaultRestSeconds': serializer.toJson(defaultRestSeconds), + }; + } + + Program copyWith({ + String? id, + DateTime? createdAt, + DateTime? updatedAt, + Value deletedAt = const Value.absent(), + int? schemaVersion, + String? syncState, + int? localRevision, + String? originDeviceId, + Value futureOwnerProfileId = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + Value remoteRevision = const Value.absent(), + String? name, + int? defaultRestSeconds, + }) => Program( + id: id ?? this.id, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt.present ? deletedAt.value : this.deletedAt, + schemaVersion: schemaVersion ?? this.schemaVersion, + syncState: syncState ?? this.syncState, + localRevision: localRevision ?? this.localRevision, + originDeviceId: originDeviceId ?? this.originDeviceId, + futureOwnerProfileId: futureOwnerProfileId.present + ? futureOwnerProfileId.value + : this.futureOwnerProfileId, + lastSyncedAt: lastSyncedAt.present ? lastSyncedAt.value : this.lastSyncedAt, + remoteRevision: remoteRevision.present + ? remoteRevision.value + : this.remoteRevision, + name: name ?? this.name, + defaultRestSeconds: defaultRestSeconds ?? this.defaultRestSeconds, + ); + Program copyWithCompanion(ProgramsCompanion data) { + return Program( + id: data.id.present ? data.id.value : this.id, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + updatedAt: data.updatedAt.present ? data.updatedAt.value : this.updatedAt, + deletedAt: data.deletedAt.present ? data.deletedAt.value : this.deletedAt, + schemaVersion: data.schemaVersion.present + ? data.schemaVersion.value + : this.schemaVersion, + syncState: data.syncState.present ? data.syncState.value : this.syncState, + localRevision: data.localRevision.present + ? data.localRevision.value + : this.localRevision, + originDeviceId: data.originDeviceId.present + ? data.originDeviceId.value + : this.originDeviceId, + futureOwnerProfileId: data.futureOwnerProfileId.present + ? data.futureOwnerProfileId.value + : this.futureOwnerProfileId, + lastSyncedAt: data.lastSyncedAt.present + ? data.lastSyncedAt.value + : this.lastSyncedAt, + remoteRevision: data.remoteRevision.present + ? data.remoteRevision.value + : this.remoteRevision, + name: data.name.present ? data.name.value : this.name, + defaultRestSeconds: data.defaultRestSeconds.present + ? data.defaultRestSeconds.value + : this.defaultRestSeconds, + ); + } + + @override + String toString() { + return (StringBuffer('Program(') + ..write('id: $id, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('schemaVersion: $schemaVersion, ') + ..write('syncState: $syncState, ') + ..write('localRevision: $localRevision, ') + ..write('originDeviceId: $originDeviceId, ') + ..write('futureOwnerProfileId: $futureOwnerProfileId, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('remoteRevision: $remoteRevision, ') + ..write('name: $name, ') + ..write('defaultRestSeconds: $defaultRestSeconds') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash( + id, + createdAt, + updatedAt, + deletedAt, + schemaVersion, + syncState, + localRevision, + originDeviceId, + futureOwnerProfileId, + lastSyncedAt, + remoteRevision, + name, + defaultRestSeconds, + ); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is Program && + other.id == this.id && + other.createdAt == this.createdAt && + other.updatedAt == this.updatedAt && + other.deletedAt == this.deletedAt && + other.schemaVersion == this.schemaVersion && + other.syncState == this.syncState && + other.localRevision == this.localRevision && + other.originDeviceId == this.originDeviceId && + other.futureOwnerProfileId == this.futureOwnerProfileId && + other.lastSyncedAt == this.lastSyncedAt && + other.remoteRevision == this.remoteRevision && + other.name == this.name && + other.defaultRestSeconds == this.defaultRestSeconds); +} + +class ProgramsCompanion extends UpdateCompanion { + final Value id; + final Value createdAt; + final Value updatedAt; + final Value deletedAt; + final Value schemaVersion; + final Value syncState; + final Value localRevision; + final Value originDeviceId; + final Value futureOwnerProfileId; + final Value lastSyncedAt; + final Value remoteRevision; + final Value name; + final Value defaultRestSeconds; + final Value rowid; + const ProgramsCompanion({ + this.id = const Value.absent(), + this.createdAt = const Value.absent(), + this.updatedAt = const Value.absent(), + this.deletedAt = const Value.absent(), + this.schemaVersion = const Value.absent(), + this.syncState = const Value.absent(), + this.localRevision = const Value.absent(), + this.originDeviceId = const Value.absent(), + this.futureOwnerProfileId = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + this.remoteRevision = const Value.absent(), + this.name = const Value.absent(), + this.defaultRestSeconds = const Value.absent(), + this.rowid = const Value.absent(), + }); + ProgramsCompanion.insert({ + required String id, + required DateTime createdAt, + required DateTime updatedAt, + this.deletedAt = const Value.absent(), + this.schemaVersion = const Value.absent(), + required String syncState, + required int localRevision, + required String originDeviceId, + this.futureOwnerProfileId = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + this.remoteRevision = const Value.absent(), + required String name, + required int defaultRestSeconds, + this.rowid = const Value.absent(), + }) : id = Value(id), + createdAt = Value(createdAt), + updatedAt = Value(updatedAt), + syncState = Value(syncState), + localRevision = Value(localRevision), + originDeviceId = Value(originDeviceId), + name = Value(name), + defaultRestSeconds = Value(defaultRestSeconds); + static Insertable custom({ + Expression? id, + Expression? createdAt, + Expression? updatedAt, + Expression? deletedAt, + Expression? schemaVersion, + Expression? syncState, + Expression? localRevision, + Expression? originDeviceId, + Expression? futureOwnerProfileId, + Expression? lastSyncedAt, + Expression? remoteRevision, + Expression? name, + Expression? defaultRestSeconds, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (createdAt != null) 'created_at': createdAt, + if (updatedAt != null) 'updated_at': updatedAt, + if (deletedAt != null) 'deleted_at': deletedAt, + if (schemaVersion != null) 'schema_version': schemaVersion, + if (syncState != null) 'sync_state': syncState, + if (localRevision != null) 'local_revision': localRevision, + if (originDeviceId != null) 'origin_device_id': originDeviceId, + if (futureOwnerProfileId != null) + 'future_owner_profile_id': futureOwnerProfileId, + if (lastSyncedAt != null) 'last_synced_at': lastSyncedAt, + if (remoteRevision != null) 'remote_revision': remoteRevision, + if (name != null) 'name': name, + if (defaultRestSeconds != null) + 'default_rest_seconds': defaultRestSeconds, + if (rowid != null) 'rowid': rowid, + }); + } + + ProgramsCompanion copyWith({ + Value? id, + Value? createdAt, + Value? updatedAt, + Value? deletedAt, + Value? schemaVersion, + Value? syncState, + Value? localRevision, + Value? originDeviceId, + Value? futureOwnerProfileId, + Value? lastSyncedAt, + Value? remoteRevision, + Value? name, + Value? defaultRestSeconds, + Value? rowid, + }) { + return ProgramsCompanion( + id: id ?? this.id, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt ?? this.deletedAt, + schemaVersion: schemaVersion ?? this.schemaVersion, + syncState: syncState ?? this.syncState, + localRevision: localRevision ?? this.localRevision, + originDeviceId: originDeviceId ?? this.originDeviceId, + futureOwnerProfileId: futureOwnerProfileId ?? this.futureOwnerProfileId, + lastSyncedAt: lastSyncedAt ?? this.lastSyncedAt, + remoteRevision: remoteRevision ?? this.remoteRevision, + name: name ?? this.name, + defaultRestSeconds: defaultRestSeconds ?? this.defaultRestSeconds, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + if (updatedAt.present) { + map['updated_at'] = Variable(updatedAt.value); + } + if (deletedAt.present) { + map['deleted_at'] = Variable(deletedAt.value); + } + if (schemaVersion.present) { + map['schema_version'] = Variable(schemaVersion.value); + } + if (syncState.present) { + map['sync_state'] = Variable(syncState.value); + } + if (localRevision.present) { + map['local_revision'] = Variable(localRevision.value); + } + if (originDeviceId.present) { + map['origin_device_id'] = Variable(originDeviceId.value); + } + if (futureOwnerProfileId.present) { + map['future_owner_profile_id'] = Variable( + futureOwnerProfileId.value, + ); + } + if (lastSyncedAt.present) { + map['last_synced_at'] = Variable(lastSyncedAt.value); + } + if (remoteRevision.present) { + map['remote_revision'] = Variable(remoteRevision.value); + } + if (name.present) { + map['name'] = Variable(name.value); + } + if (defaultRestSeconds.present) { + map['default_rest_seconds'] = Variable(defaultRestSeconds.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('ProgramsCompanion(') + ..write('id: $id, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('schemaVersion: $schemaVersion, ') + ..write('syncState: $syncState, ') + ..write('localRevision: $localRevision, ') + ..write('originDeviceId: $originDeviceId, ') + ..write('futureOwnerProfileId: $futureOwnerProfileId, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('remoteRevision: $remoteRevision, ') + ..write('name: $name, ') + ..write('defaultRestSeconds: $defaultRestSeconds, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class $ProgramExercisesTable extends ProgramExercises + with TableInfo<$ProgramExercisesTable, ProgramExercise> { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + $ProgramExercisesTable(this.attachedDatabase, [this._alias]); + static const VerificationMeta _idMeta = const VerificationMeta('id'); + @override + late final GeneratedColumn id = GeneratedColumn( + 'id', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _createdAtMeta = const VerificationMeta( + 'createdAt', + ); + @override + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + ); + static const VerificationMeta _updatedAtMeta = const VerificationMeta( + 'updatedAt', + ); + @override + late final GeneratedColumn updatedAt = GeneratedColumn( + 'updated_at', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + ); + static const VerificationMeta _deletedAtMeta = const VerificationMeta( + 'deletedAt', + ); + @override + late final GeneratedColumn deletedAt = GeneratedColumn( + 'deleted_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + static const VerificationMeta _schemaVersionMeta = const VerificationMeta( + 'schemaVersion', + ); + @override + late final GeneratedColumn schemaVersion = GeneratedColumn( + 'schema_version', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultValue: const Constant(1), + ); + static const VerificationMeta _syncStateMeta = const VerificationMeta( + 'syncState', + ); + @override + late final GeneratedColumn syncState = GeneratedColumn( + 'sync_state', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: + 'NOT NULL CHECK (sync_state IN (\'localOnly\', \'dirty\', \'synced\', \'deleted\'))', + ); + static const VerificationMeta _localRevisionMeta = const VerificationMeta( + 'localRevision', + ); + @override + late final GeneratedColumn localRevision = GeneratedColumn( + 'local_revision', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL CHECK (local_revision >= 0)', + ); + static const VerificationMeta _originDeviceIdMeta = const VerificationMeta( + 'originDeviceId', + ); + @override + late final GeneratedColumn originDeviceId = GeneratedColumn( + 'origin_device_id', + aliasedName, + false, + additionalChecks: GeneratedColumn.checkTextLength(minTextLength: 1), + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _futureOwnerProfileIdMeta = + const VerificationMeta('futureOwnerProfileId'); + @override + late final GeneratedColumn futureOwnerProfileId = + GeneratedColumn( + 'future_owner_profile_id', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _lastSyncedAtMeta = const VerificationMeta( + 'lastSyncedAt', + ); + @override + late final GeneratedColumn lastSyncedAt = GeneratedColumn( + 'last_synced_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + static const VerificationMeta _remoteRevisionMeta = const VerificationMeta( + 'remoteRevision', + ); + @override + late final GeneratedColumn remoteRevision = GeneratedColumn( + 'remote_revision', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _programIdMeta = const VerificationMeta( + 'programId', + ); + @override + late final GeneratedColumn programId = GeneratedColumn( + 'program_id', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'REFERENCES programs (id)', + ), + ); + static const VerificationMeta _sourceExerciseIdMeta = const VerificationMeta( + 'sourceExerciseId', + ); + @override + late final GeneratedColumn sourceExerciseId = GeneratedColumn( + 'source_exercise_id', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'REFERENCES exercises (id)', + ), + ); + static const VerificationMeta _positionMeta = const VerificationMeta( + 'position', + ); + @override + late final GeneratedColumn position = GeneratedColumn( + 'position', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + ); + static const VerificationMeta _exerciseNameSnapshotMeta = + const VerificationMeta('exerciseNameSnapshot'); + @override + late final GeneratedColumn exerciseNameSnapshot = + GeneratedColumn( + 'exercise_name_snapshot', + aliasedName, + false, + additionalChecks: GeneratedColumn.checkTextLength(minTextLength: 1), + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _exerciseDescriptionSnapshotMeta = + const VerificationMeta('exerciseDescriptionSnapshot'); + @override + late final GeneratedColumn exerciseDescriptionSnapshot = + GeneratedColumn( + 'exercise_description_snapshot', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _exerciseImageMediaIdSnapshotMeta = + const VerificationMeta('exerciseImageMediaIdSnapshot'); + @override + late final GeneratedColumn exerciseImageMediaIdSnapshot = + GeneratedColumn( + 'exercise_image_media_id_snapshot', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'REFERENCES media_assets (id)', + ), + ); + static const VerificationMeta _exerciseVideoMediaIdSnapshotMeta = + const VerificationMeta('exerciseVideoMediaIdSnapshot'); + @override + late final GeneratedColumn exerciseVideoMediaIdSnapshot = + GeneratedColumn( + 'exercise_video_media_id_snapshot', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'REFERENCES media_assets (id)', + ), + ); + static const VerificationMeta _exerciseArchivedSnapshotMeta = + const VerificationMeta('exerciseArchivedSnapshot'); + @override + late final GeneratedColumn exerciseArchivedSnapshot = + GeneratedColumn( + 'exercise_archived_snapshot', + aliasedName, + false, + type: DriftSqlType.bool, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("exercise_archived_snapshot" IN (0, 1))', + ), + defaultValue: const Constant(false), + ); + static const VerificationMeta _availableTimeSnapshotMeta = + const VerificationMeta('availableTimeSnapshot'); + @override + late final GeneratedColumn availableTimeSnapshot = + GeneratedColumn( + 'available_time_snapshot', + aliasedName, + false, + type: DriftSqlType.bool, + requiredDuringInsert: true, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("available_time_snapshot" IN (0, 1))', + ), + ); + static const VerificationMeta _availableRepsSnapshotMeta = + const VerificationMeta('availableRepsSnapshot'); + @override + late final GeneratedColumn availableRepsSnapshot = + GeneratedColumn( + 'available_reps_snapshot', + aliasedName, + false, + type: DriftSqlType.bool, + requiredDuringInsert: true, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("available_reps_snapshot" IN (0, 1))', + ), + ); + static const VerificationMeta _availableScoreSnapshotMeta = + const VerificationMeta('availableScoreSnapshot'); + @override + late final GeneratedColumn availableScoreSnapshot = + GeneratedColumn( + 'available_score_snapshot', + aliasedName, + false, + type: DriftSqlType.bool, + requiredDuringInsert: true, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("available_score_snapshot" IN (0, 1))', + ), + ); + static const VerificationMeta _scoreLabelSnapshotMeta = + const VerificationMeta('scoreLabelSnapshot'); + @override + late final GeneratedColumn scoreLabelSnapshot = + GeneratedColumn( + 'score_label_snapshot', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _scoreUnitSnapshotMeta = const VerificationMeta( + 'scoreUnitSnapshot', + ); + @override + late final GeneratedColumn scoreUnitSnapshot = + GeneratedColumn( + 'score_unit_snapshot', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _setsCountMeta = const VerificationMeta( + 'setsCount', + ); + @override + late final GeneratedColumn setsCount = GeneratedColumn( + 'sets_count', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + ); + static const VerificationMeta _timeEnabledMeta = const VerificationMeta( + 'timeEnabled', + ); + @override + late final GeneratedColumn timeEnabled = GeneratedColumn( + 'time_enabled', + aliasedName, + false, + type: DriftSqlType.bool, + requiredDuringInsert: true, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("time_enabled" IN (0, 1))', + ), + ); + static const VerificationMeta _repsEnabledMeta = const VerificationMeta( + 'repsEnabled', + ); + @override + late final GeneratedColumn repsEnabled = GeneratedColumn( + 'reps_enabled', + aliasedName, + false, + type: DriftSqlType.bool, + requiredDuringInsert: true, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("reps_enabled" IN (0, 1))', + ), + ); + static const VerificationMeta _scoreEnabledMeta = const VerificationMeta( + 'scoreEnabled', + ); + @override + late final GeneratedColumn scoreEnabled = GeneratedColumn( + 'score_enabled', + aliasedName, + false, + type: DriftSqlType.bool, + requiredDuringInsert: true, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("score_enabled" IN (0, 1))', + ), + ); + static const VerificationMeta _targetTimeSecondsMeta = const VerificationMeta( + 'targetTimeSeconds', + ); + @override + late final GeneratedColumn targetTimeSeconds = GeneratedColumn( + 'target_time_seconds', + aliasedName, + true, + type: DriftSqlType.int, + requiredDuringInsert: false, + ); + static const VerificationMeta _targetRepsMeta = const VerificationMeta( + 'targetReps', + ); + @override + late final GeneratedColumn targetReps = GeneratedColumn( + 'target_reps', + aliasedName, + true, + type: DriftSqlType.int, + requiredDuringInsert: false, + ); + static const VerificationMeta _targetScoreMeta = const VerificationMeta( + 'targetScore', + ); + @override + late final GeneratedColumn targetScore = GeneratedColumn( + 'target_score', + aliasedName, + true, + type: DriftSqlType.double, + requiredDuringInsert: false, + ); + static const VerificationMeta _restSecondsOverrideMeta = + const VerificationMeta('restSecondsOverride'); + @override + late final GeneratedColumn restSecondsOverride = GeneratedColumn( + 'rest_seconds_override', + aliasedName, + true, + type: DriftSqlType.int, + requiredDuringInsert: false, + ); + @override + List get $columns => [ + id, + createdAt, + updatedAt, + deletedAt, + schemaVersion, + syncState, + localRevision, + originDeviceId, + futureOwnerProfileId, + lastSyncedAt, + remoteRevision, + programId, + sourceExerciseId, + position, + exerciseNameSnapshot, + exerciseDescriptionSnapshot, + exerciseImageMediaIdSnapshot, + exerciseVideoMediaIdSnapshot, + exerciseArchivedSnapshot, + availableTimeSnapshot, + availableRepsSnapshot, + availableScoreSnapshot, + scoreLabelSnapshot, + scoreUnitSnapshot, + setsCount, + timeEnabled, + repsEnabled, + scoreEnabled, + targetTimeSeconds, + targetReps, + targetScore, + restSecondsOverride, + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'program_exercises'; + @override + VerificationContext validateIntegrity( + Insertable instance, { + bool isInserting = false, + }) { + final context = VerificationContext(); + final data = instance.toColumns(true); + if (data.containsKey('id')) { + context.handle(_idMeta, id.isAcceptableOrUnknown(data['id']!, _idMeta)); + } else if (isInserting) { + context.missing(_idMeta); + } + if (data.containsKey('created_at')) { + context.handle( + _createdAtMeta, + createdAt.isAcceptableOrUnknown(data['created_at']!, _createdAtMeta), + ); + } else if (isInserting) { + context.missing(_createdAtMeta); + } + if (data.containsKey('updated_at')) { + context.handle( + _updatedAtMeta, + updatedAt.isAcceptableOrUnknown(data['updated_at']!, _updatedAtMeta), + ); + } else if (isInserting) { + context.missing(_updatedAtMeta); + } + if (data.containsKey('deleted_at')) { + context.handle( + _deletedAtMeta, + deletedAt.isAcceptableOrUnknown(data['deleted_at']!, _deletedAtMeta), + ); + } + if (data.containsKey('schema_version')) { + context.handle( + _schemaVersionMeta, + schemaVersion.isAcceptableOrUnknown( + data['schema_version']!, + _schemaVersionMeta, + ), + ); + } + if (data.containsKey('sync_state')) { + context.handle( + _syncStateMeta, + syncState.isAcceptableOrUnknown(data['sync_state']!, _syncStateMeta), + ); + } else if (isInserting) { + context.missing(_syncStateMeta); + } + if (data.containsKey('local_revision')) { + context.handle( + _localRevisionMeta, + localRevision.isAcceptableOrUnknown( + data['local_revision']!, + _localRevisionMeta, + ), + ); + } else if (isInserting) { + context.missing(_localRevisionMeta); + } + if (data.containsKey('origin_device_id')) { + context.handle( + _originDeviceIdMeta, + originDeviceId.isAcceptableOrUnknown( + data['origin_device_id']!, + _originDeviceIdMeta, + ), + ); + } else if (isInserting) { + context.missing(_originDeviceIdMeta); + } + if (data.containsKey('future_owner_profile_id')) { + context.handle( + _futureOwnerProfileIdMeta, + futureOwnerProfileId.isAcceptableOrUnknown( + data['future_owner_profile_id']!, + _futureOwnerProfileIdMeta, + ), + ); + } + if (data.containsKey('last_synced_at')) { + context.handle( + _lastSyncedAtMeta, + lastSyncedAt.isAcceptableOrUnknown( + data['last_synced_at']!, + _lastSyncedAtMeta, + ), + ); + } + if (data.containsKey('remote_revision')) { + context.handle( + _remoteRevisionMeta, + remoteRevision.isAcceptableOrUnknown( + data['remote_revision']!, + _remoteRevisionMeta, + ), + ); + } + if (data.containsKey('program_id')) { + context.handle( + _programIdMeta, + programId.isAcceptableOrUnknown(data['program_id']!, _programIdMeta), + ); + } else if (isInserting) { + context.missing(_programIdMeta); + } + if (data.containsKey('source_exercise_id')) { + context.handle( + _sourceExerciseIdMeta, + sourceExerciseId.isAcceptableOrUnknown( + data['source_exercise_id']!, + _sourceExerciseIdMeta, + ), + ); + } + if (data.containsKey('position')) { + context.handle( + _positionMeta, + position.isAcceptableOrUnknown(data['position']!, _positionMeta), + ); + } else if (isInserting) { + context.missing(_positionMeta); + } + if (data.containsKey('exercise_name_snapshot')) { + context.handle( + _exerciseNameSnapshotMeta, + exerciseNameSnapshot.isAcceptableOrUnknown( + data['exercise_name_snapshot']!, + _exerciseNameSnapshotMeta, + ), + ); + } else if (isInserting) { + context.missing(_exerciseNameSnapshotMeta); + } + if (data.containsKey('exercise_description_snapshot')) { + context.handle( + _exerciseDescriptionSnapshotMeta, + exerciseDescriptionSnapshot.isAcceptableOrUnknown( + data['exercise_description_snapshot']!, + _exerciseDescriptionSnapshotMeta, + ), + ); + } + if (data.containsKey('exercise_image_media_id_snapshot')) { + context.handle( + _exerciseImageMediaIdSnapshotMeta, + exerciseImageMediaIdSnapshot.isAcceptableOrUnknown( + data['exercise_image_media_id_snapshot']!, + _exerciseImageMediaIdSnapshotMeta, + ), + ); + } + if (data.containsKey('exercise_video_media_id_snapshot')) { + context.handle( + _exerciseVideoMediaIdSnapshotMeta, + exerciseVideoMediaIdSnapshot.isAcceptableOrUnknown( + data['exercise_video_media_id_snapshot']!, + _exerciseVideoMediaIdSnapshotMeta, + ), + ); + } + if (data.containsKey('exercise_archived_snapshot')) { + context.handle( + _exerciseArchivedSnapshotMeta, + exerciseArchivedSnapshot.isAcceptableOrUnknown( + data['exercise_archived_snapshot']!, + _exerciseArchivedSnapshotMeta, + ), + ); + } + if (data.containsKey('available_time_snapshot')) { + context.handle( + _availableTimeSnapshotMeta, + availableTimeSnapshot.isAcceptableOrUnknown( + data['available_time_snapshot']!, + _availableTimeSnapshotMeta, + ), + ); + } else if (isInserting) { + context.missing(_availableTimeSnapshotMeta); + } + if (data.containsKey('available_reps_snapshot')) { + context.handle( + _availableRepsSnapshotMeta, + availableRepsSnapshot.isAcceptableOrUnknown( + data['available_reps_snapshot']!, + _availableRepsSnapshotMeta, + ), + ); + } else if (isInserting) { + context.missing(_availableRepsSnapshotMeta); + } + if (data.containsKey('available_score_snapshot')) { + context.handle( + _availableScoreSnapshotMeta, + availableScoreSnapshot.isAcceptableOrUnknown( + data['available_score_snapshot']!, + _availableScoreSnapshotMeta, + ), + ); + } else if (isInserting) { + context.missing(_availableScoreSnapshotMeta); + } + if (data.containsKey('score_label_snapshot')) { + context.handle( + _scoreLabelSnapshotMeta, + scoreLabelSnapshot.isAcceptableOrUnknown( + data['score_label_snapshot']!, + _scoreLabelSnapshotMeta, + ), + ); + } + if (data.containsKey('score_unit_snapshot')) { + context.handle( + _scoreUnitSnapshotMeta, + scoreUnitSnapshot.isAcceptableOrUnknown( + data['score_unit_snapshot']!, + _scoreUnitSnapshotMeta, + ), + ); + } + if (data.containsKey('sets_count')) { + context.handle( + _setsCountMeta, + setsCount.isAcceptableOrUnknown(data['sets_count']!, _setsCountMeta), + ); + } else if (isInserting) { + context.missing(_setsCountMeta); + } + if (data.containsKey('time_enabled')) { + context.handle( + _timeEnabledMeta, + timeEnabled.isAcceptableOrUnknown( + data['time_enabled']!, + _timeEnabledMeta, + ), + ); + } else if (isInserting) { + context.missing(_timeEnabledMeta); + } + if (data.containsKey('reps_enabled')) { + context.handle( + _repsEnabledMeta, + repsEnabled.isAcceptableOrUnknown( + data['reps_enabled']!, + _repsEnabledMeta, + ), + ); + } else if (isInserting) { + context.missing(_repsEnabledMeta); + } + if (data.containsKey('score_enabled')) { + context.handle( + _scoreEnabledMeta, + scoreEnabled.isAcceptableOrUnknown( + data['score_enabled']!, + _scoreEnabledMeta, + ), + ); + } else if (isInserting) { + context.missing(_scoreEnabledMeta); + } + if (data.containsKey('target_time_seconds')) { + context.handle( + _targetTimeSecondsMeta, + targetTimeSeconds.isAcceptableOrUnknown( + data['target_time_seconds']!, + _targetTimeSecondsMeta, + ), + ); + } + if (data.containsKey('target_reps')) { + context.handle( + _targetRepsMeta, + targetReps.isAcceptableOrUnknown(data['target_reps']!, _targetRepsMeta), + ); + } + if (data.containsKey('target_score')) { + context.handle( + _targetScoreMeta, + targetScore.isAcceptableOrUnknown( + data['target_score']!, + _targetScoreMeta, + ), + ); + } + if (data.containsKey('rest_seconds_override')) { + context.handle( + _restSecondsOverrideMeta, + restSecondsOverride.isAcceptableOrUnknown( + data['rest_seconds_override']!, + _restSecondsOverrideMeta, + ), + ); + } + return context; + } + + @override + Set get $primaryKey => {id}; + @override + ProgramExercise map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return ProgramExercise( + id: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}id'], + )!, + createdAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}created_at'], + )!, + updatedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}updated_at'], + )!, + deletedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}deleted_at'], + ), + schemaVersion: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}schema_version'], + )!, + syncState: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}sync_state'], + )!, + localRevision: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}local_revision'], + )!, + originDeviceId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}origin_device_id'], + )!, + futureOwnerProfileId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}future_owner_profile_id'], + ), + lastSyncedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}last_synced_at'], + ), + remoteRevision: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}remote_revision'], + ), + programId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}program_id'], + )!, + sourceExerciseId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}source_exercise_id'], + ), + position: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}position'], + )!, + exerciseNameSnapshot: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}exercise_name_snapshot'], + )!, + exerciseDescriptionSnapshot: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}exercise_description_snapshot'], + ), + exerciseImageMediaIdSnapshot: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}exercise_image_media_id_snapshot'], + ), + exerciseVideoMediaIdSnapshot: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}exercise_video_media_id_snapshot'], + ), + exerciseArchivedSnapshot: attachedDatabase.typeMapping.read( + DriftSqlType.bool, + data['${effectivePrefix}exercise_archived_snapshot'], + )!, + availableTimeSnapshot: attachedDatabase.typeMapping.read( + DriftSqlType.bool, + data['${effectivePrefix}available_time_snapshot'], + )!, + availableRepsSnapshot: attachedDatabase.typeMapping.read( + DriftSqlType.bool, + data['${effectivePrefix}available_reps_snapshot'], + )!, + availableScoreSnapshot: attachedDatabase.typeMapping.read( + DriftSqlType.bool, + data['${effectivePrefix}available_score_snapshot'], + )!, + scoreLabelSnapshot: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}score_label_snapshot'], + ), + scoreUnitSnapshot: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}score_unit_snapshot'], + ), + setsCount: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}sets_count'], + )!, + timeEnabled: attachedDatabase.typeMapping.read( + DriftSqlType.bool, + data['${effectivePrefix}time_enabled'], + )!, + repsEnabled: attachedDatabase.typeMapping.read( + DriftSqlType.bool, + data['${effectivePrefix}reps_enabled'], + )!, + scoreEnabled: attachedDatabase.typeMapping.read( + DriftSqlType.bool, + data['${effectivePrefix}score_enabled'], + )!, + targetTimeSeconds: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}target_time_seconds'], + ), + targetReps: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}target_reps'], + ), + targetScore: attachedDatabase.typeMapping.read( + DriftSqlType.double, + data['${effectivePrefix}target_score'], + ), + restSecondsOverride: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}rest_seconds_override'], + ), + ); + } + + @override + $ProgramExercisesTable createAlias(String alias) { + return $ProgramExercisesTable(attachedDatabase, alias); + } +} + +class ProgramExercise extends DataClass implements Insertable { + final String id; + final DateTime createdAt; + final DateTime updatedAt; + final DateTime? deletedAt; + final int schemaVersion; + final String syncState; + final int localRevision; + final String originDeviceId; + final String? futureOwnerProfileId; + final DateTime? lastSyncedAt; + final String? remoteRevision; + final String programId; + final String? sourceExerciseId; + final int position; + final String exerciseNameSnapshot; + final String? exerciseDescriptionSnapshot; + final String? exerciseImageMediaIdSnapshot; + final String? exerciseVideoMediaIdSnapshot; + final bool exerciseArchivedSnapshot; + final bool availableTimeSnapshot; + final bool availableRepsSnapshot; + final bool availableScoreSnapshot; + final String? scoreLabelSnapshot; + final String? scoreUnitSnapshot; + final int setsCount; + final bool timeEnabled; + final bool repsEnabled; + final bool scoreEnabled; + final int? targetTimeSeconds; + final int? targetReps; + final double? targetScore; + final int? restSecondsOverride; + const ProgramExercise({ + required this.id, + required this.createdAt, + required this.updatedAt, + this.deletedAt, + required this.schemaVersion, + required this.syncState, + required this.localRevision, + required this.originDeviceId, + this.futureOwnerProfileId, + this.lastSyncedAt, + this.remoteRevision, + required this.programId, + this.sourceExerciseId, + required this.position, + required this.exerciseNameSnapshot, + this.exerciseDescriptionSnapshot, + this.exerciseImageMediaIdSnapshot, + this.exerciseVideoMediaIdSnapshot, + required this.exerciseArchivedSnapshot, + required this.availableTimeSnapshot, + required this.availableRepsSnapshot, + required this.availableScoreSnapshot, + this.scoreLabelSnapshot, + this.scoreUnitSnapshot, + required this.setsCount, + required this.timeEnabled, + required this.repsEnabled, + required this.scoreEnabled, + this.targetTimeSeconds, + this.targetReps, + this.targetScore, + this.restSecondsOverride, + }); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['created_at'] = Variable(createdAt); + map['updated_at'] = Variable(updatedAt); + if (!nullToAbsent || deletedAt != null) { + map['deleted_at'] = Variable(deletedAt); + } + map['schema_version'] = Variable(schemaVersion); + map['sync_state'] = Variable(syncState); + map['local_revision'] = Variable(localRevision); + map['origin_device_id'] = Variable(originDeviceId); + if (!nullToAbsent || futureOwnerProfileId != null) { + map['future_owner_profile_id'] = Variable(futureOwnerProfileId); + } + if (!nullToAbsent || lastSyncedAt != null) { + map['last_synced_at'] = Variable(lastSyncedAt); + } + if (!nullToAbsent || remoteRevision != null) { + map['remote_revision'] = Variable(remoteRevision); + } + map['program_id'] = Variable(programId); + if (!nullToAbsent || sourceExerciseId != null) { + map['source_exercise_id'] = Variable(sourceExerciseId); + } + map['position'] = Variable(position); + map['exercise_name_snapshot'] = Variable(exerciseNameSnapshot); + if (!nullToAbsent || exerciseDescriptionSnapshot != null) { + map['exercise_description_snapshot'] = Variable( + exerciseDescriptionSnapshot, + ); + } + if (!nullToAbsent || exerciseImageMediaIdSnapshot != null) { + map['exercise_image_media_id_snapshot'] = Variable( + exerciseImageMediaIdSnapshot, + ); + } + if (!nullToAbsent || exerciseVideoMediaIdSnapshot != null) { + map['exercise_video_media_id_snapshot'] = Variable( + exerciseVideoMediaIdSnapshot, + ); + } + map['exercise_archived_snapshot'] = Variable( + exerciseArchivedSnapshot, + ); + map['available_time_snapshot'] = Variable(availableTimeSnapshot); + map['available_reps_snapshot'] = Variable(availableRepsSnapshot); + map['available_score_snapshot'] = Variable(availableScoreSnapshot); + if (!nullToAbsent || scoreLabelSnapshot != null) { + map['score_label_snapshot'] = Variable(scoreLabelSnapshot); + } + if (!nullToAbsent || scoreUnitSnapshot != null) { + map['score_unit_snapshot'] = Variable(scoreUnitSnapshot); + } + map['sets_count'] = Variable(setsCount); + map['time_enabled'] = Variable(timeEnabled); + map['reps_enabled'] = Variable(repsEnabled); + map['score_enabled'] = Variable(scoreEnabled); + if (!nullToAbsent || targetTimeSeconds != null) { + map['target_time_seconds'] = Variable(targetTimeSeconds); + } + if (!nullToAbsent || targetReps != null) { + map['target_reps'] = Variable(targetReps); + } + if (!nullToAbsent || targetScore != null) { + map['target_score'] = Variable(targetScore); + } + if (!nullToAbsent || restSecondsOverride != null) { + map['rest_seconds_override'] = Variable(restSecondsOverride); + } + return map; + } + + ProgramExercisesCompanion toCompanion(bool nullToAbsent) { + return ProgramExercisesCompanion( + id: Value(id), + createdAt: Value(createdAt), + updatedAt: Value(updatedAt), + deletedAt: deletedAt == null && nullToAbsent + ? const Value.absent() + : Value(deletedAt), + schemaVersion: Value(schemaVersion), + syncState: Value(syncState), + localRevision: Value(localRevision), + originDeviceId: Value(originDeviceId), + futureOwnerProfileId: futureOwnerProfileId == null && nullToAbsent + ? const Value.absent() + : Value(futureOwnerProfileId), + lastSyncedAt: lastSyncedAt == null && nullToAbsent + ? const Value.absent() + : Value(lastSyncedAt), + remoteRevision: remoteRevision == null && nullToAbsent + ? const Value.absent() + : Value(remoteRevision), + programId: Value(programId), + sourceExerciseId: sourceExerciseId == null && nullToAbsent + ? const Value.absent() + : Value(sourceExerciseId), + position: Value(position), + exerciseNameSnapshot: Value(exerciseNameSnapshot), + exerciseDescriptionSnapshot: + exerciseDescriptionSnapshot == null && nullToAbsent + ? const Value.absent() + : Value(exerciseDescriptionSnapshot), + exerciseImageMediaIdSnapshot: + exerciseImageMediaIdSnapshot == null && nullToAbsent + ? const Value.absent() + : Value(exerciseImageMediaIdSnapshot), + exerciseVideoMediaIdSnapshot: + exerciseVideoMediaIdSnapshot == null && nullToAbsent + ? const Value.absent() + : Value(exerciseVideoMediaIdSnapshot), + exerciseArchivedSnapshot: Value(exerciseArchivedSnapshot), + availableTimeSnapshot: Value(availableTimeSnapshot), + availableRepsSnapshot: Value(availableRepsSnapshot), + availableScoreSnapshot: Value(availableScoreSnapshot), + scoreLabelSnapshot: scoreLabelSnapshot == null && nullToAbsent + ? const Value.absent() + : Value(scoreLabelSnapshot), + scoreUnitSnapshot: scoreUnitSnapshot == null && nullToAbsent + ? const Value.absent() + : Value(scoreUnitSnapshot), + setsCount: Value(setsCount), + timeEnabled: Value(timeEnabled), + repsEnabled: Value(repsEnabled), + scoreEnabled: Value(scoreEnabled), + targetTimeSeconds: targetTimeSeconds == null && nullToAbsent + ? const Value.absent() + : Value(targetTimeSeconds), + targetReps: targetReps == null && nullToAbsent + ? const Value.absent() + : Value(targetReps), + targetScore: targetScore == null && nullToAbsent + ? const Value.absent() + : Value(targetScore), + restSecondsOverride: restSecondsOverride == null && nullToAbsent + ? const Value.absent() + : Value(restSecondsOverride), + ); + } + + factory ProgramExercise.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return ProgramExercise( + id: serializer.fromJson(json['id']), + createdAt: serializer.fromJson(json['createdAt']), + updatedAt: serializer.fromJson(json['updatedAt']), + deletedAt: serializer.fromJson(json['deletedAt']), + schemaVersion: serializer.fromJson(json['schemaVersion']), + syncState: serializer.fromJson(json['syncState']), + localRevision: serializer.fromJson(json['localRevision']), + originDeviceId: serializer.fromJson(json['originDeviceId']), + futureOwnerProfileId: serializer.fromJson( + json['futureOwnerProfileId'], + ), + lastSyncedAt: serializer.fromJson(json['lastSyncedAt']), + remoteRevision: serializer.fromJson(json['remoteRevision']), + programId: serializer.fromJson(json['programId']), + sourceExerciseId: serializer.fromJson(json['sourceExerciseId']), + position: serializer.fromJson(json['position']), + exerciseNameSnapshot: serializer.fromJson( + json['exerciseNameSnapshot'], + ), + exerciseDescriptionSnapshot: serializer.fromJson( + json['exerciseDescriptionSnapshot'], + ), + exerciseImageMediaIdSnapshot: serializer.fromJson( + json['exerciseImageMediaIdSnapshot'], + ), + exerciseVideoMediaIdSnapshot: serializer.fromJson( + json['exerciseVideoMediaIdSnapshot'], + ), + exerciseArchivedSnapshot: serializer.fromJson( + json['exerciseArchivedSnapshot'], + ), + availableTimeSnapshot: serializer.fromJson( + json['availableTimeSnapshot'], + ), + availableRepsSnapshot: serializer.fromJson( + json['availableRepsSnapshot'], + ), + availableScoreSnapshot: serializer.fromJson( + json['availableScoreSnapshot'], + ), + scoreLabelSnapshot: serializer.fromJson( + json['scoreLabelSnapshot'], + ), + scoreUnitSnapshot: serializer.fromJson( + json['scoreUnitSnapshot'], + ), + setsCount: serializer.fromJson(json['setsCount']), + timeEnabled: serializer.fromJson(json['timeEnabled']), + repsEnabled: serializer.fromJson(json['repsEnabled']), + scoreEnabled: serializer.fromJson(json['scoreEnabled']), + targetTimeSeconds: serializer.fromJson(json['targetTimeSeconds']), + targetReps: serializer.fromJson(json['targetReps']), + targetScore: serializer.fromJson(json['targetScore']), + restSecondsOverride: serializer.fromJson( + json['restSecondsOverride'], + ), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'createdAt': serializer.toJson(createdAt), + 'updatedAt': serializer.toJson(updatedAt), + 'deletedAt': serializer.toJson(deletedAt), + 'schemaVersion': serializer.toJson(schemaVersion), + 'syncState': serializer.toJson(syncState), + 'localRevision': serializer.toJson(localRevision), + 'originDeviceId': serializer.toJson(originDeviceId), + 'futureOwnerProfileId': serializer.toJson(futureOwnerProfileId), + 'lastSyncedAt': serializer.toJson(lastSyncedAt), + 'remoteRevision': serializer.toJson(remoteRevision), + 'programId': serializer.toJson(programId), + 'sourceExerciseId': serializer.toJson(sourceExerciseId), + 'position': serializer.toJson(position), + 'exerciseNameSnapshot': serializer.toJson(exerciseNameSnapshot), + 'exerciseDescriptionSnapshot': serializer.toJson( + exerciseDescriptionSnapshot, + ), + 'exerciseImageMediaIdSnapshot': serializer.toJson( + exerciseImageMediaIdSnapshot, + ), + 'exerciseVideoMediaIdSnapshot': serializer.toJson( + exerciseVideoMediaIdSnapshot, + ), + 'exerciseArchivedSnapshot': serializer.toJson( + exerciseArchivedSnapshot, + ), + 'availableTimeSnapshot': serializer.toJson(availableTimeSnapshot), + 'availableRepsSnapshot': serializer.toJson(availableRepsSnapshot), + 'availableScoreSnapshot': serializer.toJson(availableScoreSnapshot), + 'scoreLabelSnapshot': serializer.toJson(scoreLabelSnapshot), + 'scoreUnitSnapshot': serializer.toJson(scoreUnitSnapshot), + 'setsCount': serializer.toJson(setsCount), + 'timeEnabled': serializer.toJson(timeEnabled), + 'repsEnabled': serializer.toJson(repsEnabled), + 'scoreEnabled': serializer.toJson(scoreEnabled), + 'targetTimeSeconds': serializer.toJson(targetTimeSeconds), + 'targetReps': serializer.toJson(targetReps), + 'targetScore': serializer.toJson(targetScore), + 'restSecondsOverride': serializer.toJson(restSecondsOverride), + }; + } + + ProgramExercise copyWith({ + String? id, + DateTime? createdAt, + DateTime? updatedAt, + Value deletedAt = const Value.absent(), + int? schemaVersion, + String? syncState, + int? localRevision, + String? originDeviceId, + Value futureOwnerProfileId = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + Value remoteRevision = const Value.absent(), + String? programId, + Value sourceExerciseId = const Value.absent(), + int? position, + String? exerciseNameSnapshot, + Value exerciseDescriptionSnapshot = const Value.absent(), + Value exerciseImageMediaIdSnapshot = const Value.absent(), + Value exerciseVideoMediaIdSnapshot = const Value.absent(), + bool? exerciseArchivedSnapshot, + bool? availableTimeSnapshot, + bool? availableRepsSnapshot, + bool? availableScoreSnapshot, + Value scoreLabelSnapshot = const Value.absent(), + Value scoreUnitSnapshot = const Value.absent(), + int? setsCount, + bool? timeEnabled, + bool? repsEnabled, + bool? scoreEnabled, + Value targetTimeSeconds = const Value.absent(), + Value targetReps = const Value.absent(), + Value targetScore = const Value.absent(), + Value restSecondsOverride = const Value.absent(), + }) => ProgramExercise( + id: id ?? this.id, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt.present ? deletedAt.value : this.deletedAt, + schemaVersion: schemaVersion ?? this.schemaVersion, + syncState: syncState ?? this.syncState, + localRevision: localRevision ?? this.localRevision, + originDeviceId: originDeviceId ?? this.originDeviceId, + futureOwnerProfileId: futureOwnerProfileId.present + ? futureOwnerProfileId.value + : this.futureOwnerProfileId, + lastSyncedAt: lastSyncedAt.present ? lastSyncedAt.value : this.lastSyncedAt, + remoteRevision: remoteRevision.present + ? remoteRevision.value + : this.remoteRevision, + programId: programId ?? this.programId, + sourceExerciseId: sourceExerciseId.present + ? sourceExerciseId.value + : this.sourceExerciseId, + position: position ?? this.position, + exerciseNameSnapshot: exerciseNameSnapshot ?? this.exerciseNameSnapshot, + exerciseDescriptionSnapshot: exerciseDescriptionSnapshot.present + ? exerciseDescriptionSnapshot.value + : this.exerciseDescriptionSnapshot, + exerciseImageMediaIdSnapshot: exerciseImageMediaIdSnapshot.present + ? exerciseImageMediaIdSnapshot.value + : this.exerciseImageMediaIdSnapshot, + exerciseVideoMediaIdSnapshot: exerciseVideoMediaIdSnapshot.present + ? exerciseVideoMediaIdSnapshot.value + : this.exerciseVideoMediaIdSnapshot, + exerciseArchivedSnapshot: + exerciseArchivedSnapshot ?? this.exerciseArchivedSnapshot, + availableTimeSnapshot: availableTimeSnapshot ?? this.availableTimeSnapshot, + availableRepsSnapshot: availableRepsSnapshot ?? this.availableRepsSnapshot, + availableScoreSnapshot: + availableScoreSnapshot ?? this.availableScoreSnapshot, + scoreLabelSnapshot: scoreLabelSnapshot.present + ? scoreLabelSnapshot.value + : this.scoreLabelSnapshot, + scoreUnitSnapshot: scoreUnitSnapshot.present + ? scoreUnitSnapshot.value + : this.scoreUnitSnapshot, + setsCount: setsCount ?? this.setsCount, + timeEnabled: timeEnabled ?? this.timeEnabled, + repsEnabled: repsEnabled ?? this.repsEnabled, + scoreEnabled: scoreEnabled ?? this.scoreEnabled, + targetTimeSeconds: targetTimeSeconds.present + ? targetTimeSeconds.value + : this.targetTimeSeconds, + targetReps: targetReps.present ? targetReps.value : this.targetReps, + targetScore: targetScore.present ? targetScore.value : this.targetScore, + restSecondsOverride: restSecondsOverride.present + ? restSecondsOverride.value + : this.restSecondsOverride, + ); + ProgramExercise copyWithCompanion(ProgramExercisesCompanion data) { + return ProgramExercise( + id: data.id.present ? data.id.value : this.id, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + updatedAt: data.updatedAt.present ? data.updatedAt.value : this.updatedAt, + deletedAt: data.deletedAt.present ? data.deletedAt.value : this.deletedAt, + schemaVersion: data.schemaVersion.present + ? data.schemaVersion.value + : this.schemaVersion, + syncState: data.syncState.present ? data.syncState.value : this.syncState, + localRevision: data.localRevision.present + ? data.localRevision.value + : this.localRevision, + originDeviceId: data.originDeviceId.present + ? data.originDeviceId.value + : this.originDeviceId, + futureOwnerProfileId: data.futureOwnerProfileId.present + ? data.futureOwnerProfileId.value + : this.futureOwnerProfileId, + lastSyncedAt: data.lastSyncedAt.present + ? data.lastSyncedAt.value + : this.lastSyncedAt, + remoteRevision: data.remoteRevision.present + ? data.remoteRevision.value + : this.remoteRevision, + programId: data.programId.present ? data.programId.value : this.programId, + sourceExerciseId: data.sourceExerciseId.present + ? data.sourceExerciseId.value + : this.sourceExerciseId, + position: data.position.present ? data.position.value : this.position, + exerciseNameSnapshot: data.exerciseNameSnapshot.present + ? data.exerciseNameSnapshot.value + : this.exerciseNameSnapshot, + exerciseDescriptionSnapshot: data.exerciseDescriptionSnapshot.present + ? data.exerciseDescriptionSnapshot.value + : this.exerciseDescriptionSnapshot, + exerciseImageMediaIdSnapshot: data.exerciseImageMediaIdSnapshot.present + ? data.exerciseImageMediaIdSnapshot.value + : this.exerciseImageMediaIdSnapshot, + exerciseVideoMediaIdSnapshot: data.exerciseVideoMediaIdSnapshot.present + ? data.exerciseVideoMediaIdSnapshot.value + : this.exerciseVideoMediaIdSnapshot, + exerciseArchivedSnapshot: data.exerciseArchivedSnapshot.present + ? data.exerciseArchivedSnapshot.value + : this.exerciseArchivedSnapshot, + availableTimeSnapshot: data.availableTimeSnapshot.present + ? data.availableTimeSnapshot.value + : this.availableTimeSnapshot, + availableRepsSnapshot: data.availableRepsSnapshot.present + ? data.availableRepsSnapshot.value + : this.availableRepsSnapshot, + availableScoreSnapshot: data.availableScoreSnapshot.present + ? data.availableScoreSnapshot.value + : this.availableScoreSnapshot, + scoreLabelSnapshot: data.scoreLabelSnapshot.present + ? data.scoreLabelSnapshot.value + : this.scoreLabelSnapshot, + scoreUnitSnapshot: data.scoreUnitSnapshot.present + ? data.scoreUnitSnapshot.value + : this.scoreUnitSnapshot, + setsCount: data.setsCount.present ? data.setsCount.value : this.setsCount, + timeEnabled: data.timeEnabled.present + ? data.timeEnabled.value + : this.timeEnabled, + repsEnabled: data.repsEnabled.present + ? data.repsEnabled.value + : this.repsEnabled, + scoreEnabled: data.scoreEnabled.present + ? data.scoreEnabled.value + : this.scoreEnabled, + targetTimeSeconds: data.targetTimeSeconds.present + ? data.targetTimeSeconds.value + : this.targetTimeSeconds, + targetReps: data.targetReps.present + ? data.targetReps.value + : this.targetReps, + targetScore: data.targetScore.present + ? data.targetScore.value + : this.targetScore, + restSecondsOverride: data.restSecondsOverride.present + ? data.restSecondsOverride.value + : this.restSecondsOverride, + ); + } + + @override + String toString() { + return (StringBuffer('ProgramExercise(') + ..write('id: $id, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('schemaVersion: $schemaVersion, ') + ..write('syncState: $syncState, ') + ..write('localRevision: $localRevision, ') + ..write('originDeviceId: $originDeviceId, ') + ..write('futureOwnerProfileId: $futureOwnerProfileId, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('remoteRevision: $remoteRevision, ') + ..write('programId: $programId, ') + ..write('sourceExerciseId: $sourceExerciseId, ') + ..write('position: $position, ') + ..write('exerciseNameSnapshot: $exerciseNameSnapshot, ') + ..write('exerciseDescriptionSnapshot: $exerciseDescriptionSnapshot, ') + ..write( + 'exerciseImageMediaIdSnapshot: $exerciseImageMediaIdSnapshot, ', + ) + ..write( + 'exerciseVideoMediaIdSnapshot: $exerciseVideoMediaIdSnapshot, ', + ) + ..write('exerciseArchivedSnapshot: $exerciseArchivedSnapshot, ') + ..write('availableTimeSnapshot: $availableTimeSnapshot, ') + ..write('availableRepsSnapshot: $availableRepsSnapshot, ') + ..write('availableScoreSnapshot: $availableScoreSnapshot, ') + ..write('scoreLabelSnapshot: $scoreLabelSnapshot, ') + ..write('scoreUnitSnapshot: $scoreUnitSnapshot, ') + ..write('setsCount: $setsCount, ') + ..write('timeEnabled: $timeEnabled, ') + ..write('repsEnabled: $repsEnabled, ') + ..write('scoreEnabled: $scoreEnabled, ') + ..write('targetTimeSeconds: $targetTimeSeconds, ') + ..write('targetReps: $targetReps, ') + ..write('targetScore: $targetScore, ') + ..write('restSecondsOverride: $restSecondsOverride') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hashAll([ + id, + createdAt, + updatedAt, + deletedAt, + schemaVersion, + syncState, + localRevision, + originDeviceId, + futureOwnerProfileId, + lastSyncedAt, + remoteRevision, + programId, + sourceExerciseId, + position, + exerciseNameSnapshot, + exerciseDescriptionSnapshot, + exerciseImageMediaIdSnapshot, + exerciseVideoMediaIdSnapshot, + exerciseArchivedSnapshot, + availableTimeSnapshot, + availableRepsSnapshot, + availableScoreSnapshot, + scoreLabelSnapshot, + scoreUnitSnapshot, + setsCount, + timeEnabled, + repsEnabled, + scoreEnabled, + targetTimeSeconds, + targetReps, + targetScore, + restSecondsOverride, + ]); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is ProgramExercise && + other.id == this.id && + other.createdAt == this.createdAt && + other.updatedAt == this.updatedAt && + other.deletedAt == this.deletedAt && + other.schemaVersion == this.schemaVersion && + other.syncState == this.syncState && + other.localRevision == this.localRevision && + other.originDeviceId == this.originDeviceId && + other.futureOwnerProfileId == this.futureOwnerProfileId && + other.lastSyncedAt == this.lastSyncedAt && + other.remoteRevision == this.remoteRevision && + other.programId == this.programId && + other.sourceExerciseId == this.sourceExerciseId && + other.position == this.position && + other.exerciseNameSnapshot == this.exerciseNameSnapshot && + other.exerciseDescriptionSnapshot == + this.exerciseDescriptionSnapshot && + other.exerciseImageMediaIdSnapshot == + this.exerciseImageMediaIdSnapshot && + other.exerciseVideoMediaIdSnapshot == + this.exerciseVideoMediaIdSnapshot && + other.exerciseArchivedSnapshot == this.exerciseArchivedSnapshot && + other.availableTimeSnapshot == this.availableTimeSnapshot && + other.availableRepsSnapshot == this.availableRepsSnapshot && + other.availableScoreSnapshot == this.availableScoreSnapshot && + other.scoreLabelSnapshot == this.scoreLabelSnapshot && + other.scoreUnitSnapshot == this.scoreUnitSnapshot && + other.setsCount == this.setsCount && + other.timeEnabled == this.timeEnabled && + other.repsEnabled == this.repsEnabled && + other.scoreEnabled == this.scoreEnabled && + other.targetTimeSeconds == this.targetTimeSeconds && + other.targetReps == this.targetReps && + other.targetScore == this.targetScore && + other.restSecondsOverride == this.restSecondsOverride); +} + +class ProgramExercisesCompanion extends UpdateCompanion { + final Value id; + final Value createdAt; + final Value updatedAt; + final Value deletedAt; + final Value schemaVersion; + final Value syncState; + final Value localRevision; + final Value originDeviceId; + final Value futureOwnerProfileId; + final Value lastSyncedAt; + final Value remoteRevision; + final Value programId; + final Value sourceExerciseId; + final Value position; + final Value exerciseNameSnapshot; + final Value exerciseDescriptionSnapshot; + final Value exerciseImageMediaIdSnapshot; + final Value exerciseVideoMediaIdSnapshot; + final Value exerciseArchivedSnapshot; + final Value availableTimeSnapshot; + final Value availableRepsSnapshot; + final Value availableScoreSnapshot; + final Value scoreLabelSnapshot; + final Value scoreUnitSnapshot; + final Value setsCount; + final Value timeEnabled; + final Value repsEnabled; + final Value scoreEnabled; + final Value targetTimeSeconds; + final Value targetReps; + final Value targetScore; + final Value restSecondsOverride; + final Value rowid; + const ProgramExercisesCompanion({ + this.id = const Value.absent(), + this.createdAt = const Value.absent(), + this.updatedAt = const Value.absent(), + this.deletedAt = const Value.absent(), + this.schemaVersion = const Value.absent(), + this.syncState = const Value.absent(), + this.localRevision = const Value.absent(), + this.originDeviceId = const Value.absent(), + this.futureOwnerProfileId = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + this.remoteRevision = const Value.absent(), + this.programId = const Value.absent(), + this.sourceExerciseId = const Value.absent(), + this.position = const Value.absent(), + this.exerciseNameSnapshot = const Value.absent(), + this.exerciseDescriptionSnapshot = const Value.absent(), + this.exerciseImageMediaIdSnapshot = const Value.absent(), + this.exerciseVideoMediaIdSnapshot = const Value.absent(), + this.exerciseArchivedSnapshot = const Value.absent(), + this.availableTimeSnapshot = const Value.absent(), + this.availableRepsSnapshot = const Value.absent(), + this.availableScoreSnapshot = const Value.absent(), + this.scoreLabelSnapshot = const Value.absent(), + this.scoreUnitSnapshot = const Value.absent(), + this.setsCount = const Value.absent(), + this.timeEnabled = const Value.absent(), + this.repsEnabled = const Value.absent(), + this.scoreEnabled = const Value.absent(), + this.targetTimeSeconds = const Value.absent(), + this.targetReps = const Value.absent(), + this.targetScore = const Value.absent(), + this.restSecondsOverride = const Value.absent(), + this.rowid = const Value.absent(), + }); + ProgramExercisesCompanion.insert({ + required String id, + required DateTime createdAt, + required DateTime updatedAt, + this.deletedAt = const Value.absent(), + this.schemaVersion = const Value.absent(), + required String syncState, + required int localRevision, + required String originDeviceId, + this.futureOwnerProfileId = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + this.remoteRevision = const Value.absent(), + required String programId, + this.sourceExerciseId = const Value.absent(), + required int position, + required String exerciseNameSnapshot, + this.exerciseDescriptionSnapshot = const Value.absent(), + this.exerciseImageMediaIdSnapshot = const Value.absent(), + this.exerciseVideoMediaIdSnapshot = const Value.absent(), + this.exerciseArchivedSnapshot = const Value.absent(), + required bool availableTimeSnapshot, + required bool availableRepsSnapshot, + required bool availableScoreSnapshot, + this.scoreLabelSnapshot = const Value.absent(), + this.scoreUnitSnapshot = const Value.absent(), + required int setsCount, + required bool timeEnabled, + required bool repsEnabled, + required bool scoreEnabled, + this.targetTimeSeconds = const Value.absent(), + this.targetReps = const Value.absent(), + this.targetScore = const Value.absent(), + this.restSecondsOverride = const Value.absent(), + this.rowid = const Value.absent(), + }) : id = Value(id), + createdAt = Value(createdAt), + updatedAt = Value(updatedAt), + syncState = Value(syncState), + localRevision = Value(localRevision), + originDeviceId = Value(originDeviceId), + programId = Value(programId), + position = Value(position), + exerciseNameSnapshot = Value(exerciseNameSnapshot), + availableTimeSnapshot = Value(availableTimeSnapshot), + availableRepsSnapshot = Value(availableRepsSnapshot), + availableScoreSnapshot = Value(availableScoreSnapshot), + setsCount = Value(setsCount), + timeEnabled = Value(timeEnabled), + repsEnabled = Value(repsEnabled), + scoreEnabled = Value(scoreEnabled); + static Insertable custom({ + Expression? id, + Expression? createdAt, + Expression? updatedAt, + Expression? deletedAt, + Expression? schemaVersion, + Expression? syncState, + Expression? localRevision, + Expression? originDeviceId, + Expression? futureOwnerProfileId, + Expression? lastSyncedAt, + Expression? remoteRevision, + Expression? programId, + Expression? sourceExerciseId, + Expression? position, + Expression? exerciseNameSnapshot, + Expression? exerciseDescriptionSnapshot, + Expression? exerciseImageMediaIdSnapshot, + Expression? exerciseVideoMediaIdSnapshot, + Expression? exerciseArchivedSnapshot, + Expression? availableTimeSnapshot, + Expression? availableRepsSnapshot, + Expression? availableScoreSnapshot, + Expression? scoreLabelSnapshot, + Expression? scoreUnitSnapshot, + Expression? setsCount, + Expression? timeEnabled, + Expression? repsEnabled, + Expression? scoreEnabled, + Expression? targetTimeSeconds, + Expression? targetReps, + Expression? targetScore, + Expression? restSecondsOverride, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (createdAt != null) 'created_at': createdAt, + if (updatedAt != null) 'updated_at': updatedAt, + if (deletedAt != null) 'deleted_at': deletedAt, + if (schemaVersion != null) 'schema_version': schemaVersion, + if (syncState != null) 'sync_state': syncState, + if (localRevision != null) 'local_revision': localRevision, + if (originDeviceId != null) 'origin_device_id': originDeviceId, + if (futureOwnerProfileId != null) + 'future_owner_profile_id': futureOwnerProfileId, + if (lastSyncedAt != null) 'last_synced_at': lastSyncedAt, + if (remoteRevision != null) 'remote_revision': remoteRevision, + if (programId != null) 'program_id': programId, + if (sourceExerciseId != null) 'source_exercise_id': sourceExerciseId, + if (position != null) 'position': position, + if (exerciseNameSnapshot != null) + 'exercise_name_snapshot': exerciseNameSnapshot, + if (exerciseDescriptionSnapshot != null) + 'exercise_description_snapshot': exerciseDescriptionSnapshot, + if (exerciseImageMediaIdSnapshot != null) + 'exercise_image_media_id_snapshot': exerciseImageMediaIdSnapshot, + if (exerciseVideoMediaIdSnapshot != null) + 'exercise_video_media_id_snapshot': exerciseVideoMediaIdSnapshot, + if (exerciseArchivedSnapshot != null) + 'exercise_archived_snapshot': exerciseArchivedSnapshot, + if (availableTimeSnapshot != null) + 'available_time_snapshot': availableTimeSnapshot, + if (availableRepsSnapshot != null) + 'available_reps_snapshot': availableRepsSnapshot, + if (availableScoreSnapshot != null) + 'available_score_snapshot': availableScoreSnapshot, + if (scoreLabelSnapshot != null) + 'score_label_snapshot': scoreLabelSnapshot, + if (scoreUnitSnapshot != null) 'score_unit_snapshot': scoreUnitSnapshot, + if (setsCount != null) 'sets_count': setsCount, + if (timeEnabled != null) 'time_enabled': timeEnabled, + if (repsEnabled != null) 'reps_enabled': repsEnabled, + if (scoreEnabled != null) 'score_enabled': scoreEnabled, + if (targetTimeSeconds != null) 'target_time_seconds': targetTimeSeconds, + if (targetReps != null) 'target_reps': targetReps, + if (targetScore != null) 'target_score': targetScore, + if (restSecondsOverride != null) + 'rest_seconds_override': restSecondsOverride, + if (rowid != null) 'rowid': rowid, + }); + } + + ProgramExercisesCompanion copyWith({ + Value? id, + Value? createdAt, + Value? updatedAt, + Value? deletedAt, + Value? schemaVersion, + Value? syncState, + Value? localRevision, + Value? originDeviceId, + Value? futureOwnerProfileId, + Value? lastSyncedAt, + Value? remoteRevision, + Value? programId, + Value? sourceExerciseId, + Value? position, + Value? exerciseNameSnapshot, + Value? exerciseDescriptionSnapshot, + Value? exerciseImageMediaIdSnapshot, + Value? exerciseVideoMediaIdSnapshot, + Value? exerciseArchivedSnapshot, + Value? availableTimeSnapshot, + Value? availableRepsSnapshot, + Value? availableScoreSnapshot, + Value? scoreLabelSnapshot, + Value? scoreUnitSnapshot, + Value? setsCount, + Value? timeEnabled, + Value? repsEnabled, + Value? scoreEnabled, + Value? targetTimeSeconds, + Value? targetReps, + Value? targetScore, + Value? restSecondsOverride, + Value? rowid, + }) { + return ProgramExercisesCompanion( + id: id ?? this.id, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt ?? this.deletedAt, + schemaVersion: schemaVersion ?? this.schemaVersion, + syncState: syncState ?? this.syncState, + localRevision: localRevision ?? this.localRevision, + originDeviceId: originDeviceId ?? this.originDeviceId, + futureOwnerProfileId: futureOwnerProfileId ?? this.futureOwnerProfileId, + lastSyncedAt: lastSyncedAt ?? this.lastSyncedAt, + remoteRevision: remoteRevision ?? this.remoteRevision, + programId: programId ?? this.programId, + sourceExerciseId: sourceExerciseId ?? this.sourceExerciseId, + position: position ?? this.position, + exerciseNameSnapshot: exerciseNameSnapshot ?? this.exerciseNameSnapshot, + exerciseDescriptionSnapshot: + exerciseDescriptionSnapshot ?? this.exerciseDescriptionSnapshot, + exerciseImageMediaIdSnapshot: + exerciseImageMediaIdSnapshot ?? this.exerciseImageMediaIdSnapshot, + exerciseVideoMediaIdSnapshot: + exerciseVideoMediaIdSnapshot ?? this.exerciseVideoMediaIdSnapshot, + exerciseArchivedSnapshot: + exerciseArchivedSnapshot ?? this.exerciseArchivedSnapshot, + availableTimeSnapshot: + availableTimeSnapshot ?? this.availableTimeSnapshot, + availableRepsSnapshot: + availableRepsSnapshot ?? this.availableRepsSnapshot, + availableScoreSnapshot: + availableScoreSnapshot ?? this.availableScoreSnapshot, + scoreLabelSnapshot: scoreLabelSnapshot ?? this.scoreLabelSnapshot, + scoreUnitSnapshot: scoreUnitSnapshot ?? this.scoreUnitSnapshot, + setsCount: setsCount ?? this.setsCount, + timeEnabled: timeEnabled ?? this.timeEnabled, + repsEnabled: repsEnabled ?? this.repsEnabled, + scoreEnabled: scoreEnabled ?? this.scoreEnabled, + targetTimeSeconds: targetTimeSeconds ?? this.targetTimeSeconds, + targetReps: targetReps ?? this.targetReps, + targetScore: targetScore ?? this.targetScore, + restSecondsOverride: restSecondsOverride ?? this.restSecondsOverride, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + if (updatedAt.present) { + map['updated_at'] = Variable(updatedAt.value); + } + if (deletedAt.present) { + map['deleted_at'] = Variable(deletedAt.value); + } + if (schemaVersion.present) { + map['schema_version'] = Variable(schemaVersion.value); + } + if (syncState.present) { + map['sync_state'] = Variable(syncState.value); + } + if (localRevision.present) { + map['local_revision'] = Variable(localRevision.value); + } + if (originDeviceId.present) { + map['origin_device_id'] = Variable(originDeviceId.value); + } + if (futureOwnerProfileId.present) { + map['future_owner_profile_id'] = Variable( + futureOwnerProfileId.value, + ); + } + if (lastSyncedAt.present) { + map['last_synced_at'] = Variable(lastSyncedAt.value); + } + if (remoteRevision.present) { + map['remote_revision'] = Variable(remoteRevision.value); + } + if (programId.present) { + map['program_id'] = Variable(programId.value); + } + if (sourceExerciseId.present) { + map['source_exercise_id'] = Variable(sourceExerciseId.value); + } + if (position.present) { + map['position'] = Variable(position.value); + } + if (exerciseNameSnapshot.present) { + map['exercise_name_snapshot'] = Variable( + exerciseNameSnapshot.value, + ); + } + if (exerciseDescriptionSnapshot.present) { + map['exercise_description_snapshot'] = Variable( + exerciseDescriptionSnapshot.value, + ); + } + if (exerciseImageMediaIdSnapshot.present) { + map['exercise_image_media_id_snapshot'] = Variable( + exerciseImageMediaIdSnapshot.value, + ); + } + if (exerciseVideoMediaIdSnapshot.present) { + map['exercise_video_media_id_snapshot'] = Variable( + exerciseVideoMediaIdSnapshot.value, + ); + } + if (exerciseArchivedSnapshot.present) { + map['exercise_archived_snapshot'] = Variable( + exerciseArchivedSnapshot.value, + ); + } + if (availableTimeSnapshot.present) { + map['available_time_snapshot'] = Variable( + availableTimeSnapshot.value, + ); + } + if (availableRepsSnapshot.present) { + map['available_reps_snapshot'] = Variable( + availableRepsSnapshot.value, + ); + } + if (availableScoreSnapshot.present) { + map['available_score_snapshot'] = Variable( + availableScoreSnapshot.value, + ); + } + if (scoreLabelSnapshot.present) { + map['score_label_snapshot'] = Variable(scoreLabelSnapshot.value); + } + if (scoreUnitSnapshot.present) { + map['score_unit_snapshot'] = Variable(scoreUnitSnapshot.value); + } + if (setsCount.present) { + map['sets_count'] = Variable(setsCount.value); + } + if (timeEnabled.present) { + map['time_enabled'] = Variable(timeEnabled.value); + } + if (repsEnabled.present) { + map['reps_enabled'] = Variable(repsEnabled.value); + } + if (scoreEnabled.present) { + map['score_enabled'] = Variable(scoreEnabled.value); + } + if (targetTimeSeconds.present) { + map['target_time_seconds'] = Variable(targetTimeSeconds.value); + } + if (targetReps.present) { + map['target_reps'] = Variable(targetReps.value); + } + if (targetScore.present) { + map['target_score'] = Variable(targetScore.value); + } + if (restSecondsOverride.present) { + map['rest_seconds_override'] = Variable(restSecondsOverride.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('ProgramExercisesCompanion(') + ..write('id: $id, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('schemaVersion: $schemaVersion, ') + ..write('syncState: $syncState, ') + ..write('localRevision: $localRevision, ') + ..write('originDeviceId: $originDeviceId, ') + ..write('futureOwnerProfileId: $futureOwnerProfileId, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('remoteRevision: $remoteRevision, ') + ..write('programId: $programId, ') + ..write('sourceExerciseId: $sourceExerciseId, ') + ..write('position: $position, ') + ..write('exerciseNameSnapshot: $exerciseNameSnapshot, ') + ..write('exerciseDescriptionSnapshot: $exerciseDescriptionSnapshot, ') + ..write( + 'exerciseImageMediaIdSnapshot: $exerciseImageMediaIdSnapshot, ', + ) + ..write( + 'exerciseVideoMediaIdSnapshot: $exerciseVideoMediaIdSnapshot, ', + ) + ..write('exerciseArchivedSnapshot: $exerciseArchivedSnapshot, ') + ..write('availableTimeSnapshot: $availableTimeSnapshot, ') + ..write('availableRepsSnapshot: $availableRepsSnapshot, ') + ..write('availableScoreSnapshot: $availableScoreSnapshot, ') + ..write('scoreLabelSnapshot: $scoreLabelSnapshot, ') + ..write('scoreUnitSnapshot: $scoreUnitSnapshot, ') + ..write('setsCount: $setsCount, ') + ..write('timeEnabled: $timeEnabled, ') + ..write('repsEnabled: $repsEnabled, ') + ..write('scoreEnabled: $scoreEnabled, ') + ..write('targetTimeSeconds: $targetTimeSeconds, ') + ..write('targetReps: $targetReps, ') + ..write('targetScore: $targetScore, ') + ..write('restSecondsOverride: $restSecondsOverride, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class $WorkoutHistoriesTable extends WorkoutHistories + with TableInfo<$WorkoutHistoriesTable, WorkoutHistory> { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + $WorkoutHistoriesTable(this.attachedDatabase, [this._alias]); + static const VerificationMeta _idMeta = const VerificationMeta('id'); + @override + late final GeneratedColumn id = GeneratedColumn( + 'id', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _createdAtMeta = const VerificationMeta( + 'createdAt', + ); + @override + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + ); + static const VerificationMeta _updatedAtMeta = const VerificationMeta( + 'updatedAt', + ); + @override + late final GeneratedColumn updatedAt = GeneratedColumn( + 'updated_at', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + ); + static const VerificationMeta _deletedAtMeta = const VerificationMeta( + 'deletedAt', + ); + @override + late final GeneratedColumn deletedAt = GeneratedColumn( + 'deleted_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + static const VerificationMeta _schemaVersionMeta = const VerificationMeta( + 'schemaVersion', + ); + @override + late final GeneratedColumn schemaVersion = GeneratedColumn( + 'schema_version', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultValue: const Constant(1), + ); + static const VerificationMeta _syncStateMeta = const VerificationMeta( + 'syncState', + ); + @override + late final GeneratedColumn syncState = GeneratedColumn( + 'sync_state', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: + 'NOT NULL CHECK (sync_state IN (\'localOnly\', \'dirty\', \'synced\', \'deleted\'))', + ); + static const VerificationMeta _localRevisionMeta = const VerificationMeta( + 'localRevision', + ); + @override + late final GeneratedColumn localRevision = GeneratedColumn( + 'local_revision', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL CHECK (local_revision >= 0)', + ); + static const VerificationMeta _originDeviceIdMeta = const VerificationMeta( + 'originDeviceId', + ); + @override + late final GeneratedColumn originDeviceId = GeneratedColumn( + 'origin_device_id', + aliasedName, + false, + additionalChecks: GeneratedColumn.checkTextLength(minTextLength: 1), + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _futureOwnerProfileIdMeta = + const VerificationMeta('futureOwnerProfileId'); + @override + late final GeneratedColumn futureOwnerProfileId = + GeneratedColumn( + 'future_owner_profile_id', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _lastSyncedAtMeta = const VerificationMeta( + 'lastSyncedAt', + ); + @override + late final GeneratedColumn lastSyncedAt = GeneratedColumn( + 'last_synced_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + static const VerificationMeta _remoteRevisionMeta = const VerificationMeta( + 'remoteRevision', + ); + @override + late final GeneratedColumn remoteRevision = GeneratedColumn( + 'remote_revision', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _sourceWorkoutTemplateIdMeta = + const VerificationMeta('sourceWorkoutTemplateId'); + @override + late final GeneratedColumn sourceWorkoutTemplateId = + GeneratedColumn( + 'source_workout_template_id', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'REFERENCES workout_templates (id)', + ), + ); + static const VerificationMeta _sourceActiveWorkoutSessionIdMeta = + const VerificationMeta('sourceActiveWorkoutSessionId'); + @override + late final GeneratedColumn sourceActiveWorkoutSessionId = + GeneratedColumn( + 'source_active_workout_session_id', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'REFERENCES active_workout_sessions (id)', + ), + ); + static const VerificationMeta _nameSnapshotMeta = const VerificationMeta( + 'nameSnapshot', + ); + @override + late final GeneratedColumn nameSnapshot = GeneratedColumn( + 'name_snapshot', + aliasedName, + false, + additionalChecks: GeneratedColumn.checkTextLength(minTextLength: 1), + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _startedAtMeta = const VerificationMeta( + 'startedAt', + ); + @override + late final GeneratedColumn startedAt = GeneratedColumn( + 'started_at', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + ); + static const VerificationMeta _endedAtMeta = const VerificationMeta( + 'endedAt', + ); + @override + late final GeneratedColumn endedAt = GeneratedColumn( + 'ended_at', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + ); + static const VerificationMeta _totalActiveMsMeta = const VerificationMeta( + 'totalActiveMs', + ); + @override + late final GeneratedColumn totalActiveMs = GeneratedColumn( + 'total_active_ms', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + ); + static const VerificationMeta _completedMeta = const VerificationMeta( + 'completed', + ); + @override + late final GeneratedColumn completed = GeneratedColumn( + 'completed', + aliasedName, + false, + type: DriftSqlType.bool, + requiredDuringInsert: true, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("completed" IN (0, 1))', + ), + ); + static const VerificationMeta _historySnapshotJsonMeta = + const VerificationMeta('historySnapshotJson'); + @override + late final GeneratedColumn historySnapshotJson = + GeneratedColumn( + 'history_snapshot_json', + aliasedName, + false, + additionalChecks: GeneratedColumn.checkTextLength(minTextLength: 1), + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + @override + List get $columns => [ + id, + createdAt, + updatedAt, + deletedAt, + schemaVersion, + syncState, + localRevision, + originDeviceId, + futureOwnerProfileId, + lastSyncedAt, + remoteRevision, + sourceWorkoutTemplateId, + sourceActiveWorkoutSessionId, + nameSnapshot, + startedAt, + endedAt, + totalActiveMs, + completed, + historySnapshotJson, + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'workout_history'; + @override + VerificationContext validateIntegrity( + Insertable instance, { + bool isInserting = false, + }) { + final context = VerificationContext(); + final data = instance.toColumns(true); + if (data.containsKey('id')) { + context.handle(_idMeta, id.isAcceptableOrUnknown(data['id']!, _idMeta)); + } else if (isInserting) { + context.missing(_idMeta); + } + if (data.containsKey('created_at')) { + context.handle( + _createdAtMeta, + createdAt.isAcceptableOrUnknown(data['created_at']!, _createdAtMeta), + ); + } else if (isInserting) { + context.missing(_createdAtMeta); + } + if (data.containsKey('updated_at')) { + context.handle( + _updatedAtMeta, + updatedAt.isAcceptableOrUnknown(data['updated_at']!, _updatedAtMeta), + ); + } else if (isInserting) { + context.missing(_updatedAtMeta); + } + if (data.containsKey('deleted_at')) { + context.handle( + _deletedAtMeta, + deletedAt.isAcceptableOrUnknown(data['deleted_at']!, _deletedAtMeta), + ); + } + if (data.containsKey('schema_version')) { + context.handle( + _schemaVersionMeta, + schemaVersion.isAcceptableOrUnknown( + data['schema_version']!, + _schemaVersionMeta, + ), + ); + } + if (data.containsKey('sync_state')) { + context.handle( + _syncStateMeta, + syncState.isAcceptableOrUnknown(data['sync_state']!, _syncStateMeta), + ); + } else if (isInserting) { + context.missing(_syncStateMeta); + } + if (data.containsKey('local_revision')) { + context.handle( + _localRevisionMeta, + localRevision.isAcceptableOrUnknown( + data['local_revision']!, + _localRevisionMeta, + ), + ); + } else if (isInserting) { + context.missing(_localRevisionMeta); + } + if (data.containsKey('origin_device_id')) { + context.handle( + _originDeviceIdMeta, + originDeviceId.isAcceptableOrUnknown( + data['origin_device_id']!, + _originDeviceIdMeta, + ), + ); + } else if (isInserting) { + context.missing(_originDeviceIdMeta); + } + if (data.containsKey('future_owner_profile_id')) { + context.handle( + _futureOwnerProfileIdMeta, + futureOwnerProfileId.isAcceptableOrUnknown( + data['future_owner_profile_id']!, + _futureOwnerProfileIdMeta, + ), + ); + } + if (data.containsKey('last_synced_at')) { + context.handle( + _lastSyncedAtMeta, + lastSyncedAt.isAcceptableOrUnknown( + data['last_synced_at']!, + _lastSyncedAtMeta, + ), + ); + } + if (data.containsKey('remote_revision')) { + context.handle( + _remoteRevisionMeta, + remoteRevision.isAcceptableOrUnknown( + data['remote_revision']!, + _remoteRevisionMeta, + ), + ); + } + if (data.containsKey('source_workout_template_id')) { + context.handle( + _sourceWorkoutTemplateIdMeta, + sourceWorkoutTemplateId.isAcceptableOrUnknown( + data['source_workout_template_id']!, + _sourceWorkoutTemplateIdMeta, + ), + ); + } + if (data.containsKey('source_active_workout_session_id')) { + context.handle( + _sourceActiveWorkoutSessionIdMeta, + sourceActiveWorkoutSessionId.isAcceptableOrUnknown( + data['source_active_workout_session_id']!, + _sourceActiveWorkoutSessionIdMeta, + ), + ); + } + if (data.containsKey('name_snapshot')) { + context.handle( + _nameSnapshotMeta, + nameSnapshot.isAcceptableOrUnknown( + data['name_snapshot']!, + _nameSnapshotMeta, + ), + ); + } else if (isInserting) { + context.missing(_nameSnapshotMeta); + } + if (data.containsKey('started_at')) { + context.handle( + _startedAtMeta, + startedAt.isAcceptableOrUnknown(data['started_at']!, _startedAtMeta), + ); + } else if (isInserting) { + context.missing(_startedAtMeta); + } + if (data.containsKey('ended_at')) { + context.handle( + _endedAtMeta, + endedAt.isAcceptableOrUnknown(data['ended_at']!, _endedAtMeta), + ); + } else if (isInserting) { + context.missing(_endedAtMeta); + } + if (data.containsKey('total_active_ms')) { + context.handle( + _totalActiveMsMeta, + totalActiveMs.isAcceptableOrUnknown( + data['total_active_ms']!, + _totalActiveMsMeta, + ), + ); + } else if (isInserting) { + context.missing(_totalActiveMsMeta); + } + if (data.containsKey('completed')) { + context.handle( + _completedMeta, + completed.isAcceptableOrUnknown(data['completed']!, _completedMeta), + ); + } else if (isInserting) { + context.missing(_completedMeta); + } + if (data.containsKey('history_snapshot_json')) { + context.handle( + _historySnapshotJsonMeta, + historySnapshotJson.isAcceptableOrUnknown( + data['history_snapshot_json']!, + _historySnapshotJsonMeta, + ), + ); + } else if (isInserting) { + context.missing(_historySnapshotJsonMeta); + } + return context; + } + + @override + Set get $primaryKey => {id}; + @override + WorkoutHistory map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return WorkoutHistory( + id: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}id'], + )!, + createdAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}created_at'], + )!, + updatedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}updated_at'], + )!, + deletedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}deleted_at'], + ), + schemaVersion: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}schema_version'], + )!, + syncState: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}sync_state'], + )!, + localRevision: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}local_revision'], + )!, + originDeviceId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}origin_device_id'], + )!, + futureOwnerProfileId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}future_owner_profile_id'], + ), + lastSyncedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}last_synced_at'], + ), + remoteRevision: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}remote_revision'], + ), + sourceWorkoutTemplateId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}source_workout_template_id'], + ), + sourceActiveWorkoutSessionId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}source_active_workout_session_id'], + ), + nameSnapshot: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}name_snapshot'], + )!, + startedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}started_at'], + )!, + endedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}ended_at'], + )!, + totalActiveMs: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}total_active_ms'], + )!, + completed: attachedDatabase.typeMapping.read( + DriftSqlType.bool, + data['${effectivePrefix}completed'], + )!, + historySnapshotJson: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}history_snapshot_json'], + )!, + ); + } + + @override + $WorkoutHistoriesTable createAlias(String alias) { + return $WorkoutHistoriesTable(attachedDatabase, alias); + } +} + +class WorkoutHistory extends DataClass implements Insertable { + final String id; + final DateTime createdAt; + final DateTime updatedAt; + final DateTime? deletedAt; + final int schemaVersion; + final String syncState; + final int localRevision; + final String originDeviceId; + final String? futureOwnerProfileId; + final DateTime? lastSyncedAt; + final String? remoteRevision; + final String? sourceWorkoutTemplateId; + final String? sourceActiveWorkoutSessionId; + final String nameSnapshot; + final DateTime startedAt; + final DateTime endedAt; + final int totalActiveMs; + final bool completed; + final String historySnapshotJson; + const WorkoutHistory({ + required this.id, + required this.createdAt, + required this.updatedAt, + this.deletedAt, + required this.schemaVersion, + required this.syncState, + required this.localRevision, + required this.originDeviceId, + this.futureOwnerProfileId, + this.lastSyncedAt, + this.remoteRevision, + this.sourceWorkoutTemplateId, + this.sourceActiveWorkoutSessionId, + required this.nameSnapshot, + required this.startedAt, + required this.endedAt, + required this.totalActiveMs, + required this.completed, + required this.historySnapshotJson, + }); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['created_at'] = Variable(createdAt); + map['updated_at'] = Variable(updatedAt); + if (!nullToAbsent || deletedAt != null) { + map['deleted_at'] = Variable(deletedAt); + } + map['schema_version'] = Variable(schemaVersion); + map['sync_state'] = Variable(syncState); + map['local_revision'] = Variable(localRevision); + map['origin_device_id'] = Variable(originDeviceId); + if (!nullToAbsent || futureOwnerProfileId != null) { + map['future_owner_profile_id'] = Variable(futureOwnerProfileId); + } + if (!nullToAbsent || lastSyncedAt != null) { + map['last_synced_at'] = Variable(lastSyncedAt); + } + if (!nullToAbsent || remoteRevision != null) { + map['remote_revision'] = Variable(remoteRevision); + } + if (!nullToAbsent || sourceWorkoutTemplateId != null) { + map['source_workout_template_id'] = Variable( + sourceWorkoutTemplateId, + ); + } + if (!nullToAbsent || sourceActiveWorkoutSessionId != null) { + map['source_active_workout_session_id'] = Variable( + sourceActiveWorkoutSessionId, + ); + } + map['name_snapshot'] = Variable(nameSnapshot); + map['started_at'] = Variable(startedAt); + map['ended_at'] = Variable(endedAt); + map['total_active_ms'] = Variable(totalActiveMs); + map['completed'] = Variable(completed); + map['history_snapshot_json'] = Variable(historySnapshotJson); + return map; + } + + WorkoutHistoriesCompanion toCompanion(bool nullToAbsent) { + return WorkoutHistoriesCompanion( + id: Value(id), + createdAt: Value(createdAt), + updatedAt: Value(updatedAt), + deletedAt: deletedAt == null && nullToAbsent + ? const Value.absent() + : Value(deletedAt), + schemaVersion: Value(schemaVersion), + syncState: Value(syncState), + localRevision: Value(localRevision), + originDeviceId: Value(originDeviceId), + futureOwnerProfileId: futureOwnerProfileId == null && nullToAbsent + ? const Value.absent() + : Value(futureOwnerProfileId), + lastSyncedAt: lastSyncedAt == null && nullToAbsent + ? const Value.absent() + : Value(lastSyncedAt), + remoteRevision: remoteRevision == null && nullToAbsent + ? const Value.absent() + : Value(remoteRevision), + sourceWorkoutTemplateId: sourceWorkoutTemplateId == null && nullToAbsent + ? const Value.absent() + : Value(sourceWorkoutTemplateId), + sourceActiveWorkoutSessionId: + sourceActiveWorkoutSessionId == null && nullToAbsent + ? const Value.absent() + : Value(sourceActiveWorkoutSessionId), + nameSnapshot: Value(nameSnapshot), + startedAt: Value(startedAt), + endedAt: Value(endedAt), + totalActiveMs: Value(totalActiveMs), + completed: Value(completed), + historySnapshotJson: Value(historySnapshotJson), + ); + } + + factory WorkoutHistory.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return WorkoutHistory( + id: serializer.fromJson(json['id']), + createdAt: serializer.fromJson(json['createdAt']), + updatedAt: serializer.fromJson(json['updatedAt']), + deletedAt: serializer.fromJson(json['deletedAt']), + schemaVersion: serializer.fromJson(json['schemaVersion']), + syncState: serializer.fromJson(json['syncState']), + localRevision: serializer.fromJson(json['localRevision']), + originDeviceId: serializer.fromJson(json['originDeviceId']), + futureOwnerProfileId: serializer.fromJson( + json['futureOwnerProfileId'], + ), + lastSyncedAt: serializer.fromJson(json['lastSyncedAt']), + remoteRevision: serializer.fromJson(json['remoteRevision']), + sourceWorkoutTemplateId: serializer.fromJson( + json['sourceWorkoutTemplateId'], + ), + sourceActiveWorkoutSessionId: serializer.fromJson( + json['sourceActiveWorkoutSessionId'], + ), + nameSnapshot: serializer.fromJson(json['nameSnapshot']), + startedAt: serializer.fromJson(json['startedAt']), + endedAt: serializer.fromJson(json['endedAt']), + totalActiveMs: serializer.fromJson(json['totalActiveMs']), + completed: serializer.fromJson(json['completed']), + historySnapshotJson: serializer.fromJson( + json['historySnapshotJson'], + ), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'createdAt': serializer.toJson(createdAt), + 'updatedAt': serializer.toJson(updatedAt), + 'deletedAt': serializer.toJson(deletedAt), + 'schemaVersion': serializer.toJson(schemaVersion), + 'syncState': serializer.toJson(syncState), + 'localRevision': serializer.toJson(localRevision), + 'originDeviceId': serializer.toJson(originDeviceId), + 'futureOwnerProfileId': serializer.toJson(futureOwnerProfileId), + 'lastSyncedAt': serializer.toJson(lastSyncedAt), + 'remoteRevision': serializer.toJson(remoteRevision), + 'sourceWorkoutTemplateId': serializer.toJson( + sourceWorkoutTemplateId, + ), + 'sourceActiveWorkoutSessionId': serializer.toJson( + sourceActiveWorkoutSessionId, + ), + 'nameSnapshot': serializer.toJson(nameSnapshot), + 'startedAt': serializer.toJson(startedAt), + 'endedAt': serializer.toJson(endedAt), + 'totalActiveMs': serializer.toJson(totalActiveMs), + 'completed': serializer.toJson(completed), + 'historySnapshotJson': serializer.toJson(historySnapshotJson), + }; + } + + WorkoutHistory copyWith({ + String? id, + DateTime? createdAt, + DateTime? updatedAt, + Value deletedAt = const Value.absent(), + int? schemaVersion, + String? syncState, + int? localRevision, + String? originDeviceId, + Value futureOwnerProfileId = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + Value remoteRevision = const Value.absent(), + Value sourceWorkoutTemplateId = const Value.absent(), + Value sourceActiveWorkoutSessionId = const Value.absent(), + String? nameSnapshot, + DateTime? startedAt, + DateTime? endedAt, + int? totalActiveMs, + bool? completed, + String? historySnapshotJson, + }) => WorkoutHistory( + id: id ?? this.id, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt.present ? deletedAt.value : this.deletedAt, + schemaVersion: schemaVersion ?? this.schemaVersion, + syncState: syncState ?? this.syncState, + localRevision: localRevision ?? this.localRevision, + originDeviceId: originDeviceId ?? this.originDeviceId, + futureOwnerProfileId: futureOwnerProfileId.present + ? futureOwnerProfileId.value + : this.futureOwnerProfileId, + lastSyncedAt: lastSyncedAt.present ? lastSyncedAt.value : this.lastSyncedAt, + remoteRevision: remoteRevision.present + ? remoteRevision.value + : this.remoteRevision, + sourceWorkoutTemplateId: sourceWorkoutTemplateId.present + ? sourceWorkoutTemplateId.value + : this.sourceWorkoutTemplateId, + sourceActiveWorkoutSessionId: sourceActiveWorkoutSessionId.present + ? sourceActiveWorkoutSessionId.value + : this.sourceActiveWorkoutSessionId, + nameSnapshot: nameSnapshot ?? this.nameSnapshot, + startedAt: startedAt ?? this.startedAt, + endedAt: endedAt ?? this.endedAt, + totalActiveMs: totalActiveMs ?? this.totalActiveMs, + completed: completed ?? this.completed, + historySnapshotJson: historySnapshotJson ?? this.historySnapshotJson, + ); + WorkoutHistory copyWithCompanion(WorkoutHistoriesCompanion data) { + return WorkoutHistory( + id: data.id.present ? data.id.value : this.id, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + updatedAt: data.updatedAt.present ? data.updatedAt.value : this.updatedAt, + deletedAt: data.deletedAt.present ? data.deletedAt.value : this.deletedAt, + schemaVersion: data.schemaVersion.present + ? data.schemaVersion.value + : this.schemaVersion, + syncState: data.syncState.present ? data.syncState.value : this.syncState, + localRevision: data.localRevision.present + ? data.localRevision.value + : this.localRevision, + originDeviceId: data.originDeviceId.present + ? data.originDeviceId.value + : this.originDeviceId, + futureOwnerProfileId: data.futureOwnerProfileId.present + ? data.futureOwnerProfileId.value + : this.futureOwnerProfileId, + lastSyncedAt: data.lastSyncedAt.present + ? data.lastSyncedAt.value + : this.lastSyncedAt, + remoteRevision: data.remoteRevision.present + ? data.remoteRevision.value + : this.remoteRevision, + sourceWorkoutTemplateId: data.sourceWorkoutTemplateId.present + ? data.sourceWorkoutTemplateId.value + : this.sourceWorkoutTemplateId, + sourceActiveWorkoutSessionId: data.sourceActiveWorkoutSessionId.present + ? data.sourceActiveWorkoutSessionId.value + : this.sourceActiveWorkoutSessionId, + nameSnapshot: data.nameSnapshot.present + ? data.nameSnapshot.value + : this.nameSnapshot, + startedAt: data.startedAt.present ? data.startedAt.value : this.startedAt, + endedAt: data.endedAt.present ? data.endedAt.value : this.endedAt, + totalActiveMs: data.totalActiveMs.present + ? data.totalActiveMs.value + : this.totalActiveMs, + completed: data.completed.present ? data.completed.value : this.completed, + historySnapshotJson: data.historySnapshotJson.present + ? data.historySnapshotJson.value + : this.historySnapshotJson, + ); + } + + @override + String toString() { + return (StringBuffer('WorkoutHistory(') + ..write('id: $id, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('schemaVersion: $schemaVersion, ') + ..write('syncState: $syncState, ') + ..write('localRevision: $localRevision, ') + ..write('originDeviceId: $originDeviceId, ') + ..write('futureOwnerProfileId: $futureOwnerProfileId, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('remoteRevision: $remoteRevision, ') + ..write('sourceWorkoutTemplateId: $sourceWorkoutTemplateId, ') + ..write( + 'sourceActiveWorkoutSessionId: $sourceActiveWorkoutSessionId, ', + ) + ..write('nameSnapshot: $nameSnapshot, ') + ..write('startedAt: $startedAt, ') + ..write('endedAt: $endedAt, ') + ..write('totalActiveMs: $totalActiveMs, ') + ..write('completed: $completed, ') + ..write('historySnapshotJson: $historySnapshotJson') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash( + id, + createdAt, + updatedAt, + deletedAt, + schemaVersion, + syncState, + localRevision, + originDeviceId, + futureOwnerProfileId, + lastSyncedAt, + remoteRevision, + sourceWorkoutTemplateId, + sourceActiveWorkoutSessionId, + nameSnapshot, + startedAt, + endedAt, + totalActiveMs, + completed, + historySnapshotJson, + ); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is WorkoutHistory && + other.id == this.id && + other.createdAt == this.createdAt && + other.updatedAt == this.updatedAt && + other.deletedAt == this.deletedAt && + other.schemaVersion == this.schemaVersion && + other.syncState == this.syncState && + other.localRevision == this.localRevision && + other.originDeviceId == this.originDeviceId && + other.futureOwnerProfileId == this.futureOwnerProfileId && + other.lastSyncedAt == this.lastSyncedAt && + other.remoteRevision == this.remoteRevision && + other.sourceWorkoutTemplateId == this.sourceWorkoutTemplateId && + other.sourceActiveWorkoutSessionId == + this.sourceActiveWorkoutSessionId && + other.nameSnapshot == this.nameSnapshot && + other.startedAt == this.startedAt && + other.endedAt == this.endedAt && + other.totalActiveMs == this.totalActiveMs && + other.completed == this.completed && + other.historySnapshotJson == this.historySnapshotJson); +} + +class WorkoutHistoriesCompanion extends UpdateCompanion { + final Value id; + final Value createdAt; + final Value updatedAt; + final Value deletedAt; + final Value schemaVersion; + final Value syncState; + final Value localRevision; + final Value originDeviceId; + final Value futureOwnerProfileId; + final Value lastSyncedAt; + final Value remoteRevision; + final Value sourceWorkoutTemplateId; + final Value sourceActiveWorkoutSessionId; + final Value nameSnapshot; + final Value startedAt; + final Value endedAt; + final Value totalActiveMs; + final Value completed; + final Value historySnapshotJson; + final Value rowid; + const WorkoutHistoriesCompanion({ + this.id = const Value.absent(), + this.createdAt = const Value.absent(), + this.updatedAt = const Value.absent(), + this.deletedAt = const Value.absent(), + this.schemaVersion = const Value.absent(), + this.syncState = const Value.absent(), + this.localRevision = const Value.absent(), + this.originDeviceId = const Value.absent(), + this.futureOwnerProfileId = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + this.remoteRevision = const Value.absent(), + this.sourceWorkoutTemplateId = const Value.absent(), + this.sourceActiveWorkoutSessionId = const Value.absent(), + this.nameSnapshot = const Value.absent(), + this.startedAt = const Value.absent(), + this.endedAt = const Value.absent(), + this.totalActiveMs = const Value.absent(), + this.completed = const Value.absent(), + this.historySnapshotJson = const Value.absent(), + this.rowid = const Value.absent(), + }); + WorkoutHistoriesCompanion.insert({ + required String id, + required DateTime createdAt, + required DateTime updatedAt, + this.deletedAt = const Value.absent(), + this.schemaVersion = const Value.absent(), + required String syncState, + required int localRevision, + required String originDeviceId, + this.futureOwnerProfileId = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + this.remoteRevision = const Value.absent(), + this.sourceWorkoutTemplateId = const Value.absent(), + this.sourceActiveWorkoutSessionId = const Value.absent(), + required String nameSnapshot, + required DateTime startedAt, + required DateTime endedAt, + required int totalActiveMs, + required bool completed, + required String historySnapshotJson, + this.rowid = const Value.absent(), + }) : id = Value(id), + createdAt = Value(createdAt), + updatedAt = Value(updatedAt), + syncState = Value(syncState), + localRevision = Value(localRevision), + originDeviceId = Value(originDeviceId), + nameSnapshot = Value(nameSnapshot), + startedAt = Value(startedAt), + endedAt = Value(endedAt), + totalActiveMs = Value(totalActiveMs), + completed = Value(completed), + historySnapshotJson = Value(historySnapshotJson); + static Insertable custom({ + Expression? id, + Expression? createdAt, + Expression? updatedAt, + Expression? deletedAt, + Expression? schemaVersion, + Expression? syncState, + Expression? localRevision, + Expression? originDeviceId, + Expression? futureOwnerProfileId, + Expression? lastSyncedAt, + Expression? remoteRevision, + Expression? sourceWorkoutTemplateId, + Expression? sourceActiveWorkoutSessionId, + Expression? nameSnapshot, + Expression? startedAt, + Expression? endedAt, + Expression? totalActiveMs, + Expression? completed, + Expression? historySnapshotJson, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (createdAt != null) 'created_at': createdAt, + if (updatedAt != null) 'updated_at': updatedAt, + if (deletedAt != null) 'deleted_at': deletedAt, + if (schemaVersion != null) 'schema_version': schemaVersion, + if (syncState != null) 'sync_state': syncState, + if (localRevision != null) 'local_revision': localRevision, + if (originDeviceId != null) 'origin_device_id': originDeviceId, + if (futureOwnerProfileId != null) + 'future_owner_profile_id': futureOwnerProfileId, + if (lastSyncedAt != null) 'last_synced_at': lastSyncedAt, + if (remoteRevision != null) 'remote_revision': remoteRevision, + if (sourceWorkoutTemplateId != null) + 'source_workout_template_id': sourceWorkoutTemplateId, + if (sourceActiveWorkoutSessionId != null) + 'source_active_workout_session_id': sourceActiveWorkoutSessionId, + if (nameSnapshot != null) 'name_snapshot': nameSnapshot, + if (startedAt != null) 'started_at': startedAt, + if (endedAt != null) 'ended_at': endedAt, + if (totalActiveMs != null) 'total_active_ms': totalActiveMs, + if (completed != null) 'completed': completed, + if (historySnapshotJson != null) + 'history_snapshot_json': historySnapshotJson, + if (rowid != null) 'rowid': rowid, + }); + } + + WorkoutHistoriesCompanion copyWith({ + Value? id, + Value? createdAt, + Value? updatedAt, + Value? deletedAt, + Value? schemaVersion, + Value? syncState, + Value? localRevision, + Value? originDeviceId, + Value? futureOwnerProfileId, + Value? lastSyncedAt, + Value? remoteRevision, + Value? sourceWorkoutTemplateId, + Value? sourceActiveWorkoutSessionId, + Value? nameSnapshot, + Value? startedAt, + Value? endedAt, + Value? totalActiveMs, + Value? completed, + Value? historySnapshotJson, + Value? rowid, + }) { + return WorkoutHistoriesCompanion( + id: id ?? this.id, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt ?? this.deletedAt, + schemaVersion: schemaVersion ?? this.schemaVersion, + syncState: syncState ?? this.syncState, + localRevision: localRevision ?? this.localRevision, + originDeviceId: originDeviceId ?? this.originDeviceId, + futureOwnerProfileId: futureOwnerProfileId ?? this.futureOwnerProfileId, + lastSyncedAt: lastSyncedAt ?? this.lastSyncedAt, + remoteRevision: remoteRevision ?? this.remoteRevision, + sourceWorkoutTemplateId: + sourceWorkoutTemplateId ?? this.sourceWorkoutTemplateId, + sourceActiveWorkoutSessionId: + sourceActiveWorkoutSessionId ?? this.sourceActiveWorkoutSessionId, + nameSnapshot: nameSnapshot ?? this.nameSnapshot, + startedAt: startedAt ?? this.startedAt, + endedAt: endedAt ?? this.endedAt, + totalActiveMs: totalActiveMs ?? this.totalActiveMs, + completed: completed ?? this.completed, + historySnapshotJson: historySnapshotJson ?? this.historySnapshotJson, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + if (updatedAt.present) { + map['updated_at'] = Variable(updatedAt.value); + } + if (deletedAt.present) { + map['deleted_at'] = Variable(deletedAt.value); + } + if (schemaVersion.present) { + map['schema_version'] = Variable(schemaVersion.value); + } + if (syncState.present) { + map['sync_state'] = Variable(syncState.value); + } + if (localRevision.present) { + map['local_revision'] = Variable(localRevision.value); + } + if (originDeviceId.present) { + map['origin_device_id'] = Variable(originDeviceId.value); + } + if (futureOwnerProfileId.present) { + map['future_owner_profile_id'] = Variable( + futureOwnerProfileId.value, + ); + } + if (lastSyncedAt.present) { + map['last_synced_at'] = Variable(lastSyncedAt.value); + } + if (remoteRevision.present) { + map['remote_revision'] = Variable(remoteRevision.value); + } + if (sourceWorkoutTemplateId.present) { + map['source_workout_template_id'] = Variable( + sourceWorkoutTemplateId.value, + ); + } + if (sourceActiveWorkoutSessionId.present) { + map['source_active_workout_session_id'] = Variable( + sourceActiveWorkoutSessionId.value, + ); + } + if (nameSnapshot.present) { + map['name_snapshot'] = Variable(nameSnapshot.value); + } + if (startedAt.present) { + map['started_at'] = Variable(startedAt.value); + } + if (endedAt.present) { + map['ended_at'] = Variable(endedAt.value); + } + if (totalActiveMs.present) { + map['total_active_ms'] = Variable(totalActiveMs.value); + } + if (completed.present) { + map['completed'] = Variable(completed.value); + } + if (historySnapshotJson.present) { + map['history_snapshot_json'] = Variable( + historySnapshotJson.value, + ); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('WorkoutHistoriesCompanion(') + ..write('id: $id, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('schemaVersion: $schemaVersion, ') + ..write('syncState: $syncState, ') + ..write('localRevision: $localRevision, ') + ..write('originDeviceId: $originDeviceId, ') + ..write('futureOwnerProfileId: $futureOwnerProfileId, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('remoteRevision: $remoteRevision, ') + ..write('sourceWorkoutTemplateId: $sourceWorkoutTemplateId, ') + ..write( + 'sourceActiveWorkoutSessionId: $sourceActiveWorkoutSessionId, ', + ) + ..write('nameSnapshot: $nameSnapshot, ') + ..write('startedAt: $startedAt, ') + ..write('endedAt: $endedAt, ') + ..write('totalActiveMs: $totalActiveMs, ') + ..write('completed: $completed, ') + ..write('historySnapshotJson: $historySnapshotJson, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class $WorkoutHistorySetResultsTable extends WorkoutHistorySetResults + with TableInfo<$WorkoutHistorySetResultsTable, WorkoutHistorySetResult> { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + $WorkoutHistorySetResultsTable(this.attachedDatabase, [this._alias]); + static const VerificationMeta _idMeta = const VerificationMeta('id'); + @override + late final GeneratedColumn id = GeneratedColumn( + 'id', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _createdAtMeta = const VerificationMeta( + 'createdAt', + ); + @override + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + ); + static const VerificationMeta _updatedAtMeta = const VerificationMeta( + 'updatedAt', + ); + @override + late final GeneratedColumn updatedAt = GeneratedColumn( + 'updated_at', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + ); + static const VerificationMeta _deletedAtMeta = const VerificationMeta( + 'deletedAt', + ); + @override + late final GeneratedColumn deletedAt = GeneratedColumn( + 'deleted_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + static const VerificationMeta _schemaVersionMeta = const VerificationMeta( + 'schemaVersion', + ); + @override + late final GeneratedColumn schemaVersion = GeneratedColumn( + 'schema_version', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultValue: const Constant(1), + ); + static const VerificationMeta _syncStateMeta = const VerificationMeta( + 'syncState', + ); + @override + late final GeneratedColumn syncState = GeneratedColumn( + 'sync_state', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: + 'NOT NULL CHECK (sync_state IN (\'localOnly\', \'dirty\', \'synced\', \'deleted\'))', + ); + static const VerificationMeta _localRevisionMeta = const VerificationMeta( + 'localRevision', + ); + @override + late final GeneratedColumn localRevision = GeneratedColumn( + 'local_revision', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL CHECK (local_revision >= 0)', + ); + static const VerificationMeta _originDeviceIdMeta = const VerificationMeta( + 'originDeviceId', + ); + @override + late final GeneratedColumn originDeviceId = GeneratedColumn( + 'origin_device_id', + aliasedName, + false, + additionalChecks: GeneratedColumn.checkTextLength(minTextLength: 1), + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _futureOwnerProfileIdMeta = + const VerificationMeta('futureOwnerProfileId'); + @override + late final GeneratedColumn futureOwnerProfileId = + GeneratedColumn( + 'future_owner_profile_id', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _lastSyncedAtMeta = const VerificationMeta( + 'lastSyncedAt', + ); + @override + late final GeneratedColumn lastSyncedAt = GeneratedColumn( + 'last_synced_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + static const VerificationMeta _remoteRevisionMeta = const VerificationMeta( + 'remoteRevision', + ); + @override + late final GeneratedColumn remoteRevision = GeneratedColumn( + 'remote_revision', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _workoutHistoryIdMeta = const VerificationMeta( + 'workoutHistoryId', + ); + @override + late final GeneratedColumn workoutHistoryId = GeneratedColumn( + 'workout_history_id', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'REFERENCES workout_history (id)', + ), + ); + static const VerificationMeta _programSnapshotIdMeta = const VerificationMeta( + 'programSnapshotId', + ); + @override + late final GeneratedColumn programSnapshotId = + GeneratedColumn( + 'program_snapshot_id', + aliasedName, + false, + additionalChecks: GeneratedColumn.checkTextLength(minTextLength: 1), + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _exerciseSnapshotIdMeta = + const VerificationMeta('exerciseSnapshotId'); + @override + late final GeneratedColumn exerciseSnapshotId = + GeneratedColumn( + 'exercise_snapshot_id', + aliasedName, + false, + additionalChecks: GeneratedColumn.checkTextLength(minTextLength: 1), + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _programIndexMeta = const VerificationMeta( + 'programIndex', + ); + @override + late final GeneratedColumn programIndex = GeneratedColumn( + 'program_index', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + ); + static const VerificationMeta _exerciseIndexMeta = const VerificationMeta( + 'exerciseIndex', + ); + @override + late final GeneratedColumn exerciseIndex = GeneratedColumn( + 'exercise_index', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + ); + static const VerificationMeta _setIndexMeta = const VerificationMeta( + 'setIndex', + ); + @override + late final GeneratedColumn setIndex = GeneratedColumn( + 'set_index', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + ); + static const VerificationMeta _programNameSnapshotMeta = + const VerificationMeta('programNameSnapshot'); + @override + late final GeneratedColumn programNameSnapshot = + GeneratedColumn( + 'program_name_snapshot', + aliasedName, + false, + additionalChecks: GeneratedColumn.checkTextLength(minTextLength: 1), + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _exerciseNameSnapshotMeta = + const VerificationMeta('exerciseNameSnapshot'); + @override + late final GeneratedColumn exerciseNameSnapshot = + GeneratedColumn( + 'exercise_name_snapshot', + aliasedName, + false, + additionalChecks: GeneratedColumn.checkTextLength(minTextLength: 1), + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _timeEnabledSnapshotMeta = + const VerificationMeta('timeEnabledSnapshot'); + @override + late final GeneratedColumn timeEnabledSnapshot = GeneratedColumn( + 'time_enabled_snapshot', + aliasedName, + false, + type: DriftSqlType.bool, + requiredDuringInsert: true, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("time_enabled_snapshot" IN (0, 1))', + ), + ); + static const VerificationMeta _repsEnabledSnapshotMeta = + const VerificationMeta('repsEnabledSnapshot'); + @override + late final GeneratedColumn repsEnabledSnapshot = GeneratedColumn( + 'reps_enabled_snapshot', + aliasedName, + false, + type: DriftSqlType.bool, + requiredDuringInsert: true, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("reps_enabled_snapshot" IN (0, 1))', + ), + ); + static const VerificationMeta _scoreEnabledSnapshotMeta = + const VerificationMeta('scoreEnabledSnapshot'); + @override + late final GeneratedColumn scoreEnabledSnapshot = GeneratedColumn( + 'score_enabled_snapshot', + aliasedName, + false, + type: DriftSqlType.bool, + requiredDuringInsert: true, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'CHECK ("score_enabled_snapshot" IN (0, 1))', + ), + ); + static const VerificationMeta _targetTimeSecondsSnapshotMeta = + const VerificationMeta('targetTimeSecondsSnapshot'); + @override + late final GeneratedColumn targetTimeSecondsSnapshot = + GeneratedColumn( + 'target_time_seconds_snapshot', + aliasedName, + true, + type: DriftSqlType.int, + requiredDuringInsert: false, + ); + static const VerificationMeta _targetRepsSnapshotMeta = + const VerificationMeta('targetRepsSnapshot'); + @override + late final GeneratedColumn targetRepsSnapshot = GeneratedColumn( + 'target_reps_snapshot', + aliasedName, + true, + type: DriftSqlType.int, + requiredDuringInsert: false, + ); + static const VerificationMeta _targetScoreSnapshotMeta = + const VerificationMeta('targetScoreSnapshot'); + @override + late final GeneratedColumn targetScoreSnapshot = + GeneratedColumn( + 'target_score_snapshot', + aliasedName, + true, + type: DriftSqlType.double, + requiredDuringInsert: false, + ); + static const VerificationMeta _actualTimeMsMeta = const VerificationMeta( + 'actualTimeMs', + ); + @override + late final GeneratedColumn actualTimeMs = GeneratedColumn( + 'actual_time_ms', + aliasedName, + true, + type: DriftSqlType.int, + requiredDuringInsert: false, + ); + static const VerificationMeta _actualRepsMeta = const VerificationMeta( + 'actualReps', + ); + @override + late final GeneratedColumn actualReps = GeneratedColumn( + 'actual_reps', + aliasedName, + true, + type: DriftSqlType.int, + requiredDuringInsert: false, + ); + static const VerificationMeta _actualScoreMeta = const VerificationMeta( + 'actualScore', + ); + @override + late final GeneratedColumn actualScore = GeneratedColumn( + 'actual_score', + aliasedName, + true, + type: DriftSqlType.double, + requiredDuringInsert: false, + ); + static const VerificationMeta _scoreLabelSnapshotMeta = + const VerificationMeta('scoreLabelSnapshot'); + @override + late final GeneratedColumn scoreLabelSnapshot = + GeneratedColumn( + 'score_label_snapshot', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _scoreUnitSnapshotMeta = const VerificationMeta( + 'scoreUnitSnapshot', + ); + @override + late final GeneratedColumn scoreUnitSnapshot = + GeneratedColumn( + 'score_unit_snapshot', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _startedAtMeta = const VerificationMeta( + 'startedAt', + ); + @override + late final GeneratedColumn startedAt = GeneratedColumn( + 'started_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + static const VerificationMeta _completedAtMeta = const VerificationMeta( + 'completedAt', + ); + @override + late final GeneratedColumn completedAt = GeneratedColumn( + 'completed_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + @override + List get $columns => [ + id, + createdAt, + updatedAt, + deletedAt, + schemaVersion, + syncState, + localRevision, + originDeviceId, + futureOwnerProfileId, + lastSyncedAt, + remoteRevision, + workoutHistoryId, + programSnapshotId, + exerciseSnapshotId, + programIndex, + exerciseIndex, + setIndex, + programNameSnapshot, + exerciseNameSnapshot, + timeEnabledSnapshot, + repsEnabledSnapshot, + scoreEnabledSnapshot, + targetTimeSecondsSnapshot, + targetRepsSnapshot, + targetScoreSnapshot, + actualTimeMs, + actualReps, + actualScore, + scoreLabelSnapshot, + scoreUnitSnapshot, + startedAt, + completedAt, + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'workout_history_set_results'; + @override + VerificationContext validateIntegrity( + Insertable instance, { + bool isInserting = false, + }) { + final context = VerificationContext(); + final data = instance.toColumns(true); + if (data.containsKey('id')) { + context.handle(_idMeta, id.isAcceptableOrUnknown(data['id']!, _idMeta)); + } else if (isInserting) { + context.missing(_idMeta); + } + if (data.containsKey('created_at')) { + context.handle( + _createdAtMeta, + createdAt.isAcceptableOrUnknown(data['created_at']!, _createdAtMeta), + ); + } else if (isInserting) { + context.missing(_createdAtMeta); + } + if (data.containsKey('updated_at')) { + context.handle( + _updatedAtMeta, + updatedAt.isAcceptableOrUnknown(data['updated_at']!, _updatedAtMeta), + ); + } else if (isInserting) { + context.missing(_updatedAtMeta); + } + if (data.containsKey('deleted_at')) { + context.handle( + _deletedAtMeta, + deletedAt.isAcceptableOrUnknown(data['deleted_at']!, _deletedAtMeta), + ); + } + if (data.containsKey('schema_version')) { + context.handle( + _schemaVersionMeta, + schemaVersion.isAcceptableOrUnknown( + data['schema_version']!, + _schemaVersionMeta, + ), + ); + } + if (data.containsKey('sync_state')) { + context.handle( + _syncStateMeta, + syncState.isAcceptableOrUnknown(data['sync_state']!, _syncStateMeta), + ); + } else if (isInserting) { + context.missing(_syncStateMeta); + } + if (data.containsKey('local_revision')) { + context.handle( + _localRevisionMeta, + localRevision.isAcceptableOrUnknown( + data['local_revision']!, + _localRevisionMeta, + ), + ); + } else if (isInserting) { + context.missing(_localRevisionMeta); + } + if (data.containsKey('origin_device_id')) { + context.handle( + _originDeviceIdMeta, + originDeviceId.isAcceptableOrUnknown( + data['origin_device_id']!, + _originDeviceIdMeta, + ), + ); + } else if (isInserting) { + context.missing(_originDeviceIdMeta); + } + if (data.containsKey('future_owner_profile_id')) { + context.handle( + _futureOwnerProfileIdMeta, + futureOwnerProfileId.isAcceptableOrUnknown( + data['future_owner_profile_id']!, + _futureOwnerProfileIdMeta, + ), + ); + } + if (data.containsKey('last_synced_at')) { + context.handle( + _lastSyncedAtMeta, + lastSyncedAt.isAcceptableOrUnknown( + data['last_synced_at']!, + _lastSyncedAtMeta, + ), + ); + } + if (data.containsKey('remote_revision')) { + context.handle( + _remoteRevisionMeta, + remoteRevision.isAcceptableOrUnknown( + data['remote_revision']!, + _remoteRevisionMeta, + ), + ); + } + if (data.containsKey('workout_history_id')) { + context.handle( + _workoutHistoryIdMeta, + workoutHistoryId.isAcceptableOrUnknown( + data['workout_history_id']!, + _workoutHistoryIdMeta, + ), + ); + } else if (isInserting) { + context.missing(_workoutHistoryIdMeta); + } + if (data.containsKey('program_snapshot_id')) { + context.handle( + _programSnapshotIdMeta, + programSnapshotId.isAcceptableOrUnknown( + data['program_snapshot_id']!, + _programSnapshotIdMeta, + ), + ); + } else if (isInserting) { + context.missing(_programSnapshotIdMeta); + } + if (data.containsKey('exercise_snapshot_id')) { + context.handle( + _exerciseSnapshotIdMeta, + exerciseSnapshotId.isAcceptableOrUnknown( + data['exercise_snapshot_id']!, + _exerciseSnapshotIdMeta, + ), + ); + } else if (isInserting) { + context.missing(_exerciseSnapshotIdMeta); + } + if (data.containsKey('program_index')) { + context.handle( + _programIndexMeta, + programIndex.isAcceptableOrUnknown( + data['program_index']!, + _programIndexMeta, + ), + ); + } else if (isInserting) { + context.missing(_programIndexMeta); + } + if (data.containsKey('exercise_index')) { + context.handle( + _exerciseIndexMeta, + exerciseIndex.isAcceptableOrUnknown( + data['exercise_index']!, + _exerciseIndexMeta, + ), + ); + } else if (isInserting) { + context.missing(_exerciseIndexMeta); + } + if (data.containsKey('set_index')) { + context.handle( + _setIndexMeta, + setIndex.isAcceptableOrUnknown(data['set_index']!, _setIndexMeta), + ); + } else if (isInserting) { + context.missing(_setIndexMeta); + } + if (data.containsKey('program_name_snapshot')) { + context.handle( + _programNameSnapshotMeta, + programNameSnapshot.isAcceptableOrUnknown( + data['program_name_snapshot']!, + _programNameSnapshotMeta, + ), + ); + } else if (isInserting) { + context.missing(_programNameSnapshotMeta); + } + if (data.containsKey('exercise_name_snapshot')) { + context.handle( + _exerciseNameSnapshotMeta, + exerciseNameSnapshot.isAcceptableOrUnknown( + data['exercise_name_snapshot']!, + _exerciseNameSnapshotMeta, + ), + ); + } else if (isInserting) { + context.missing(_exerciseNameSnapshotMeta); + } + if (data.containsKey('time_enabled_snapshot')) { + context.handle( + _timeEnabledSnapshotMeta, + timeEnabledSnapshot.isAcceptableOrUnknown( + data['time_enabled_snapshot']!, + _timeEnabledSnapshotMeta, + ), + ); + } else if (isInserting) { + context.missing(_timeEnabledSnapshotMeta); + } + if (data.containsKey('reps_enabled_snapshot')) { + context.handle( + _repsEnabledSnapshotMeta, + repsEnabledSnapshot.isAcceptableOrUnknown( + data['reps_enabled_snapshot']!, + _repsEnabledSnapshotMeta, + ), + ); + } else if (isInserting) { + context.missing(_repsEnabledSnapshotMeta); + } + if (data.containsKey('score_enabled_snapshot')) { + context.handle( + _scoreEnabledSnapshotMeta, + scoreEnabledSnapshot.isAcceptableOrUnknown( + data['score_enabled_snapshot']!, + _scoreEnabledSnapshotMeta, + ), + ); + } else if (isInserting) { + context.missing(_scoreEnabledSnapshotMeta); + } + if (data.containsKey('target_time_seconds_snapshot')) { + context.handle( + _targetTimeSecondsSnapshotMeta, + targetTimeSecondsSnapshot.isAcceptableOrUnknown( + data['target_time_seconds_snapshot']!, + _targetTimeSecondsSnapshotMeta, + ), + ); + } + if (data.containsKey('target_reps_snapshot')) { + context.handle( + _targetRepsSnapshotMeta, + targetRepsSnapshot.isAcceptableOrUnknown( + data['target_reps_snapshot']!, + _targetRepsSnapshotMeta, + ), + ); + } + if (data.containsKey('target_score_snapshot')) { + context.handle( + _targetScoreSnapshotMeta, + targetScoreSnapshot.isAcceptableOrUnknown( + data['target_score_snapshot']!, + _targetScoreSnapshotMeta, + ), + ); + } + if (data.containsKey('actual_time_ms')) { + context.handle( + _actualTimeMsMeta, + actualTimeMs.isAcceptableOrUnknown( + data['actual_time_ms']!, + _actualTimeMsMeta, + ), + ); + } + if (data.containsKey('actual_reps')) { + context.handle( + _actualRepsMeta, + actualReps.isAcceptableOrUnknown(data['actual_reps']!, _actualRepsMeta), + ); + } + if (data.containsKey('actual_score')) { + context.handle( + _actualScoreMeta, + actualScore.isAcceptableOrUnknown( + data['actual_score']!, + _actualScoreMeta, + ), + ); + } + if (data.containsKey('score_label_snapshot')) { + context.handle( + _scoreLabelSnapshotMeta, + scoreLabelSnapshot.isAcceptableOrUnknown( + data['score_label_snapshot']!, + _scoreLabelSnapshotMeta, + ), + ); + } + if (data.containsKey('score_unit_snapshot')) { + context.handle( + _scoreUnitSnapshotMeta, + scoreUnitSnapshot.isAcceptableOrUnknown( + data['score_unit_snapshot']!, + _scoreUnitSnapshotMeta, + ), + ); + } + if (data.containsKey('started_at')) { + context.handle( + _startedAtMeta, + startedAt.isAcceptableOrUnknown(data['started_at']!, _startedAtMeta), + ); + } + if (data.containsKey('completed_at')) { + context.handle( + _completedAtMeta, + completedAt.isAcceptableOrUnknown( + data['completed_at']!, + _completedAtMeta, + ), + ); + } + return context; + } + + @override + Set get $primaryKey => {id}; + @override + WorkoutHistorySetResult map( + Map data, { + String? tablePrefix, + }) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return WorkoutHistorySetResult( + id: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}id'], + )!, + createdAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}created_at'], + )!, + updatedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}updated_at'], + )!, + deletedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}deleted_at'], + ), + schemaVersion: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}schema_version'], + )!, + syncState: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}sync_state'], + )!, + localRevision: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}local_revision'], + )!, + originDeviceId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}origin_device_id'], + )!, + futureOwnerProfileId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}future_owner_profile_id'], + ), + lastSyncedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}last_synced_at'], + ), + remoteRevision: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}remote_revision'], + ), + workoutHistoryId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}workout_history_id'], + )!, + programSnapshotId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}program_snapshot_id'], + )!, + exerciseSnapshotId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}exercise_snapshot_id'], + )!, + programIndex: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}program_index'], + )!, + exerciseIndex: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}exercise_index'], + )!, + setIndex: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}set_index'], + )!, + programNameSnapshot: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}program_name_snapshot'], + )!, + exerciseNameSnapshot: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}exercise_name_snapshot'], + )!, + timeEnabledSnapshot: attachedDatabase.typeMapping.read( + DriftSqlType.bool, + data['${effectivePrefix}time_enabled_snapshot'], + )!, + repsEnabledSnapshot: attachedDatabase.typeMapping.read( + DriftSqlType.bool, + data['${effectivePrefix}reps_enabled_snapshot'], + )!, + scoreEnabledSnapshot: attachedDatabase.typeMapping.read( + DriftSqlType.bool, + data['${effectivePrefix}score_enabled_snapshot'], + )!, + targetTimeSecondsSnapshot: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}target_time_seconds_snapshot'], + ), + targetRepsSnapshot: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}target_reps_snapshot'], + ), + targetScoreSnapshot: attachedDatabase.typeMapping.read( + DriftSqlType.double, + data['${effectivePrefix}target_score_snapshot'], + ), + actualTimeMs: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}actual_time_ms'], + ), + actualReps: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}actual_reps'], + ), + actualScore: attachedDatabase.typeMapping.read( + DriftSqlType.double, + data['${effectivePrefix}actual_score'], + ), + scoreLabelSnapshot: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}score_label_snapshot'], + ), + scoreUnitSnapshot: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}score_unit_snapshot'], + ), + startedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}started_at'], + ), + completedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}completed_at'], + ), + ); + } + + @override + $WorkoutHistorySetResultsTable createAlias(String alias) { + return $WorkoutHistorySetResultsTable(attachedDatabase, alias); + } +} + +class WorkoutHistorySetResult extends DataClass + implements Insertable { + final String id; + final DateTime createdAt; + final DateTime updatedAt; + final DateTime? deletedAt; + final int schemaVersion; + final String syncState; + final int localRevision; + final String originDeviceId; + final String? futureOwnerProfileId; + final DateTime? lastSyncedAt; + final String? remoteRevision; + final String workoutHistoryId; + final String programSnapshotId; + final String exerciseSnapshotId; + final int programIndex; + final int exerciseIndex; + final int setIndex; + final String programNameSnapshot; + final String exerciseNameSnapshot; + final bool timeEnabledSnapshot; + final bool repsEnabledSnapshot; + final bool scoreEnabledSnapshot; + final int? targetTimeSecondsSnapshot; + final int? targetRepsSnapshot; + final double? targetScoreSnapshot; + final int? actualTimeMs; + final int? actualReps; + final double? actualScore; + final String? scoreLabelSnapshot; + final String? scoreUnitSnapshot; + final DateTime? startedAt; + final DateTime? completedAt; + const WorkoutHistorySetResult({ + required this.id, + required this.createdAt, + required this.updatedAt, + this.deletedAt, + required this.schemaVersion, + required this.syncState, + required this.localRevision, + required this.originDeviceId, + this.futureOwnerProfileId, + this.lastSyncedAt, + this.remoteRevision, + required this.workoutHistoryId, + required this.programSnapshotId, + required this.exerciseSnapshotId, + required this.programIndex, + required this.exerciseIndex, + required this.setIndex, + required this.programNameSnapshot, + required this.exerciseNameSnapshot, + required this.timeEnabledSnapshot, + required this.repsEnabledSnapshot, + required this.scoreEnabledSnapshot, + this.targetTimeSecondsSnapshot, + this.targetRepsSnapshot, + this.targetScoreSnapshot, + this.actualTimeMs, + this.actualReps, + this.actualScore, + this.scoreLabelSnapshot, + this.scoreUnitSnapshot, + this.startedAt, + this.completedAt, + }); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['created_at'] = Variable(createdAt); + map['updated_at'] = Variable(updatedAt); + if (!nullToAbsent || deletedAt != null) { + map['deleted_at'] = Variable(deletedAt); + } + map['schema_version'] = Variable(schemaVersion); + map['sync_state'] = Variable(syncState); + map['local_revision'] = Variable(localRevision); + map['origin_device_id'] = Variable(originDeviceId); + if (!nullToAbsent || futureOwnerProfileId != null) { + map['future_owner_profile_id'] = Variable(futureOwnerProfileId); + } + if (!nullToAbsent || lastSyncedAt != null) { + map['last_synced_at'] = Variable(lastSyncedAt); + } + if (!nullToAbsent || remoteRevision != null) { + map['remote_revision'] = Variable(remoteRevision); + } + map['workout_history_id'] = Variable(workoutHistoryId); + map['program_snapshot_id'] = Variable(programSnapshotId); + map['exercise_snapshot_id'] = Variable(exerciseSnapshotId); + map['program_index'] = Variable(programIndex); + map['exercise_index'] = Variable(exerciseIndex); + map['set_index'] = Variable(setIndex); + map['program_name_snapshot'] = Variable(programNameSnapshot); + map['exercise_name_snapshot'] = Variable(exerciseNameSnapshot); + map['time_enabled_snapshot'] = Variable(timeEnabledSnapshot); + map['reps_enabled_snapshot'] = Variable(repsEnabledSnapshot); + map['score_enabled_snapshot'] = Variable(scoreEnabledSnapshot); + if (!nullToAbsent || targetTimeSecondsSnapshot != null) { + map['target_time_seconds_snapshot'] = Variable( + targetTimeSecondsSnapshot, + ); + } + if (!nullToAbsent || targetRepsSnapshot != null) { + map['target_reps_snapshot'] = Variable(targetRepsSnapshot); + } + if (!nullToAbsent || targetScoreSnapshot != null) { + map['target_score_snapshot'] = Variable(targetScoreSnapshot); + } + if (!nullToAbsent || actualTimeMs != null) { + map['actual_time_ms'] = Variable(actualTimeMs); + } + if (!nullToAbsent || actualReps != null) { + map['actual_reps'] = Variable(actualReps); + } + if (!nullToAbsent || actualScore != null) { + map['actual_score'] = Variable(actualScore); + } + if (!nullToAbsent || scoreLabelSnapshot != null) { + map['score_label_snapshot'] = Variable(scoreLabelSnapshot); + } + if (!nullToAbsent || scoreUnitSnapshot != null) { + map['score_unit_snapshot'] = Variable(scoreUnitSnapshot); + } + if (!nullToAbsent || startedAt != null) { + map['started_at'] = Variable(startedAt); + } + if (!nullToAbsent || completedAt != null) { + map['completed_at'] = Variable(completedAt); + } + return map; + } + + WorkoutHistorySetResultsCompanion toCompanion(bool nullToAbsent) { + return WorkoutHistorySetResultsCompanion( + id: Value(id), + createdAt: Value(createdAt), + updatedAt: Value(updatedAt), + deletedAt: deletedAt == null && nullToAbsent + ? const Value.absent() + : Value(deletedAt), + schemaVersion: Value(schemaVersion), + syncState: Value(syncState), + localRevision: Value(localRevision), + originDeviceId: Value(originDeviceId), + futureOwnerProfileId: futureOwnerProfileId == null && nullToAbsent + ? const Value.absent() + : Value(futureOwnerProfileId), + lastSyncedAt: lastSyncedAt == null && nullToAbsent + ? const Value.absent() + : Value(lastSyncedAt), + remoteRevision: remoteRevision == null && nullToAbsent + ? const Value.absent() + : Value(remoteRevision), + workoutHistoryId: Value(workoutHistoryId), + programSnapshotId: Value(programSnapshotId), + exerciseSnapshotId: Value(exerciseSnapshotId), + programIndex: Value(programIndex), + exerciseIndex: Value(exerciseIndex), + setIndex: Value(setIndex), + programNameSnapshot: Value(programNameSnapshot), + exerciseNameSnapshot: Value(exerciseNameSnapshot), + timeEnabledSnapshot: Value(timeEnabledSnapshot), + repsEnabledSnapshot: Value(repsEnabledSnapshot), + scoreEnabledSnapshot: Value(scoreEnabledSnapshot), + targetTimeSecondsSnapshot: + targetTimeSecondsSnapshot == null && nullToAbsent + ? const Value.absent() + : Value(targetTimeSecondsSnapshot), + targetRepsSnapshot: targetRepsSnapshot == null && nullToAbsent + ? const Value.absent() + : Value(targetRepsSnapshot), + targetScoreSnapshot: targetScoreSnapshot == null && nullToAbsent + ? const Value.absent() + : Value(targetScoreSnapshot), + actualTimeMs: actualTimeMs == null && nullToAbsent + ? const Value.absent() + : Value(actualTimeMs), + actualReps: actualReps == null && nullToAbsent + ? const Value.absent() + : Value(actualReps), + actualScore: actualScore == null && nullToAbsent + ? const Value.absent() + : Value(actualScore), + scoreLabelSnapshot: scoreLabelSnapshot == null && nullToAbsent + ? const Value.absent() + : Value(scoreLabelSnapshot), + scoreUnitSnapshot: scoreUnitSnapshot == null && nullToAbsent + ? const Value.absent() + : Value(scoreUnitSnapshot), + startedAt: startedAt == null && nullToAbsent + ? const Value.absent() + : Value(startedAt), + completedAt: completedAt == null && nullToAbsent + ? const Value.absent() + : Value(completedAt), + ); + } + + factory WorkoutHistorySetResult.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return WorkoutHistorySetResult( + id: serializer.fromJson(json['id']), + createdAt: serializer.fromJson(json['createdAt']), + updatedAt: serializer.fromJson(json['updatedAt']), + deletedAt: serializer.fromJson(json['deletedAt']), + schemaVersion: serializer.fromJson(json['schemaVersion']), + syncState: serializer.fromJson(json['syncState']), + localRevision: serializer.fromJson(json['localRevision']), + originDeviceId: serializer.fromJson(json['originDeviceId']), + futureOwnerProfileId: serializer.fromJson( + json['futureOwnerProfileId'], + ), + lastSyncedAt: serializer.fromJson(json['lastSyncedAt']), + remoteRevision: serializer.fromJson(json['remoteRevision']), + workoutHistoryId: serializer.fromJson(json['workoutHistoryId']), + programSnapshotId: serializer.fromJson(json['programSnapshotId']), + exerciseSnapshotId: serializer.fromJson( + json['exerciseSnapshotId'], + ), + programIndex: serializer.fromJson(json['programIndex']), + exerciseIndex: serializer.fromJson(json['exerciseIndex']), + setIndex: serializer.fromJson(json['setIndex']), + programNameSnapshot: serializer.fromJson( + json['programNameSnapshot'], + ), + exerciseNameSnapshot: serializer.fromJson( + json['exerciseNameSnapshot'], + ), + timeEnabledSnapshot: serializer.fromJson( + json['timeEnabledSnapshot'], + ), + repsEnabledSnapshot: serializer.fromJson( + json['repsEnabledSnapshot'], + ), + scoreEnabledSnapshot: serializer.fromJson( + json['scoreEnabledSnapshot'], + ), + targetTimeSecondsSnapshot: serializer.fromJson( + json['targetTimeSecondsSnapshot'], + ), + targetRepsSnapshot: serializer.fromJson(json['targetRepsSnapshot']), + targetScoreSnapshot: serializer.fromJson( + json['targetScoreSnapshot'], + ), + actualTimeMs: serializer.fromJson(json['actualTimeMs']), + actualReps: serializer.fromJson(json['actualReps']), + actualScore: serializer.fromJson(json['actualScore']), + scoreLabelSnapshot: serializer.fromJson( + json['scoreLabelSnapshot'], + ), + scoreUnitSnapshot: serializer.fromJson( + json['scoreUnitSnapshot'], + ), + startedAt: serializer.fromJson(json['startedAt']), + completedAt: serializer.fromJson(json['completedAt']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'createdAt': serializer.toJson(createdAt), + 'updatedAt': serializer.toJson(updatedAt), + 'deletedAt': serializer.toJson(deletedAt), + 'schemaVersion': serializer.toJson(schemaVersion), + 'syncState': serializer.toJson(syncState), + 'localRevision': serializer.toJson(localRevision), + 'originDeviceId': serializer.toJson(originDeviceId), + 'futureOwnerProfileId': serializer.toJson(futureOwnerProfileId), + 'lastSyncedAt': serializer.toJson(lastSyncedAt), + 'remoteRevision': serializer.toJson(remoteRevision), + 'workoutHistoryId': serializer.toJson(workoutHistoryId), + 'programSnapshotId': serializer.toJson(programSnapshotId), + 'exerciseSnapshotId': serializer.toJson(exerciseSnapshotId), + 'programIndex': serializer.toJson(programIndex), + 'exerciseIndex': serializer.toJson(exerciseIndex), + 'setIndex': serializer.toJson(setIndex), + 'programNameSnapshot': serializer.toJson(programNameSnapshot), + 'exerciseNameSnapshot': serializer.toJson(exerciseNameSnapshot), + 'timeEnabledSnapshot': serializer.toJson(timeEnabledSnapshot), + 'repsEnabledSnapshot': serializer.toJson(repsEnabledSnapshot), + 'scoreEnabledSnapshot': serializer.toJson(scoreEnabledSnapshot), + 'targetTimeSecondsSnapshot': serializer.toJson( + targetTimeSecondsSnapshot, + ), + 'targetRepsSnapshot': serializer.toJson(targetRepsSnapshot), + 'targetScoreSnapshot': serializer.toJson(targetScoreSnapshot), + 'actualTimeMs': serializer.toJson(actualTimeMs), + 'actualReps': serializer.toJson(actualReps), + 'actualScore': serializer.toJson(actualScore), + 'scoreLabelSnapshot': serializer.toJson(scoreLabelSnapshot), + 'scoreUnitSnapshot': serializer.toJson(scoreUnitSnapshot), + 'startedAt': serializer.toJson(startedAt), + 'completedAt': serializer.toJson(completedAt), + }; + } + + WorkoutHistorySetResult copyWith({ + String? id, + DateTime? createdAt, + DateTime? updatedAt, + Value deletedAt = const Value.absent(), + int? schemaVersion, + String? syncState, + int? localRevision, + String? originDeviceId, + Value futureOwnerProfileId = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + Value remoteRevision = const Value.absent(), + String? workoutHistoryId, + String? programSnapshotId, + String? exerciseSnapshotId, + int? programIndex, + int? exerciseIndex, + int? setIndex, + String? programNameSnapshot, + String? exerciseNameSnapshot, + bool? timeEnabledSnapshot, + bool? repsEnabledSnapshot, + bool? scoreEnabledSnapshot, + Value targetTimeSecondsSnapshot = const Value.absent(), + Value targetRepsSnapshot = const Value.absent(), + Value targetScoreSnapshot = const Value.absent(), + Value actualTimeMs = const Value.absent(), + Value actualReps = const Value.absent(), + Value actualScore = const Value.absent(), + Value scoreLabelSnapshot = const Value.absent(), + Value scoreUnitSnapshot = const Value.absent(), + Value startedAt = const Value.absent(), + Value completedAt = const Value.absent(), + }) => WorkoutHistorySetResult( + id: id ?? this.id, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt.present ? deletedAt.value : this.deletedAt, + schemaVersion: schemaVersion ?? this.schemaVersion, + syncState: syncState ?? this.syncState, + localRevision: localRevision ?? this.localRevision, + originDeviceId: originDeviceId ?? this.originDeviceId, + futureOwnerProfileId: futureOwnerProfileId.present + ? futureOwnerProfileId.value + : this.futureOwnerProfileId, + lastSyncedAt: lastSyncedAt.present ? lastSyncedAt.value : this.lastSyncedAt, + remoteRevision: remoteRevision.present + ? remoteRevision.value + : this.remoteRevision, + workoutHistoryId: workoutHistoryId ?? this.workoutHistoryId, + programSnapshotId: programSnapshotId ?? this.programSnapshotId, + exerciseSnapshotId: exerciseSnapshotId ?? this.exerciseSnapshotId, + programIndex: programIndex ?? this.programIndex, + exerciseIndex: exerciseIndex ?? this.exerciseIndex, + setIndex: setIndex ?? this.setIndex, + programNameSnapshot: programNameSnapshot ?? this.programNameSnapshot, + exerciseNameSnapshot: exerciseNameSnapshot ?? this.exerciseNameSnapshot, + timeEnabledSnapshot: timeEnabledSnapshot ?? this.timeEnabledSnapshot, + repsEnabledSnapshot: repsEnabledSnapshot ?? this.repsEnabledSnapshot, + scoreEnabledSnapshot: scoreEnabledSnapshot ?? this.scoreEnabledSnapshot, + targetTimeSecondsSnapshot: targetTimeSecondsSnapshot.present + ? targetTimeSecondsSnapshot.value + : this.targetTimeSecondsSnapshot, + targetRepsSnapshot: targetRepsSnapshot.present + ? targetRepsSnapshot.value + : this.targetRepsSnapshot, + targetScoreSnapshot: targetScoreSnapshot.present + ? targetScoreSnapshot.value + : this.targetScoreSnapshot, + actualTimeMs: actualTimeMs.present ? actualTimeMs.value : this.actualTimeMs, + actualReps: actualReps.present ? actualReps.value : this.actualReps, + actualScore: actualScore.present ? actualScore.value : this.actualScore, + scoreLabelSnapshot: scoreLabelSnapshot.present + ? scoreLabelSnapshot.value + : this.scoreLabelSnapshot, + scoreUnitSnapshot: scoreUnitSnapshot.present + ? scoreUnitSnapshot.value + : this.scoreUnitSnapshot, + startedAt: startedAt.present ? startedAt.value : this.startedAt, + completedAt: completedAt.present ? completedAt.value : this.completedAt, + ); + WorkoutHistorySetResult copyWithCompanion( + WorkoutHistorySetResultsCompanion data, + ) { + return WorkoutHistorySetResult( + id: data.id.present ? data.id.value : this.id, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + updatedAt: data.updatedAt.present ? data.updatedAt.value : this.updatedAt, + deletedAt: data.deletedAt.present ? data.deletedAt.value : this.deletedAt, + schemaVersion: data.schemaVersion.present + ? data.schemaVersion.value + : this.schemaVersion, + syncState: data.syncState.present ? data.syncState.value : this.syncState, + localRevision: data.localRevision.present + ? data.localRevision.value + : this.localRevision, + originDeviceId: data.originDeviceId.present + ? data.originDeviceId.value + : this.originDeviceId, + futureOwnerProfileId: data.futureOwnerProfileId.present + ? data.futureOwnerProfileId.value + : this.futureOwnerProfileId, + lastSyncedAt: data.lastSyncedAt.present + ? data.lastSyncedAt.value + : this.lastSyncedAt, + remoteRevision: data.remoteRevision.present + ? data.remoteRevision.value + : this.remoteRevision, + workoutHistoryId: data.workoutHistoryId.present + ? data.workoutHistoryId.value + : this.workoutHistoryId, + programSnapshotId: data.programSnapshotId.present + ? data.programSnapshotId.value + : this.programSnapshotId, + exerciseSnapshotId: data.exerciseSnapshotId.present + ? data.exerciseSnapshotId.value + : this.exerciseSnapshotId, + programIndex: data.programIndex.present + ? data.programIndex.value + : this.programIndex, + exerciseIndex: data.exerciseIndex.present + ? data.exerciseIndex.value + : this.exerciseIndex, + setIndex: data.setIndex.present ? data.setIndex.value : this.setIndex, + programNameSnapshot: data.programNameSnapshot.present + ? data.programNameSnapshot.value + : this.programNameSnapshot, + exerciseNameSnapshot: data.exerciseNameSnapshot.present + ? data.exerciseNameSnapshot.value + : this.exerciseNameSnapshot, + timeEnabledSnapshot: data.timeEnabledSnapshot.present + ? data.timeEnabledSnapshot.value + : this.timeEnabledSnapshot, + repsEnabledSnapshot: data.repsEnabledSnapshot.present + ? data.repsEnabledSnapshot.value + : this.repsEnabledSnapshot, + scoreEnabledSnapshot: data.scoreEnabledSnapshot.present + ? data.scoreEnabledSnapshot.value + : this.scoreEnabledSnapshot, + targetTimeSecondsSnapshot: data.targetTimeSecondsSnapshot.present + ? data.targetTimeSecondsSnapshot.value + : this.targetTimeSecondsSnapshot, + targetRepsSnapshot: data.targetRepsSnapshot.present + ? data.targetRepsSnapshot.value + : this.targetRepsSnapshot, + targetScoreSnapshot: data.targetScoreSnapshot.present + ? data.targetScoreSnapshot.value + : this.targetScoreSnapshot, + actualTimeMs: data.actualTimeMs.present + ? data.actualTimeMs.value + : this.actualTimeMs, + actualReps: data.actualReps.present + ? data.actualReps.value + : this.actualReps, + actualScore: data.actualScore.present + ? data.actualScore.value + : this.actualScore, + scoreLabelSnapshot: data.scoreLabelSnapshot.present + ? data.scoreLabelSnapshot.value + : this.scoreLabelSnapshot, + scoreUnitSnapshot: data.scoreUnitSnapshot.present + ? data.scoreUnitSnapshot.value + : this.scoreUnitSnapshot, + startedAt: data.startedAt.present ? data.startedAt.value : this.startedAt, + completedAt: data.completedAt.present + ? data.completedAt.value + : this.completedAt, + ); + } + + @override + String toString() { + return (StringBuffer('WorkoutHistorySetResult(') + ..write('id: $id, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('schemaVersion: $schemaVersion, ') + ..write('syncState: $syncState, ') + ..write('localRevision: $localRevision, ') + ..write('originDeviceId: $originDeviceId, ') + ..write('futureOwnerProfileId: $futureOwnerProfileId, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('remoteRevision: $remoteRevision, ') + ..write('workoutHistoryId: $workoutHistoryId, ') + ..write('programSnapshotId: $programSnapshotId, ') + ..write('exerciseSnapshotId: $exerciseSnapshotId, ') + ..write('programIndex: $programIndex, ') + ..write('exerciseIndex: $exerciseIndex, ') + ..write('setIndex: $setIndex, ') + ..write('programNameSnapshot: $programNameSnapshot, ') + ..write('exerciseNameSnapshot: $exerciseNameSnapshot, ') + ..write('timeEnabledSnapshot: $timeEnabledSnapshot, ') + ..write('repsEnabledSnapshot: $repsEnabledSnapshot, ') + ..write('scoreEnabledSnapshot: $scoreEnabledSnapshot, ') + ..write('targetTimeSecondsSnapshot: $targetTimeSecondsSnapshot, ') + ..write('targetRepsSnapshot: $targetRepsSnapshot, ') + ..write('targetScoreSnapshot: $targetScoreSnapshot, ') + ..write('actualTimeMs: $actualTimeMs, ') + ..write('actualReps: $actualReps, ') + ..write('actualScore: $actualScore, ') + ..write('scoreLabelSnapshot: $scoreLabelSnapshot, ') + ..write('scoreUnitSnapshot: $scoreUnitSnapshot, ') + ..write('startedAt: $startedAt, ') + ..write('completedAt: $completedAt') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hashAll([ + id, + createdAt, + updatedAt, + deletedAt, + schemaVersion, + syncState, + localRevision, + originDeviceId, + futureOwnerProfileId, + lastSyncedAt, + remoteRevision, + workoutHistoryId, + programSnapshotId, + exerciseSnapshotId, + programIndex, + exerciseIndex, + setIndex, + programNameSnapshot, + exerciseNameSnapshot, + timeEnabledSnapshot, + repsEnabledSnapshot, + scoreEnabledSnapshot, + targetTimeSecondsSnapshot, + targetRepsSnapshot, + targetScoreSnapshot, + actualTimeMs, + actualReps, + actualScore, + scoreLabelSnapshot, + scoreUnitSnapshot, + startedAt, + completedAt, + ]); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is WorkoutHistorySetResult && + other.id == this.id && + other.createdAt == this.createdAt && + other.updatedAt == this.updatedAt && + other.deletedAt == this.deletedAt && + other.schemaVersion == this.schemaVersion && + other.syncState == this.syncState && + other.localRevision == this.localRevision && + other.originDeviceId == this.originDeviceId && + other.futureOwnerProfileId == this.futureOwnerProfileId && + other.lastSyncedAt == this.lastSyncedAt && + other.remoteRevision == this.remoteRevision && + other.workoutHistoryId == this.workoutHistoryId && + other.programSnapshotId == this.programSnapshotId && + other.exerciseSnapshotId == this.exerciseSnapshotId && + other.programIndex == this.programIndex && + other.exerciseIndex == this.exerciseIndex && + other.setIndex == this.setIndex && + other.programNameSnapshot == this.programNameSnapshot && + other.exerciseNameSnapshot == this.exerciseNameSnapshot && + other.timeEnabledSnapshot == this.timeEnabledSnapshot && + other.repsEnabledSnapshot == this.repsEnabledSnapshot && + other.scoreEnabledSnapshot == this.scoreEnabledSnapshot && + other.targetTimeSecondsSnapshot == this.targetTimeSecondsSnapshot && + other.targetRepsSnapshot == this.targetRepsSnapshot && + other.targetScoreSnapshot == this.targetScoreSnapshot && + other.actualTimeMs == this.actualTimeMs && + other.actualReps == this.actualReps && + other.actualScore == this.actualScore && + other.scoreLabelSnapshot == this.scoreLabelSnapshot && + other.scoreUnitSnapshot == this.scoreUnitSnapshot && + other.startedAt == this.startedAt && + other.completedAt == this.completedAt); +} + +class WorkoutHistorySetResultsCompanion + extends UpdateCompanion { + final Value id; + final Value createdAt; + final Value updatedAt; + final Value deletedAt; + final Value schemaVersion; + final Value syncState; + final Value localRevision; + final Value originDeviceId; + final Value futureOwnerProfileId; + final Value lastSyncedAt; + final Value remoteRevision; + final Value workoutHistoryId; + final Value programSnapshotId; + final Value exerciseSnapshotId; + final Value programIndex; + final Value exerciseIndex; + final Value setIndex; + final Value programNameSnapshot; + final Value exerciseNameSnapshot; + final Value timeEnabledSnapshot; + final Value repsEnabledSnapshot; + final Value scoreEnabledSnapshot; + final Value targetTimeSecondsSnapshot; + final Value targetRepsSnapshot; + final Value targetScoreSnapshot; + final Value actualTimeMs; + final Value actualReps; + final Value actualScore; + final Value scoreLabelSnapshot; + final Value scoreUnitSnapshot; + final Value startedAt; + final Value completedAt; + final Value rowid; + const WorkoutHistorySetResultsCompanion({ + this.id = const Value.absent(), + this.createdAt = const Value.absent(), + this.updatedAt = const Value.absent(), + this.deletedAt = const Value.absent(), + this.schemaVersion = const Value.absent(), + this.syncState = const Value.absent(), + this.localRevision = const Value.absent(), + this.originDeviceId = const Value.absent(), + this.futureOwnerProfileId = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + this.remoteRevision = const Value.absent(), + this.workoutHistoryId = const Value.absent(), + this.programSnapshotId = const Value.absent(), + this.exerciseSnapshotId = const Value.absent(), + this.programIndex = const Value.absent(), + this.exerciseIndex = const Value.absent(), + this.setIndex = const Value.absent(), + this.programNameSnapshot = const Value.absent(), + this.exerciseNameSnapshot = const Value.absent(), + this.timeEnabledSnapshot = const Value.absent(), + this.repsEnabledSnapshot = const Value.absent(), + this.scoreEnabledSnapshot = const Value.absent(), + this.targetTimeSecondsSnapshot = const Value.absent(), + this.targetRepsSnapshot = const Value.absent(), + this.targetScoreSnapshot = const Value.absent(), + this.actualTimeMs = const Value.absent(), + this.actualReps = const Value.absent(), + this.actualScore = const Value.absent(), + this.scoreLabelSnapshot = const Value.absent(), + this.scoreUnitSnapshot = const Value.absent(), + this.startedAt = const Value.absent(), + this.completedAt = const Value.absent(), + this.rowid = const Value.absent(), + }); + WorkoutHistorySetResultsCompanion.insert({ + required String id, + required DateTime createdAt, + required DateTime updatedAt, + this.deletedAt = const Value.absent(), + this.schemaVersion = const Value.absent(), + required String syncState, + required int localRevision, + required String originDeviceId, + this.futureOwnerProfileId = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + this.remoteRevision = const Value.absent(), + required String workoutHistoryId, + required String programSnapshotId, + required String exerciseSnapshotId, + required int programIndex, + required int exerciseIndex, + required int setIndex, + required String programNameSnapshot, + required String exerciseNameSnapshot, + required bool timeEnabledSnapshot, + required bool repsEnabledSnapshot, + required bool scoreEnabledSnapshot, + this.targetTimeSecondsSnapshot = const Value.absent(), + this.targetRepsSnapshot = const Value.absent(), + this.targetScoreSnapshot = const Value.absent(), + this.actualTimeMs = const Value.absent(), + this.actualReps = const Value.absent(), + this.actualScore = const Value.absent(), + this.scoreLabelSnapshot = const Value.absent(), + this.scoreUnitSnapshot = const Value.absent(), + this.startedAt = const Value.absent(), + this.completedAt = const Value.absent(), + this.rowid = const Value.absent(), + }) : id = Value(id), + createdAt = Value(createdAt), + updatedAt = Value(updatedAt), + syncState = Value(syncState), + localRevision = Value(localRevision), + originDeviceId = Value(originDeviceId), + workoutHistoryId = Value(workoutHistoryId), + programSnapshotId = Value(programSnapshotId), + exerciseSnapshotId = Value(exerciseSnapshotId), + programIndex = Value(programIndex), + exerciseIndex = Value(exerciseIndex), + setIndex = Value(setIndex), + programNameSnapshot = Value(programNameSnapshot), + exerciseNameSnapshot = Value(exerciseNameSnapshot), + timeEnabledSnapshot = Value(timeEnabledSnapshot), + repsEnabledSnapshot = Value(repsEnabledSnapshot), + scoreEnabledSnapshot = Value(scoreEnabledSnapshot); + static Insertable custom({ + Expression? id, + Expression? createdAt, + Expression? updatedAt, + Expression? deletedAt, + Expression? schemaVersion, + Expression? syncState, + Expression? localRevision, + Expression? originDeviceId, + Expression? futureOwnerProfileId, + Expression? lastSyncedAt, + Expression? remoteRevision, + Expression? workoutHistoryId, + Expression? programSnapshotId, + Expression? exerciseSnapshotId, + Expression? programIndex, + Expression? exerciseIndex, + Expression? setIndex, + Expression? programNameSnapshot, + Expression? exerciseNameSnapshot, + Expression? timeEnabledSnapshot, + Expression? repsEnabledSnapshot, + Expression? scoreEnabledSnapshot, + Expression? targetTimeSecondsSnapshot, + Expression? targetRepsSnapshot, + Expression? targetScoreSnapshot, + Expression? actualTimeMs, + Expression? actualReps, + Expression? actualScore, + Expression? scoreLabelSnapshot, + Expression? scoreUnitSnapshot, + Expression? startedAt, + Expression? completedAt, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (createdAt != null) 'created_at': createdAt, + if (updatedAt != null) 'updated_at': updatedAt, + if (deletedAt != null) 'deleted_at': deletedAt, + if (schemaVersion != null) 'schema_version': schemaVersion, + if (syncState != null) 'sync_state': syncState, + if (localRevision != null) 'local_revision': localRevision, + if (originDeviceId != null) 'origin_device_id': originDeviceId, + if (futureOwnerProfileId != null) + 'future_owner_profile_id': futureOwnerProfileId, + if (lastSyncedAt != null) 'last_synced_at': lastSyncedAt, + if (remoteRevision != null) 'remote_revision': remoteRevision, + if (workoutHistoryId != null) 'workout_history_id': workoutHistoryId, + if (programSnapshotId != null) 'program_snapshot_id': programSnapshotId, + if (exerciseSnapshotId != null) + 'exercise_snapshot_id': exerciseSnapshotId, + if (programIndex != null) 'program_index': programIndex, + if (exerciseIndex != null) 'exercise_index': exerciseIndex, + if (setIndex != null) 'set_index': setIndex, + if (programNameSnapshot != null) + 'program_name_snapshot': programNameSnapshot, + if (exerciseNameSnapshot != null) + 'exercise_name_snapshot': exerciseNameSnapshot, + if (timeEnabledSnapshot != null) + 'time_enabled_snapshot': timeEnabledSnapshot, + if (repsEnabledSnapshot != null) + 'reps_enabled_snapshot': repsEnabledSnapshot, + if (scoreEnabledSnapshot != null) + 'score_enabled_snapshot': scoreEnabledSnapshot, + if (targetTimeSecondsSnapshot != null) + 'target_time_seconds_snapshot': targetTimeSecondsSnapshot, + if (targetRepsSnapshot != null) + 'target_reps_snapshot': targetRepsSnapshot, + if (targetScoreSnapshot != null) + 'target_score_snapshot': targetScoreSnapshot, + if (actualTimeMs != null) 'actual_time_ms': actualTimeMs, + if (actualReps != null) 'actual_reps': actualReps, + if (actualScore != null) 'actual_score': actualScore, + if (scoreLabelSnapshot != null) + 'score_label_snapshot': scoreLabelSnapshot, + if (scoreUnitSnapshot != null) 'score_unit_snapshot': scoreUnitSnapshot, + if (startedAt != null) 'started_at': startedAt, + if (completedAt != null) 'completed_at': completedAt, + if (rowid != null) 'rowid': rowid, + }); + } + + WorkoutHistorySetResultsCompanion copyWith({ + Value? id, + Value? createdAt, + Value? updatedAt, + Value? deletedAt, + Value? schemaVersion, + Value? syncState, + Value? localRevision, + Value? originDeviceId, + Value? futureOwnerProfileId, + Value? lastSyncedAt, + Value? remoteRevision, + Value? workoutHistoryId, + Value? programSnapshotId, + Value? exerciseSnapshotId, + Value? programIndex, + Value? exerciseIndex, + Value? setIndex, + Value? programNameSnapshot, + Value? exerciseNameSnapshot, + Value? timeEnabledSnapshot, + Value? repsEnabledSnapshot, + Value? scoreEnabledSnapshot, + Value? targetTimeSecondsSnapshot, + Value? targetRepsSnapshot, + Value? targetScoreSnapshot, + Value? actualTimeMs, + Value? actualReps, + Value? actualScore, + Value? scoreLabelSnapshot, + Value? scoreUnitSnapshot, + Value? startedAt, + Value? completedAt, + Value? rowid, + }) { + return WorkoutHistorySetResultsCompanion( + id: id ?? this.id, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt ?? this.deletedAt, + schemaVersion: schemaVersion ?? this.schemaVersion, + syncState: syncState ?? this.syncState, + localRevision: localRevision ?? this.localRevision, + originDeviceId: originDeviceId ?? this.originDeviceId, + futureOwnerProfileId: futureOwnerProfileId ?? this.futureOwnerProfileId, + lastSyncedAt: lastSyncedAt ?? this.lastSyncedAt, + remoteRevision: remoteRevision ?? this.remoteRevision, + workoutHistoryId: workoutHistoryId ?? this.workoutHistoryId, + programSnapshotId: programSnapshotId ?? this.programSnapshotId, + exerciseSnapshotId: exerciseSnapshotId ?? this.exerciseSnapshotId, + programIndex: programIndex ?? this.programIndex, + exerciseIndex: exerciseIndex ?? this.exerciseIndex, + setIndex: setIndex ?? this.setIndex, + programNameSnapshot: programNameSnapshot ?? this.programNameSnapshot, + exerciseNameSnapshot: exerciseNameSnapshot ?? this.exerciseNameSnapshot, + timeEnabledSnapshot: timeEnabledSnapshot ?? this.timeEnabledSnapshot, + repsEnabledSnapshot: repsEnabledSnapshot ?? this.repsEnabledSnapshot, + scoreEnabledSnapshot: scoreEnabledSnapshot ?? this.scoreEnabledSnapshot, + targetTimeSecondsSnapshot: + targetTimeSecondsSnapshot ?? this.targetTimeSecondsSnapshot, + targetRepsSnapshot: targetRepsSnapshot ?? this.targetRepsSnapshot, + targetScoreSnapshot: targetScoreSnapshot ?? this.targetScoreSnapshot, + actualTimeMs: actualTimeMs ?? this.actualTimeMs, + actualReps: actualReps ?? this.actualReps, + actualScore: actualScore ?? this.actualScore, + scoreLabelSnapshot: scoreLabelSnapshot ?? this.scoreLabelSnapshot, + scoreUnitSnapshot: scoreUnitSnapshot ?? this.scoreUnitSnapshot, + startedAt: startedAt ?? this.startedAt, + completedAt: completedAt ?? this.completedAt, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + if (updatedAt.present) { + map['updated_at'] = Variable(updatedAt.value); + } + if (deletedAt.present) { + map['deleted_at'] = Variable(deletedAt.value); + } + if (schemaVersion.present) { + map['schema_version'] = Variable(schemaVersion.value); + } + if (syncState.present) { + map['sync_state'] = Variable(syncState.value); + } + if (localRevision.present) { + map['local_revision'] = Variable(localRevision.value); + } + if (originDeviceId.present) { + map['origin_device_id'] = Variable(originDeviceId.value); + } + if (futureOwnerProfileId.present) { + map['future_owner_profile_id'] = Variable( + futureOwnerProfileId.value, + ); + } + if (lastSyncedAt.present) { + map['last_synced_at'] = Variable(lastSyncedAt.value); + } + if (remoteRevision.present) { + map['remote_revision'] = Variable(remoteRevision.value); + } + if (workoutHistoryId.present) { + map['workout_history_id'] = Variable(workoutHistoryId.value); + } + if (programSnapshotId.present) { + map['program_snapshot_id'] = Variable(programSnapshotId.value); + } + if (exerciseSnapshotId.present) { + map['exercise_snapshot_id'] = Variable(exerciseSnapshotId.value); + } + if (programIndex.present) { + map['program_index'] = Variable(programIndex.value); + } + if (exerciseIndex.present) { + map['exercise_index'] = Variable(exerciseIndex.value); + } + if (setIndex.present) { + map['set_index'] = Variable(setIndex.value); + } + if (programNameSnapshot.present) { + map['program_name_snapshot'] = Variable( + programNameSnapshot.value, + ); + } + if (exerciseNameSnapshot.present) { + map['exercise_name_snapshot'] = Variable( + exerciseNameSnapshot.value, + ); + } + if (timeEnabledSnapshot.present) { + map['time_enabled_snapshot'] = Variable(timeEnabledSnapshot.value); + } + if (repsEnabledSnapshot.present) { + map['reps_enabled_snapshot'] = Variable(repsEnabledSnapshot.value); + } + if (scoreEnabledSnapshot.present) { + map['score_enabled_snapshot'] = Variable( + scoreEnabledSnapshot.value, + ); + } + if (targetTimeSecondsSnapshot.present) { + map['target_time_seconds_snapshot'] = Variable( + targetTimeSecondsSnapshot.value, + ); + } + if (targetRepsSnapshot.present) { + map['target_reps_snapshot'] = Variable(targetRepsSnapshot.value); + } + if (targetScoreSnapshot.present) { + map['target_score_snapshot'] = Variable( + targetScoreSnapshot.value, + ); + } + if (actualTimeMs.present) { + map['actual_time_ms'] = Variable(actualTimeMs.value); + } + if (actualReps.present) { + map['actual_reps'] = Variable(actualReps.value); + } + if (actualScore.present) { + map['actual_score'] = Variable(actualScore.value); + } + if (scoreLabelSnapshot.present) { + map['score_label_snapshot'] = Variable(scoreLabelSnapshot.value); + } + if (scoreUnitSnapshot.present) { + map['score_unit_snapshot'] = Variable(scoreUnitSnapshot.value); + } + if (startedAt.present) { + map['started_at'] = Variable(startedAt.value); + } + if (completedAt.present) { + map['completed_at'] = Variable(completedAt.value); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('WorkoutHistorySetResultsCompanion(') + ..write('id: $id, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('schemaVersion: $schemaVersion, ') + ..write('syncState: $syncState, ') + ..write('localRevision: $localRevision, ') + ..write('originDeviceId: $originDeviceId, ') + ..write('futureOwnerProfileId: $futureOwnerProfileId, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('remoteRevision: $remoteRevision, ') + ..write('workoutHistoryId: $workoutHistoryId, ') + ..write('programSnapshotId: $programSnapshotId, ') + ..write('exerciseSnapshotId: $exerciseSnapshotId, ') + ..write('programIndex: $programIndex, ') + ..write('exerciseIndex: $exerciseIndex, ') + ..write('setIndex: $setIndex, ') + ..write('programNameSnapshot: $programNameSnapshot, ') + ..write('exerciseNameSnapshot: $exerciseNameSnapshot, ') + ..write('timeEnabledSnapshot: $timeEnabledSnapshot, ') + ..write('repsEnabledSnapshot: $repsEnabledSnapshot, ') + ..write('scoreEnabledSnapshot: $scoreEnabledSnapshot, ') + ..write('targetTimeSecondsSnapshot: $targetTimeSecondsSnapshot, ') + ..write('targetRepsSnapshot: $targetRepsSnapshot, ') + ..write('targetScoreSnapshot: $targetScoreSnapshot, ') + ..write('actualTimeMs: $actualTimeMs, ') + ..write('actualReps: $actualReps, ') + ..write('actualScore: $actualScore, ') + ..write('scoreLabelSnapshot: $scoreLabelSnapshot, ') + ..write('scoreUnitSnapshot: $scoreUnitSnapshot, ') + ..write('startedAt: $startedAt, ') + ..write('completedAt: $completedAt, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class $WorkoutTemplateProgramsTable extends WorkoutTemplatePrograms + with TableInfo<$WorkoutTemplateProgramsTable, WorkoutTemplateProgram> { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + $WorkoutTemplateProgramsTable(this.attachedDatabase, [this._alias]); + static const VerificationMeta _idMeta = const VerificationMeta('id'); + @override + late final GeneratedColumn id = GeneratedColumn( + 'id', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _createdAtMeta = const VerificationMeta( + 'createdAt', + ); + @override + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + ); + static const VerificationMeta _updatedAtMeta = const VerificationMeta( + 'updatedAt', + ); + @override + late final GeneratedColumn updatedAt = GeneratedColumn( + 'updated_at', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + ); + static const VerificationMeta _deletedAtMeta = const VerificationMeta( + 'deletedAt', + ); + @override + late final GeneratedColumn deletedAt = GeneratedColumn( + 'deleted_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + static const VerificationMeta _schemaVersionMeta = const VerificationMeta( + 'schemaVersion', + ); + @override + late final GeneratedColumn schemaVersion = GeneratedColumn( + 'schema_version', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultValue: const Constant(1), + ); + static const VerificationMeta _syncStateMeta = const VerificationMeta( + 'syncState', + ); + @override + late final GeneratedColumn syncState = GeneratedColumn( + 'sync_state', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: + 'NOT NULL CHECK (sync_state IN (\'localOnly\', \'dirty\', \'synced\', \'deleted\'))', + ); + static const VerificationMeta _localRevisionMeta = const VerificationMeta( + 'localRevision', + ); + @override + late final GeneratedColumn localRevision = GeneratedColumn( + 'local_revision', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL CHECK (local_revision >= 0)', + ); + static const VerificationMeta _originDeviceIdMeta = const VerificationMeta( + 'originDeviceId', + ); + @override + late final GeneratedColumn originDeviceId = GeneratedColumn( + 'origin_device_id', + aliasedName, + false, + additionalChecks: GeneratedColumn.checkTextLength(minTextLength: 1), + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _futureOwnerProfileIdMeta = + const VerificationMeta('futureOwnerProfileId'); + @override + late final GeneratedColumn futureOwnerProfileId = + GeneratedColumn( + 'future_owner_profile_id', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _lastSyncedAtMeta = const VerificationMeta( + 'lastSyncedAt', + ); + @override + late final GeneratedColumn lastSyncedAt = GeneratedColumn( + 'last_synced_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + static const VerificationMeta _remoteRevisionMeta = const VerificationMeta( + 'remoteRevision', + ); + @override + late final GeneratedColumn remoteRevision = GeneratedColumn( + 'remote_revision', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _workoutTemplateIdMeta = const VerificationMeta( + 'workoutTemplateId', + ); + @override + late final GeneratedColumn workoutTemplateId = + GeneratedColumn( + 'workout_template_id', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'REFERENCES workout_templates (id)', + ), + ); + static const VerificationMeta _sourceProgramIdMeta = const VerificationMeta( + 'sourceProgramId', + ); + @override + late final GeneratedColumn sourceProgramId = GeneratedColumn( + 'source_program_id', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'REFERENCES programs (id)', + ), + ); + static const VerificationMeta _positionMeta = const VerificationMeta( + 'position', + ); + @override + late final GeneratedColumn position = GeneratedColumn( + 'position', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + ); + static const VerificationMeta _programNameSnapshotMeta = + const VerificationMeta('programNameSnapshot'); + @override + late final GeneratedColumn programNameSnapshot = + GeneratedColumn( + 'program_name_snapshot', + aliasedName, + false, + additionalChecks: GeneratedColumn.checkTextLength(minTextLength: 1), + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _defaultRestSecondsSnapshotMeta = + const VerificationMeta('defaultRestSecondsSnapshot'); + @override + late final GeneratedColumn defaultRestSecondsSnapshot = + GeneratedColumn( + 'default_rest_seconds_snapshot', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + ); + static const VerificationMeta _programSnapshotJsonMeta = + const VerificationMeta('programSnapshotJson'); + @override + late final GeneratedColumn programSnapshotJson = + GeneratedColumn( + 'program_snapshot_json', + aliasedName, + false, + additionalChecks: GeneratedColumn.checkTextLength(minTextLength: 1), + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + @override + List get $columns => [ + id, + createdAt, + updatedAt, + deletedAt, + schemaVersion, + syncState, + localRevision, + originDeviceId, + futureOwnerProfileId, + lastSyncedAt, + remoteRevision, + workoutTemplateId, + sourceProgramId, + position, + programNameSnapshot, + defaultRestSecondsSnapshot, + programSnapshotJson, + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'workout_template_programs'; + @override + VerificationContext validateIntegrity( + Insertable instance, { + bool isInserting = false, + }) { + final context = VerificationContext(); + final data = instance.toColumns(true); + if (data.containsKey('id')) { + context.handle(_idMeta, id.isAcceptableOrUnknown(data['id']!, _idMeta)); + } else if (isInserting) { + context.missing(_idMeta); + } + if (data.containsKey('created_at')) { + context.handle( + _createdAtMeta, + createdAt.isAcceptableOrUnknown(data['created_at']!, _createdAtMeta), + ); + } else if (isInserting) { + context.missing(_createdAtMeta); + } + if (data.containsKey('updated_at')) { + context.handle( + _updatedAtMeta, + updatedAt.isAcceptableOrUnknown(data['updated_at']!, _updatedAtMeta), + ); + } else if (isInserting) { + context.missing(_updatedAtMeta); + } + if (data.containsKey('deleted_at')) { + context.handle( + _deletedAtMeta, + deletedAt.isAcceptableOrUnknown(data['deleted_at']!, _deletedAtMeta), + ); + } + if (data.containsKey('schema_version')) { + context.handle( + _schemaVersionMeta, + schemaVersion.isAcceptableOrUnknown( + data['schema_version']!, + _schemaVersionMeta, + ), + ); + } + if (data.containsKey('sync_state')) { + context.handle( + _syncStateMeta, + syncState.isAcceptableOrUnknown(data['sync_state']!, _syncStateMeta), + ); + } else if (isInserting) { + context.missing(_syncStateMeta); + } + if (data.containsKey('local_revision')) { + context.handle( + _localRevisionMeta, + localRevision.isAcceptableOrUnknown( + data['local_revision']!, + _localRevisionMeta, + ), + ); + } else if (isInserting) { + context.missing(_localRevisionMeta); + } + if (data.containsKey('origin_device_id')) { + context.handle( + _originDeviceIdMeta, + originDeviceId.isAcceptableOrUnknown( + data['origin_device_id']!, + _originDeviceIdMeta, + ), + ); + } else if (isInserting) { + context.missing(_originDeviceIdMeta); + } + if (data.containsKey('future_owner_profile_id')) { + context.handle( + _futureOwnerProfileIdMeta, + futureOwnerProfileId.isAcceptableOrUnknown( + data['future_owner_profile_id']!, + _futureOwnerProfileIdMeta, + ), + ); + } + if (data.containsKey('last_synced_at')) { + context.handle( + _lastSyncedAtMeta, + lastSyncedAt.isAcceptableOrUnknown( + data['last_synced_at']!, + _lastSyncedAtMeta, + ), + ); + } + if (data.containsKey('remote_revision')) { + context.handle( + _remoteRevisionMeta, + remoteRevision.isAcceptableOrUnknown( + data['remote_revision']!, + _remoteRevisionMeta, + ), + ); + } + if (data.containsKey('workout_template_id')) { + context.handle( + _workoutTemplateIdMeta, + workoutTemplateId.isAcceptableOrUnknown( + data['workout_template_id']!, + _workoutTemplateIdMeta, + ), + ); + } else if (isInserting) { + context.missing(_workoutTemplateIdMeta); + } + if (data.containsKey('source_program_id')) { + context.handle( + _sourceProgramIdMeta, + sourceProgramId.isAcceptableOrUnknown( + data['source_program_id']!, + _sourceProgramIdMeta, + ), + ); + } + if (data.containsKey('position')) { + context.handle( + _positionMeta, + position.isAcceptableOrUnknown(data['position']!, _positionMeta), + ); + } else if (isInserting) { + context.missing(_positionMeta); + } + if (data.containsKey('program_name_snapshot')) { + context.handle( + _programNameSnapshotMeta, + programNameSnapshot.isAcceptableOrUnknown( + data['program_name_snapshot']!, + _programNameSnapshotMeta, + ), + ); + } else if (isInserting) { + context.missing(_programNameSnapshotMeta); + } + if (data.containsKey('default_rest_seconds_snapshot')) { + context.handle( + _defaultRestSecondsSnapshotMeta, + defaultRestSecondsSnapshot.isAcceptableOrUnknown( + data['default_rest_seconds_snapshot']!, + _defaultRestSecondsSnapshotMeta, + ), + ); + } else if (isInserting) { + context.missing(_defaultRestSecondsSnapshotMeta); + } + if (data.containsKey('program_snapshot_json')) { + context.handle( + _programSnapshotJsonMeta, + programSnapshotJson.isAcceptableOrUnknown( + data['program_snapshot_json']!, + _programSnapshotJsonMeta, + ), + ); + } else if (isInserting) { + context.missing(_programSnapshotJsonMeta); + } + return context; + } + + @override + Set get $primaryKey => {id}; + @override + WorkoutTemplateProgram map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return WorkoutTemplateProgram( + id: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}id'], + )!, + createdAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}created_at'], + )!, + updatedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}updated_at'], + )!, + deletedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}deleted_at'], + ), + schemaVersion: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}schema_version'], + )!, + syncState: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}sync_state'], + )!, + localRevision: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}local_revision'], + )!, + originDeviceId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}origin_device_id'], + )!, + futureOwnerProfileId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}future_owner_profile_id'], + ), + lastSyncedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}last_synced_at'], + ), + remoteRevision: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}remote_revision'], + ), + workoutTemplateId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}workout_template_id'], + )!, + sourceProgramId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}source_program_id'], + ), + position: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}position'], + )!, + programNameSnapshot: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}program_name_snapshot'], + )!, + defaultRestSecondsSnapshot: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}default_rest_seconds_snapshot'], + )!, + programSnapshotJson: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}program_snapshot_json'], + )!, + ); + } + + @override + $WorkoutTemplateProgramsTable createAlias(String alias) { + return $WorkoutTemplateProgramsTable(attachedDatabase, alias); + } +} + +class WorkoutTemplateProgram extends DataClass + implements Insertable { + final String id; + final DateTime createdAt; + final DateTime updatedAt; + final DateTime? deletedAt; + final int schemaVersion; + final String syncState; + final int localRevision; + final String originDeviceId; + final String? futureOwnerProfileId; + final DateTime? lastSyncedAt; + final String? remoteRevision; + final String workoutTemplateId; + final String? sourceProgramId; + final int position; + final String programNameSnapshot; + final int defaultRestSecondsSnapshot; + final String programSnapshotJson; + const WorkoutTemplateProgram({ + required this.id, + required this.createdAt, + required this.updatedAt, + this.deletedAt, + required this.schemaVersion, + required this.syncState, + required this.localRevision, + required this.originDeviceId, + this.futureOwnerProfileId, + this.lastSyncedAt, + this.remoteRevision, + required this.workoutTemplateId, + this.sourceProgramId, + required this.position, + required this.programNameSnapshot, + required this.defaultRestSecondsSnapshot, + required this.programSnapshotJson, + }); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['created_at'] = Variable(createdAt); + map['updated_at'] = Variable(updatedAt); + if (!nullToAbsent || deletedAt != null) { + map['deleted_at'] = Variable(deletedAt); + } + map['schema_version'] = Variable(schemaVersion); + map['sync_state'] = Variable(syncState); + map['local_revision'] = Variable(localRevision); + map['origin_device_id'] = Variable(originDeviceId); + if (!nullToAbsent || futureOwnerProfileId != null) { + map['future_owner_profile_id'] = Variable(futureOwnerProfileId); + } + if (!nullToAbsent || lastSyncedAt != null) { + map['last_synced_at'] = Variable(lastSyncedAt); + } + if (!nullToAbsent || remoteRevision != null) { + map['remote_revision'] = Variable(remoteRevision); + } + map['workout_template_id'] = Variable(workoutTemplateId); + if (!nullToAbsent || sourceProgramId != null) { + map['source_program_id'] = Variable(sourceProgramId); + } + map['position'] = Variable(position); + map['program_name_snapshot'] = Variable(programNameSnapshot); + map['default_rest_seconds_snapshot'] = Variable( + defaultRestSecondsSnapshot, + ); + map['program_snapshot_json'] = Variable(programSnapshotJson); + return map; + } + + WorkoutTemplateProgramsCompanion toCompanion(bool nullToAbsent) { + return WorkoutTemplateProgramsCompanion( + id: Value(id), + createdAt: Value(createdAt), + updatedAt: Value(updatedAt), + deletedAt: deletedAt == null && nullToAbsent + ? const Value.absent() + : Value(deletedAt), + schemaVersion: Value(schemaVersion), + syncState: Value(syncState), + localRevision: Value(localRevision), + originDeviceId: Value(originDeviceId), + futureOwnerProfileId: futureOwnerProfileId == null && nullToAbsent + ? const Value.absent() + : Value(futureOwnerProfileId), + lastSyncedAt: lastSyncedAt == null && nullToAbsent + ? const Value.absent() + : Value(lastSyncedAt), + remoteRevision: remoteRevision == null && nullToAbsent + ? const Value.absent() + : Value(remoteRevision), + workoutTemplateId: Value(workoutTemplateId), + sourceProgramId: sourceProgramId == null && nullToAbsent + ? const Value.absent() + : Value(sourceProgramId), + position: Value(position), + programNameSnapshot: Value(programNameSnapshot), + defaultRestSecondsSnapshot: Value(defaultRestSecondsSnapshot), + programSnapshotJson: Value(programSnapshotJson), + ); + } + + factory WorkoutTemplateProgram.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return WorkoutTemplateProgram( + id: serializer.fromJson(json['id']), + createdAt: serializer.fromJson(json['createdAt']), + updatedAt: serializer.fromJson(json['updatedAt']), + deletedAt: serializer.fromJson(json['deletedAt']), + schemaVersion: serializer.fromJson(json['schemaVersion']), + syncState: serializer.fromJson(json['syncState']), + localRevision: serializer.fromJson(json['localRevision']), + originDeviceId: serializer.fromJson(json['originDeviceId']), + futureOwnerProfileId: serializer.fromJson( + json['futureOwnerProfileId'], + ), + lastSyncedAt: serializer.fromJson(json['lastSyncedAt']), + remoteRevision: serializer.fromJson(json['remoteRevision']), + workoutTemplateId: serializer.fromJson(json['workoutTemplateId']), + sourceProgramId: serializer.fromJson(json['sourceProgramId']), + position: serializer.fromJson(json['position']), + programNameSnapshot: serializer.fromJson( + json['programNameSnapshot'], + ), + defaultRestSecondsSnapshot: serializer.fromJson( + json['defaultRestSecondsSnapshot'], + ), + programSnapshotJson: serializer.fromJson( + json['programSnapshotJson'], + ), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'createdAt': serializer.toJson(createdAt), + 'updatedAt': serializer.toJson(updatedAt), + 'deletedAt': serializer.toJson(deletedAt), + 'schemaVersion': serializer.toJson(schemaVersion), + 'syncState': serializer.toJson(syncState), + 'localRevision': serializer.toJson(localRevision), + 'originDeviceId': serializer.toJson(originDeviceId), + 'futureOwnerProfileId': serializer.toJson(futureOwnerProfileId), + 'lastSyncedAt': serializer.toJson(lastSyncedAt), + 'remoteRevision': serializer.toJson(remoteRevision), + 'workoutTemplateId': serializer.toJson(workoutTemplateId), + 'sourceProgramId': serializer.toJson(sourceProgramId), + 'position': serializer.toJson(position), + 'programNameSnapshot': serializer.toJson(programNameSnapshot), + 'defaultRestSecondsSnapshot': serializer.toJson( + defaultRestSecondsSnapshot, + ), + 'programSnapshotJson': serializer.toJson(programSnapshotJson), + }; + } + + WorkoutTemplateProgram copyWith({ + String? id, + DateTime? createdAt, + DateTime? updatedAt, + Value deletedAt = const Value.absent(), + int? schemaVersion, + String? syncState, + int? localRevision, + String? originDeviceId, + Value futureOwnerProfileId = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + Value remoteRevision = const Value.absent(), + String? workoutTemplateId, + Value sourceProgramId = const Value.absent(), + int? position, + String? programNameSnapshot, + int? defaultRestSecondsSnapshot, + String? programSnapshotJson, + }) => WorkoutTemplateProgram( + id: id ?? this.id, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt.present ? deletedAt.value : this.deletedAt, + schemaVersion: schemaVersion ?? this.schemaVersion, + syncState: syncState ?? this.syncState, + localRevision: localRevision ?? this.localRevision, + originDeviceId: originDeviceId ?? this.originDeviceId, + futureOwnerProfileId: futureOwnerProfileId.present + ? futureOwnerProfileId.value + : this.futureOwnerProfileId, + lastSyncedAt: lastSyncedAt.present ? lastSyncedAt.value : this.lastSyncedAt, + remoteRevision: remoteRevision.present + ? remoteRevision.value + : this.remoteRevision, + workoutTemplateId: workoutTemplateId ?? this.workoutTemplateId, + sourceProgramId: sourceProgramId.present + ? sourceProgramId.value + : this.sourceProgramId, + position: position ?? this.position, + programNameSnapshot: programNameSnapshot ?? this.programNameSnapshot, + defaultRestSecondsSnapshot: + defaultRestSecondsSnapshot ?? this.defaultRestSecondsSnapshot, + programSnapshotJson: programSnapshotJson ?? this.programSnapshotJson, + ); + WorkoutTemplateProgram copyWithCompanion( + WorkoutTemplateProgramsCompanion data, + ) { + return WorkoutTemplateProgram( + id: data.id.present ? data.id.value : this.id, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + updatedAt: data.updatedAt.present ? data.updatedAt.value : this.updatedAt, + deletedAt: data.deletedAt.present ? data.deletedAt.value : this.deletedAt, + schemaVersion: data.schemaVersion.present + ? data.schemaVersion.value + : this.schemaVersion, + syncState: data.syncState.present ? data.syncState.value : this.syncState, + localRevision: data.localRevision.present + ? data.localRevision.value + : this.localRevision, + originDeviceId: data.originDeviceId.present + ? data.originDeviceId.value + : this.originDeviceId, + futureOwnerProfileId: data.futureOwnerProfileId.present + ? data.futureOwnerProfileId.value + : this.futureOwnerProfileId, + lastSyncedAt: data.lastSyncedAt.present + ? data.lastSyncedAt.value + : this.lastSyncedAt, + remoteRevision: data.remoteRevision.present + ? data.remoteRevision.value + : this.remoteRevision, + workoutTemplateId: data.workoutTemplateId.present + ? data.workoutTemplateId.value + : this.workoutTemplateId, + sourceProgramId: data.sourceProgramId.present + ? data.sourceProgramId.value + : this.sourceProgramId, + position: data.position.present ? data.position.value : this.position, + programNameSnapshot: data.programNameSnapshot.present + ? data.programNameSnapshot.value + : this.programNameSnapshot, + defaultRestSecondsSnapshot: data.defaultRestSecondsSnapshot.present + ? data.defaultRestSecondsSnapshot.value + : this.defaultRestSecondsSnapshot, + programSnapshotJson: data.programSnapshotJson.present + ? data.programSnapshotJson.value + : this.programSnapshotJson, + ); + } + + @override + String toString() { + return (StringBuffer('WorkoutTemplateProgram(') + ..write('id: $id, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('schemaVersion: $schemaVersion, ') + ..write('syncState: $syncState, ') + ..write('localRevision: $localRevision, ') + ..write('originDeviceId: $originDeviceId, ') + ..write('futureOwnerProfileId: $futureOwnerProfileId, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('remoteRevision: $remoteRevision, ') + ..write('workoutTemplateId: $workoutTemplateId, ') + ..write('sourceProgramId: $sourceProgramId, ') + ..write('position: $position, ') + ..write('programNameSnapshot: $programNameSnapshot, ') + ..write('defaultRestSecondsSnapshot: $defaultRestSecondsSnapshot, ') + ..write('programSnapshotJson: $programSnapshotJson') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash( + id, + createdAt, + updatedAt, + deletedAt, + schemaVersion, + syncState, + localRevision, + originDeviceId, + futureOwnerProfileId, + lastSyncedAt, + remoteRevision, + workoutTemplateId, + sourceProgramId, + position, + programNameSnapshot, + defaultRestSecondsSnapshot, + programSnapshotJson, + ); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is WorkoutTemplateProgram && + other.id == this.id && + other.createdAt == this.createdAt && + other.updatedAt == this.updatedAt && + other.deletedAt == this.deletedAt && + other.schemaVersion == this.schemaVersion && + other.syncState == this.syncState && + other.localRevision == this.localRevision && + other.originDeviceId == this.originDeviceId && + other.futureOwnerProfileId == this.futureOwnerProfileId && + other.lastSyncedAt == this.lastSyncedAt && + other.remoteRevision == this.remoteRevision && + other.workoutTemplateId == this.workoutTemplateId && + other.sourceProgramId == this.sourceProgramId && + other.position == this.position && + other.programNameSnapshot == this.programNameSnapshot && + other.defaultRestSecondsSnapshot == this.defaultRestSecondsSnapshot && + other.programSnapshotJson == this.programSnapshotJson); +} + +class WorkoutTemplateProgramsCompanion + extends UpdateCompanion { + final Value id; + final Value createdAt; + final Value updatedAt; + final Value deletedAt; + final Value schemaVersion; + final Value syncState; + final Value localRevision; + final Value originDeviceId; + final Value futureOwnerProfileId; + final Value lastSyncedAt; + final Value remoteRevision; + final Value workoutTemplateId; + final Value sourceProgramId; + final Value position; + final Value programNameSnapshot; + final Value defaultRestSecondsSnapshot; + final Value programSnapshotJson; + final Value rowid; + const WorkoutTemplateProgramsCompanion({ + this.id = const Value.absent(), + this.createdAt = const Value.absent(), + this.updatedAt = const Value.absent(), + this.deletedAt = const Value.absent(), + this.schemaVersion = const Value.absent(), + this.syncState = const Value.absent(), + this.localRevision = const Value.absent(), + this.originDeviceId = const Value.absent(), + this.futureOwnerProfileId = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + this.remoteRevision = const Value.absent(), + this.workoutTemplateId = const Value.absent(), + this.sourceProgramId = const Value.absent(), + this.position = const Value.absent(), + this.programNameSnapshot = const Value.absent(), + this.defaultRestSecondsSnapshot = const Value.absent(), + this.programSnapshotJson = const Value.absent(), + this.rowid = const Value.absent(), + }); + WorkoutTemplateProgramsCompanion.insert({ + required String id, + required DateTime createdAt, + required DateTime updatedAt, + this.deletedAt = const Value.absent(), + this.schemaVersion = const Value.absent(), + required String syncState, + required int localRevision, + required String originDeviceId, + this.futureOwnerProfileId = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + this.remoteRevision = const Value.absent(), + required String workoutTemplateId, + this.sourceProgramId = const Value.absent(), + required int position, + required String programNameSnapshot, + required int defaultRestSecondsSnapshot, + required String programSnapshotJson, + this.rowid = const Value.absent(), + }) : id = Value(id), + createdAt = Value(createdAt), + updatedAt = Value(updatedAt), + syncState = Value(syncState), + localRevision = Value(localRevision), + originDeviceId = Value(originDeviceId), + workoutTemplateId = Value(workoutTemplateId), + position = Value(position), + programNameSnapshot = Value(programNameSnapshot), + defaultRestSecondsSnapshot = Value(defaultRestSecondsSnapshot), + programSnapshotJson = Value(programSnapshotJson); + static Insertable custom({ + Expression? id, + Expression? createdAt, + Expression? updatedAt, + Expression? deletedAt, + Expression? schemaVersion, + Expression? syncState, + Expression? localRevision, + Expression? originDeviceId, + Expression? futureOwnerProfileId, + Expression? lastSyncedAt, + Expression? remoteRevision, + Expression? workoutTemplateId, + Expression? sourceProgramId, + Expression? position, + Expression? programNameSnapshot, + Expression? defaultRestSecondsSnapshot, + Expression? programSnapshotJson, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (createdAt != null) 'created_at': createdAt, + if (updatedAt != null) 'updated_at': updatedAt, + if (deletedAt != null) 'deleted_at': deletedAt, + if (schemaVersion != null) 'schema_version': schemaVersion, + if (syncState != null) 'sync_state': syncState, + if (localRevision != null) 'local_revision': localRevision, + if (originDeviceId != null) 'origin_device_id': originDeviceId, + if (futureOwnerProfileId != null) + 'future_owner_profile_id': futureOwnerProfileId, + if (lastSyncedAt != null) 'last_synced_at': lastSyncedAt, + if (remoteRevision != null) 'remote_revision': remoteRevision, + if (workoutTemplateId != null) 'workout_template_id': workoutTemplateId, + if (sourceProgramId != null) 'source_program_id': sourceProgramId, + if (position != null) 'position': position, + if (programNameSnapshot != null) + 'program_name_snapshot': programNameSnapshot, + if (defaultRestSecondsSnapshot != null) + 'default_rest_seconds_snapshot': defaultRestSecondsSnapshot, + if (programSnapshotJson != null) + 'program_snapshot_json': programSnapshotJson, + if (rowid != null) 'rowid': rowid, + }); + } + + WorkoutTemplateProgramsCompanion copyWith({ + Value? id, + Value? createdAt, + Value? updatedAt, + Value? deletedAt, + Value? schemaVersion, + Value? syncState, + Value? localRevision, + Value? originDeviceId, + Value? futureOwnerProfileId, + Value? lastSyncedAt, + Value? remoteRevision, + Value? workoutTemplateId, + Value? sourceProgramId, + Value? position, + Value? programNameSnapshot, + Value? defaultRestSecondsSnapshot, + Value? programSnapshotJson, + Value? rowid, + }) { + return WorkoutTemplateProgramsCompanion( + id: id ?? this.id, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt ?? this.deletedAt, + schemaVersion: schemaVersion ?? this.schemaVersion, + syncState: syncState ?? this.syncState, + localRevision: localRevision ?? this.localRevision, + originDeviceId: originDeviceId ?? this.originDeviceId, + futureOwnerProfileId: futureOwnerProfileId ?? this.futureOwnerProfileId, + lastSyncedAt: lastSyncedAt ?? this.lastSyncedAt, + remoteRevision: remoteRevision ?? this.remoteRevision, + workoutTemplateId: workoutTemplateId ?? this.workoutTemplateId, + sourceProgramId: sourceProgramId ?? this.sourceProgramId, + position: position ?? this.position, + programNameSnapshot: programNameSnapshot ?? this.programNameSnapshot, + defaultRestSecondsSnapshot: + defaultRestSecondsSnapshot ?? this.defaultRestSecondsSnapshot, + programSnapshotJson: programSnapshotJson ?? this.programSnapshotJson, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + if (updatedAt.present) { + map['updated_at'] = Variable(updatedAt.value); + } + if (deletedAt.present) { + map['deleted_at'] = Variable(deletedAt.value); + } + if (schemaVersion.present) { + map['schema_version'] = Variable(schemaVersion.value); + } + if (syncState.present) { + map['sync_state'] = Variable(syncState.value); + } + if (localRevision.present) { + map['local_revision'] = Variable(localRevision.value); + } + if (originDeviceId.present) { + map['origin_device_id'] = Variable(originDeviceId.value); + } + if (futureOwnerProfileId.present) { + map['future_owner_profile_id'] = Variable( + futureOwnerProfileId.value, + ); + } + if (lastSyncedAt.present) { + map['last_synced_at'] = Variable(lastSyncedAt.value); + } + if (remoteRevision.present) { + map['remote_revision'] = Variable(remoteRevision.value); + } + if (workoutTemplateId.present) { + map['workout_template_id'] = Variable(workoutTemplateId.value); + } + if (sourceProgramId.present) { + map['source_program_id'] = Variable(sourceProgramId.value); + } + if (position.present) { + map['position'] = Variable(position.value); + } + if (programNameSnapshot.present) { + map['program_name_snapshot'] = Variable( + programNameSnapshot.value, + ); + } + if (defaultRestSecondsSnapshot.present) { + map['default_rest_seconds_snapshot'] = Variable( + defaultRestSecondsSnapshot.value, + ); + } + if (programSnapshotJson.present) { + map['program_snapshot_json'] = Variable( + programSnapshotJson.value, + ); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('WorkoutTemplateProgramsCompanion(') + ..write('id: $id, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('schemaVersion: $schemaVersion, ') + ..write('syncState: $syncState, ') + ..write('localRevision: $localRevision, ') + ..write('originDeviceId: $originDeviceId, ') + ..write('futureOwnerProfileId: $futureOwnerProfileId, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('remoteRevision: $remoteRevision, ') + ..write('workoutTemplateId: $workoutTemplateId, ') + ..write('sourceProgramId: $sourceProgramId, ') + ..write('position: $position, ') + ..write('programNameSnapshot: $programNameSnapshot, ') + ..write('defaultRestSecondsSnapshot: $defaultRestSecondsSnapshot, ') + ..write('programSnapshotJson: $programSnapshotJson, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +class $WorkoutTemplateExerciseOverridesTable + extends WorkoutTemplateExerciseOverrides + with + TableInfo< + $WorkoutTemplateExerciseOverridesTable, + WorkoutTemplateExerciseOverride + > { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + $WorkoutTemplateExerciseOverridesTable(this.attachedDatabase, [this._alias]); + static const VerificationMeta _idMeta = const VerificationMeta('id'); + @override + late final GeneratedColumn id = GeneratedColumn( + 'id', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _createdAtMeta = const VerificationMeta( + 'createdAt', + ); + @override + late final GeneratedColumn createdAt = GeneratedColumn( + 'created_at', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + ); + static const VerificationMeta _updatedAtMeta = const VerificationMeta( + 'updatedAt', + ); + @override + late final GeneratedColumn updatedAt = GeneratedColumn( + 'updated_at', + aliasedName, + false, + type: DriftSqlType.dateTime, + requiredDuringInsert: true, + ); + static const VerificationMeta _deletedAtMeta = const VerificationMeta( + 'deletedAt', + ); + @override + late final GeneratedColumn deletedAt = GeneratedColumn( + 'deleted_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + static const VerificationMeta _schemaVersionMeta = const VerificationMeta( + 'schemaVersion', + ); + @override + late final GeneratedColumn schemaVersion = GeneratedColumn( + 'schema_version', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultValue: const Constant(1), + ); + static const VerificationMeta _syncStateMeta = const VerificationMeta( + 'syncState', + ); + @override + late final GeneratedColumn syncState = GeneratedColumn( + 'sync_state', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + $customConstraints: + 'NOT NULL CHECK (sync_state IN (\'localOnly\', \'dirty\', \'synced\', \'deleted\'))', + ); + static const VerificationMeta _localRevisionMeta = const VerificationMeta( + 'localRevision', + ); + @override + late final GeneratedColumn localRevision = GeneratedColumn( + 'local_revision', + aliasedName, + false, + type: DriftSqlType.int, + requiredDuringInsert: true, + $customConstraints: 'NOT NULL CHECK (local_revision >= 0)', + ); + static const VerificationMeta _originDeviceIdMeta = const VerificationMeta( + 'originDeviceId', + ); + @override + late final GeneratedColumn originDeviceId = GeneratedColumn( + 'origin_device_id', + aliasedName, + false, + additionalChecks: GeneratedColumn.checkTextLength(minTextLength: 1), + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _futureOwnerProfileIdMeta = + const VerificationMeta('futureOwnerProfileId'); + @override + late final GeneratedColumn futureOwnerProfileId = + GeneratedColumn( + 'future_owner_profile_id', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _lastSyncedAtMeta = const VerificationMeta( + 'lastSyncedAt', + ); + @override + late final GeneratedColumn lastSyncedAt = GeneratedColumn( + 'last_synced_at', + aliasedName, + true, + type: DriftSqlType.dateTime, + requiredDuringInsert: false, + ); + static const VerificationMeta _remoteRevisionMeta = const VerificationMeta( + 'remoteRevision', + ); + @override + late final GeneratedColumn remoteRevision = GeneratedColumn( + 'remote_revision', + aliasedName, + true, + type: DriftSqlType.string, + requiredDuringInsert: false, + ); + static const VerificationMeta _workoutTemplateProgramIdMeta = + const VerificationMeta('workoutTemplateProgramId'); + @override + late final GeneratedColumn workoutTemplateProgramId = + GeneratedColumn( + 'workout_template_program_id', + aliasedName, + false, + type: DriftSqlType.string, + requiredDuringInsert: true, + defaultConstraints: GeneratedColumn.constraintIsAlways( + 'REFERENCES workout_template_programs (id)', + ), + ); + static const VerificationMeta _snapshotProgramExerciseIdMeta = + const VerificationMeta('snapshotProgramExerciseId'); + @override + late final GeneratedColumn snapshotProgramExerciseId = + GeneratedColumn( + 'snapshot_program_exercise_id', + aliasedName, + false, + additionalChecks: GeneratedColumn.checkTextLength(minTextLength: 1), + type: DriftSqlType.string, + requiredDuringInsert: true, + ); + static const VerificationMeta _setsCountOverrideMeta = const VerificationMeta( + 'setsCountOverride', + ); + @override + late final GeneratedColumn setsCountOverride = GeneratedColumn( + 'sets_count_override', + aliasedName, + true, + type: DriftSqlType.int, + requiredDuringInsert: false, + ); + static const VerificationMeta _targetTimeSecondsOverrideMeta = + const VerificationMeta('targetTimeSecondsOverride'); + @override + late final GeneratedColumn targetTimeSecondsOverride = + GeneratedColumn( + 'target_time_seconds_override', + aliasedName, + true, + type: DriftSqlType.int, + requiredDuringInsert: false, + ); + static const VerificationMeta _targetRepsOverrideMeta = + const VerificationMeta('targetRepsOverride'); + @override + late final GeneratedColumn targetRepsOverride = GeneratedColumn( + 'target_reps_override', + aliasedName, + true, + type: DriftSqlType.int, + requiredDuringInsert: false, + ); + static const VerificationMeta _targetScoreOverrideMeta = + const VerificationMeta('targetScoreOverride'); + @override + late final GeneratedColumn targetScoreOverride = + GeneratedColumn( + 'target_score_override', + aliasedName, + true, + type: DriftSqlType.double, + requiredDuringInsert: false, + ); + @override + List get $columns => [ + id, + createdAt, + updatedAt, + deletedAt, + schemaVersion, + syncState, + localRevision, + originDeviceId, + futureOwnerProfileId, + lastSyncedAt, + remoteRevision, + workoutTemplateProgramId, + snapshotProgramExerciseId, + setsCountOverride, + targetTimeSecondsOverride, + targetRepsOverride, + targetScoreOverride, + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'workout_template_exercise_overrides'; + @override + VerificationContext validateIntegrity( + Insertable instance, { + bool isInserting = false, + }) { + final context = VerificationContext(); + final data = instance.toColumns(true); + if (data.containsKey('id')) { + context.handle(_idMeta, id.isAcceptableOrUnknown(data['id']!, _idMeta)); + } else if (isInserting) { + context.missing(_idMeta); + } + if (data.containsKey('created_at')) { + context.handle( + _createdAtMeta, + createdAt.isAcceptableOrUnknown(data['created_at']!, _createdAtMeta), + ); + } else if (isInserting) { + context.missing(_createdAtMeta); + } + if (data.containsKey('updated_at')) { + context.handle( + _updatedAtMeta, + updatedAt.isAcceptableOrUnknown(data['updated_at']!, _updatedAtMeta), + ); + } else if (isInserting) { + context.missing(_updatedAtMeta); + } + if (data.containsKey('deleted_at')) { + context.handle( + _deletedAtMeta, + deletedAt.isAcceptableOrUnknown(data['deleted_at']!, _deletedAtMeta), + ); + } + if (data.containsKey('schema_version')) { + context.handle( + _schemaVersionMeta, + schemaVersion.isAcceptableOrUnknown( + data['schema_version']!, + _schemaVersionMeta, + ), + ); + } + if (data.containsKey('sync_state')) { + context.handle( + _syncStateMeta, + syncState.isAcceptableOrUnknown(data['sync_state']!, _syncStateMeta), + ); + } else if (isInserting) { + context.missing(_syncStateMeta); + } + if (data.containsKey('local_revision')) { + context.handle( + _localRevisionMeta, + localRevision.isAcceptableOrUnknown( + data['local_revision']!, + _localRevisionMeta, + ), + ); + } else if (isInserting) { + context.missing(_localRevisionMeta); + } + if (data.containsKey('origin_device_id')) { + context.handle( + _originDeviceIdMeta, + originDeviceId.isAcceptableOrUnknown( + data['origin_device_id']!, + _originDeviceIdMeta, + ), + ); + } else if (isInserting) { + context.missing(_originDeviceIdMeta); + } + if (data.containsKey('future_owner_profile_id')) { + context.handle( + _futureOwnerProfileIdMeta, + futureOwnerProfileId.isAcceptableOrUnknown( + data['future_owner_profile_id']!, + _futureOwnerProfileIdMeta, + ), + ); + } + if (data.containsKey('last_synced_at')) { + context.handle( + _lastSyncedAtMeta, + lastSyncedAt.isAcceptableOrUnknown( + data['last_synced_at']!, + _lastSyncedAtMeta, + ), + ); + } + if (data.containsKey('remote_revision')) { + context.handle( + _remoteRevisionMeta, + remoteRevision.isAcceptableOrUnknown( + data['remote_revision']!, + _remoteRevisionMeta, + ), + ); + } + if (data.containsKey('workout_template_program_id')) { + context.handle( + _workoutTemplateProgramIdMeta, + workoutTemplateProgramId.isAcceptableOrUnknown( + data['workout_template_program_id']!, + _workoutTemplateProgramIdMeta, + ), + ); + } else if (isInserting) { + context.missing(_workoutTemplateProgramIdMeta); + } + if (data.containsKey('snapshot_program_exercise_id')) { + context.handle( + _snapshotProgramExerciseIdMeta, + snapshotProgramExerciseId.isAcceptableOrUnknown( + data['snapshot_program_exercise_id']!, + _snapshotProgramExerciseIdMeta, + ), + ); + } else if (isInserting) { + context.missing(_snapshotProgramExerciseIdMeta); + } + if (data.containsKey('sets_count_override')) { + context.handle( + _setsCountOverrideMeta, + setsCountOverride.isAcceptableOrUnknown( + data['sets_count_override']!, + _setsCountOverrideMeta, + ), + ); + } + if (data.containsKey('target_time_seconds_override')) { + context.handle( + _targetTimeSecondsOverrideMeta, + targetTimeSecondsOverride.isAcceptableOrUnknown( + data['target_time_seconds_override']!, + _targetTimeSecondsOverrideMeta, + ), + ); + } + if (data.containsKey('target_reps_override')) { + context.handle( + _targetRepsOverrideMeta, + targetRepsOverride.isAcceptableOrUnknown( + data['target_reps_override']!, + _targetRepsOverrideMeta, + ), + ); + } + if (data.containsKey('target_score_override')) { + context.handle( + _targetScoreOverrideMeta, + targetScoreOverride.isAcceptableOrUnknown( + data['target_score_override']!, + _targetScoreOverrideMeta, + ), + ); + } + return context; + } + + @override + Set get $primaryKey => {id}; + @override + WorkoutTemplateExerciseOverride map( + Map data, { + String? tablePrefix, + }) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return WorkoutTemplateExerciseOverride( + id: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}id'], + )!, + createdAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}created_at'], + )!, + updatedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}updated_at'], + )!, + deletedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}deleted_at'], + ), + schemaVersion: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}schema_version'], + )!, + syncState: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}sync_state'], + )!, + localRevision: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}local_revision'], + )!, + originDeviceId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}origin_device_id'], + )!, + futureOwnerProfileId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}future_owner_profile_id'], + ), + lastSyncedAt: attachedDatabase.typeMapping.read( + DriftSqlType.dateTime, + data['${effectivePrefix}last_synced_at'], + ), + remoteRevision: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}remote_revision'], + ), + workoutTemplateProgramId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}workout_template_program_id'], + )!, + snapshotProgramExerciseId: attachedDatabase.typeMapping.read( + DriftSqlType.string, + data['${effectivePrefix}snapshot_program_exercise_id'], + )!, + setsCountOverride: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}sets_count_override'], + ), + targetTimeSecondsOverride: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}target_time_seconds_override'], + ), + targetRepsOverride: attachedDatabase.typeMapping.read( + DriftSqlType.int, + data['${effectivePrefix}target_reps_override'], + ), + targetScoreOverride: attachedDatabase.typeMapping.read( + DriftSqlType.double, + data['${effectivePrefix}target_score_override'], + ), + ); + } + + @override + $WorkoutTemplateExerciseOverridesTable createAlias(String alias) { + return $WorkoutTemplateExerciseOverridesTable(attachedDatabase, alias); + } +} + +class WorkoutTemplateExerciseOverride extends DataClass + implements Insertable { + final String id; + final DateTime createdAt; + final DateTime updatedAt; + final DateTime? deletedAt; + final int schemaVersion; + final String syncState; + final int localRevision; + final String originDeviceId; + final String? futureOwnerProfileId; + final DateTime? lastSyncedAt; + final String? remoteRevision; + final String workoutTemplateProgramId; + final String snapshotProgramExerciseId; + final int? setsCountOverride; + final int? targetTimeSecondsOverride; + final int? targetRepsOverride; + final double? targetScoreOverride; + const WorkoutTemplateExerciseOverride({ + required this.id, + required this.createdAt, + required this.updatedAt, + this.deletedAt, + required this.schemaVersion, + required this.syncState, + required this.localRevision, + required this.originDeviceId, + this.futureOwnerProfileId, + this.lastSyncedAt, + this.remoteRevision, + required this.workoutTemplateProgramId, + required this.snapshotProgramExerciseId, + this.setsCountOverride, + this.targetTimeSecondsOverride, + this.targetRepsOverride, + this.targetScoreOverride, + }); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['created_at'] = Variable(createdAt); + map['updated_at'] = Variable(updatedAt); + if (!nullToAbsent || deletedAt != null) { + map['deleted_at'] = Variable(deletedAt); + } + map['schema_version'] = Variable(schemaVersion); + map['sync_state'] = Variable(syncState); + map['local_revision'] = Variable(localRevision); + map['origin_device_id'] = Variable(originDeviceId); + if (!nullToAbsent || futureOwnerProfileId != null) { + map['future_owner_profile_id'] = Variable(futureOwnerProfileId); + } + if (!nullToAbsent || lastSyncedAt != null) { + map['last_synced_at'] = Variable(lastSyncedAt); + } + if (!nullToAbsent || remoteRevision != null) { + map['remote_revision'] = Variable(remoteRevision); + } + map['workout_template_program_id'] = Variable( + workoutTemplateProgramId, + ); + map['snapshot_program_exercise_id'] = Variable( + snapshotProgramExerciseId, + ); + if (!nullToAbsent || setsCountOverride != null) { + map['sets_count_override'] = Variable(setsCountOverride); + } + if (!nullToAbsent || targetTimeSecondsOverride != null) { + map['target_time_seconds_override'] = Variable( + targetTimeSecondsOverride, + ); + } + if (!nullToAbsent || targetRepsOverride != null) { + map['target_reps_override'] = Variable(targetRepsOverride); + } + if (!nullToAbsent || targetScoreOverride != null) { + map['target_score_override'] = Variable(targetScoreOverride); + } + return map; + } + + WorkoutTemplateExerciseOverridesCompanion toCompanion(bool nullToAbsent) { + return WorkoutTemplateExerciseOverridesCompanion( + id: Value(id), + createdAt: Value(createdAt), + updatedAt: Value(updatedAt), + deletedAt: deletedAt == null && nullToAbsent + ? const Value.absent() + : Value(deletedAt), + schemaVersion: Value(schemaVersion), + syncState: Value(syncState), + localRevision: Value(localRevision), + originDeviceId: Value(originDeviceId), + futureOwnerProfileId: futureOwnerProfileId == null && nullToAbsent + ? const Value.absent() + : Value(futureOwnerProfileId), + lastSyncedAt: lastSyncedAt == null && nullToAbsent + ? const Value.absent() + : Value(lastSyncedAt), + remoteRevision: remoteRevision == null && nullToAbsent + ? const Value.absent() + : Value(remoteRevision), + workoutTemplateProgramId: Value(workoutTemplateProgramId), + snapshotProgramExerciseId: Value(snapshotProgramExerciseId), + setsCountOverride: setsCountOverride == null && nullToAbsent + ? const Value.absent() + : Value(setsCountOverride), + targetTimeSecondsOverride: + targetTimeSecondsOverride == null && nullToAbsent + ? const Value.absent() + : Value(targetTimeSecondsOverride), + targetRepsOverride: targetRepsOverride == null && nullToAbsent + ? const Value.absent() + : Value(targetRepsOverride), + targetScoreOverride: targetScoreOverride == null && nullToAbsent + ? const Value.absent() + : Value(targetScoreOverride), + ); + } + + factory WorkoutTemplateExerciseOverride.fromJson( + Map json, { + ValueSerializer? serializer, + }) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return WorkoutTemplateExerciseOverride( + id: serializer.fromJson(json['id']), + createdAt: serializer.fromJson(json['createdAt']), + updatedAt: serializer.fromJson(json['updatedAt']), + deletedAt: serializer.fromJson(json['deletedAt']), + schemaVersion: serializer.fromJson(json['schemaVersion']), + syncState: serializer.fromJson(json['syncState']), + localRevision: serializer.fromJson(json['localRevision']), + originDeviceId: serializer.fromJson(json['originDeviceId']), + futureOwnerProfileId: serializer.fromJson( + json['futureOwnerProfileId'], + ), + lastSyncedAt: serializer.fromJson(json['lastSyncedAt']), + remoteRevision: serializer.fromJson(json['remoteRevision']), + workoutTemplateProgramId: serializer.fromJson( + json['workoutTemplateProgramId'], + ), + snapshotProgramExerciseId: serializer.fromJson( + json['snapshotProgramExerciseId'], + ), + setsCountOverride: serializer.fromJson(json['setsCountOverride']), + targetTimeSecondsOverride: serializer.fromJson( + json['targetTimeSecondsOverride'], + ), + targetRepsOverride: serializer.fromJson(json['targetRepsOverride']), + targetScoreOverride: serializer.fromJson( + json['targetScoreOverride'], + ), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'createdAt': serializer.toJson(createdAt), + 'updatedAt': serializer.toJson(updatedAt), + 'deletedAt': serializer.toJson(deletedAt), + 'schemaVersion': serializer.toJson(schemaVersion), + 'syncState': serializer.toJson(syncState), + 'localRevision': serializer.toJson(localRevision), + 'originDeviceId': serializer.toJson(originDeviceId), + 'futureOwnerProfileId': serializer.toJson(futureOwnerProfileId), + 'lastSyncedAt': serializer.toJson(lastSyncedAt), + 'remoteRevision': serializer.toJson(remoteRevision), + 'workoutTemplateProgramId': serializer.toJson( + workoutTemplateProgramId, + ), + 'snapshotProgramExerciseId': serializer.toJson( + snapshotProgramExerciseId, + ), + 'setsCountOverride': serializer.toJson(setsCountOverride), + 'targetTimeSecondsOverride': serializer.toJson( + targetTimeSecondsOverride, + ), + 'targetRepsOverride': serializer.toJson(targetRepsOverride), + 'targetScoreOverride': serializer.toJson(targetScoreOverride), + }; + } + + WorkoutTemplateExerciseOverride copyWith({ + String? id, + DateTime? createdAt, + DateTime? updatedAt, + Value deletedAt = const Value.absent(), + int? schemaVersion, + String? syncState, + int? localRevision, + String? originDeviceId, + Value futureOwnerProfileId = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + Value remoteRevision = const Value.absent(), + String? workoutTemplateProgramId, + String? snapshotProgramExerciseId, + Value setsCountOverride = const Value.absent(), + Value targetTimeSecondsOverride = const Value.absent(), + Value targetRepsOverride = const Value.absent(), + Value targetScoreOverride = const Value.absent(), + }) => WorkoutTemplateExerciseOverride( + id: id ?? this.id, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt.present ? deletedAt.value : this.deletedAt, + schemaVersion: schemaVersion ?? this.schemaVersion, + syncState: syncState ?? this.syncState, + localRevision: localRevision ?? this.localRevision, + originDeviceId: originDeviceId ?? this.originDeviceId, + futureOwnerProfileId: futureOwnerProfileId.present + ? futureOwnerProfileId.value + : this.futureOwnerProfileId, + lastSyncedAt: lastSyncedAt.present ? lastSyncedAt.value : this.lastSyncedAt, + remoteRevision: remoteRevision.present + ? remoteRevision.value + : this.remoteRevision, + workoutTemplateProgramId: + workoutTemplateProgramId ?? this.workoutTemplateProgramId, + snapshotProgramExerciseId: + snapshotProgramExerciseId ?? this.snapshotProgramExerciseId, + setsCountOverride: setsCountOverride.present + ? setsCountOverride.value + : this.setsCountOverride, + targetTimeSecondsOverride: targetTimeSecondsOverride.present + ? targetTimeSecondsOverride.value + : this.targetTimeSecondsOverride, + targetRepsOverride: targetRepsOverride.present + ? targetRepsOverride.value + : this.targetRepsOverride, + targetScoreOverride: targetScoreOverride.present + ? targetScoreOverride.value + : this.targetScoreOverride, + ); + WorkoutTemplateExerciseOverride copyWithCompanion( + WorkoutTemplateExerciseOverridesCompanion data, + ) { + return WorkoutTemplateExerciseOverride( + id: data.id.present ? data.id.value : this.id, + createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt, + updatedAt: data.updatedAt.present ? data.updatedAt.value : this.updatedAt, + deletedAt: data.deletedAt.present ? data.deletedAt.value : this.deletedAt, + schemaVersion: data.schemaVersion.present + ? data.schemaVersion.value + : this.schemaVersion, + syncState: data.syncState.present ? data.syncState.value : this.syncState, + localRevision: data.localRevision.present + ? data.localRevision.value + : this.localRevision, + originDeviceId: data.originDeviceId.present + ? data.originDeviceId.value + : this.originDeviceId, + futureOwnerProfileId: data.futureOwnerProfileId.present + ? data.futureOwnerProfileId.value + : this.futureOwnerProfileId, + lastSyncedAt: data.lastSyncedAt.present + ? data.lastSyncedAt.value + : this.lastSyncedAt, + remoteRevision: data.remoteRevision.present + ? data.remoteRevision.value + : this.remoteRevision, + workoutTemplateProgramId: data.workoutTemplateProgramId.present + ? data.workoutTemplateProgramId.value + : this.workoutTemplateProgramId, + snapshotProgramExerciseId: data.snapshotProgramExerciseId.present + ? data.snapshotProgramExerciseId.value + : this.snapshotProgramExerciseId, + setsCountOverride: data.setsCountOverride.present + ? data.setsCountOverride.value + : this.setsCountOverride, + targetTimeSecondsOverride: data.targetTimeSecondsOverride.present + ? data.targetTimeSecondsOverride.value + : this.targetTimeSecondsOverride, + targetRepsOverride: data.targetRepsOverride.present + ? data.targetRepsOverride.value + : this.targetRepsOverride, + targetScoreOverride: data.targetScoreOverride.present + ? data.targetScoreOverride.value + : this.targetScoreOverride, + ); + } + + @override + String toString() { + return (StringBuffer('WorkoutTemplateExerciseOverride(') + ..write('id: $id, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('schemaVersion: $schemaVersion, ') + ..write('syncState: $syncState, ') + ..write('localRevision: $localRevision, ') + ..write('originDeviceId: $originDeviceId, ') + ..write('futureOwnerProfileId: $futureOwnerProfileId, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('remoteRevision: $remoteRevision, ') + ..write('workoutTemplateProgramId: $workoutTemplateProgramId, ') + ..write('snapshotProgramExerciseId: $snapshotProgramExerciseId, ') + ..write('setsCountOverride: $setsCountOverride, ') + ..write('targetTimeSecondsOverride: $targetTimeSecondsOverride, ') + ..write('targetRepsOverride: $targetRepsOverride, ') + ..write('targetScoreOverride: $targetScoreOverride') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash( + id, + createdAt, + updatedAt, + deletedAt, + schemaVersion, + syncState, + localRevision, + originDeviceId, + futureOwnerProfileId, + lastSyncedAt, + remoteRevision, + workoutTemplateProgramId, + snapshotProgramExerciseId, + setsCountOverride, + targetTimeSecondsOverride, + targetRepsOverride, + targetScoreOverride, + ); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is WorkoutTemplateExerciseOverride && + other.id == this.id && + other.createdAt == this.createdAt && + other.updatedAt == this.updatedAt && + other.deletedAt == this.deletedAt && + other.schemaVersion == this.schemaVersion && + other.syncState == this.syncState && + other.localRevision == this.localRevision && + other.originDeviceId == this.originDeviceId && + other.futureOwnerProfileId == this.futureOwnerProfileId && + other.lastSyncedAt == this.lastSyncedAt && + other.remoteRevision == this.remoteRevision && + other.workoutTemplateProgramId == this.workoutTemplateProgramId && + other.snapshotProgramExerciseId == this.snapshotProgramExerciseId && + other.setsCountOverride == this.setsCountOverride && + other.targetTimeSecondsOverride == this.targetTimeSecondsOverride && + other.targetRepsOverride == this.targetRepsOverride && + other.targetScoreOverride == this.targetScoreOverride); +} + +class WorkoutTemplateExerciseOverridesCompanion + extends UpdateCompanion { + final Value id; + final Value createdAt; + final Value updatedAt; + final Value deletedAt; + final Value schemaVersion; + final Value syncState; + final Value localRevision; + final Value originDeviceId; + final Value futureOwnerProfileId; + final Value lastSyncedAt; + final Value remoteRevision; + final Value workoutTemplateProgramId; + final Value snapshotProgramExerciseId; + final Value setsCountOverride; + final Value targetTimeSecondsOverride; + final Value targetRepsOverride; + final Value targetScoreOverride; + final Value rowid; + const WorkoutTemplateExerciseOverridesCompanion({ + this.id = const Value.absent(), + this.createdAt = const Value.absent(), + this.updatedAt = const Value.absent(), + this.deletedAt = const Value.absent(), + this.schemaVersion = const Value.absent(), + this.syncState = const Value.absent(), + this.localRevision = const Value.absent(), + this.originDeviceId = const Value.absent(), + this.futureOwnerProfileId = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + this.remoteRevision = const Value.absent(), + this.workoutTemplateProgramId = const Value.absent(), + this.snapshotProgramExerciseId = const Value.absent(), + this.setsCountOverride = const Value.absent(), + this.targetTimeSecondsOverride = const Value.absent(), + this.targetRepsOverride = const Value.absent(), + this.targetScoreOverride = const Value.absent(), + this.rowid = const Value.absent(), + }); + WorkoutTemplateExerciseOverridesCompanion.insert({ + required String id, + required DateTime createdAt, + required DateTime updatedAt, + this.deletedAt = const Value.absent(), + this.schemaVersion = const Value.absent(), + required String syncState, + required int localRevision, + required String originDeviceId, + this.futureOwnerProfileId = const Value.absent(), + this.lastSyncedAt = const Value.absent(), + this.remoteRevision = const Value.absent(), + required String workoutTemplateProgramId, + required String snapshotProgramExerciseId, + this.setsCountOverride = const Value.absent(), + this.targetTimeSecondsOverride = const Value.absent(), + this.targetRepsOverride = const Value.absent(), + this.targetScoreOverride = const Value.absent(), + this.rowid = const Value.absent(), + }) : id = Value(id), + createdAt = Value(createdAt), + updatedAt = Value(updatedAt), + syncState = Value(syncState), + localRevision = Value(localRevision), + originDeviceId = Value(originDeviceId), + workoutTemplateProgramId = Value(workoutTemplateProgramId), + snapshotProgramExerciseId = Value(snapshotProgramExerciseId); + static Insertable custom({ + Expression? id, + Expression? createdAt, + Expression? updatedAt, + Expression? deletedAt, + Expression? schemaVersion, + Expression? syncState, + Expression? localRevision, + Expression? originDeviceId, + Expression? futureOwnerProfileId, + Expression? lastSyncedAt, + Expression? remoteRevision, + Expression? workoutTemplateProgramId, + Expression? snapshotProgramExerciseId, + Expression? setsCountOverride, + Expression? targetTimeSecondsOverride, + Expression? targetRepsOverride, + Expression? targetScoreOverride, + Expression? rowid, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (createdAt != null) 'created_at': createdAt, + if (updatedAt != null) 'updated_at': updatedAt, + if (deletedAt != null) 'deleted_at': deletedAt, + if (schemaVersion != null) 'schema_version': schemaVersion, + if (syncState != null) 'sync_state': syncState, + if (localRevision != null) 'local_revision': localRevision, + if (originDeviceId != null) 'origin_device_id': originDeviceId, + if (futureOwnerProfileId != null) + 'future_owner_profile_id': futureOwnerProfileId, + if (lastSyncedAt != null) 'last_synced_at': lastSyncedAt, + if (remoteRevision != null) 'remote_revision': remoteRevision, + if (workoutTemplateProgramId != null) + 'workout_template_program_id': workoutTemplateProgramId, + if (snapshotProgramExerciseId != null) + 'snapshot_program_exercise_id': snapshotProgramExerciseId, + if (setsCountOverride != null) 'sets_count_override': setsCountOverride, + if (targetTimeSecondsOverride != null) + 'target_time_seconds_override': targetTimeSecondsOverride, + if (targetRepsOverride != null) + 'target_reps_override': targetRepsOverride, + if (targetScoreOverride != null) + 'target_score_override': targetScoreOverride, + if (rowid != null) 'rowid': rowid, + }); + } + + WorkoutTemplateExerciseOverridesCompanion copyWith({ + Value? id, + Value? createdAt, + Value? updatedAt, + Value? deletedAt, + Value? schemaVersion, + Value? syncState, + Value? localRevision, + Value? originDeviceId, + Value? futureOwnerProfileId, + Value? lastSyncedAt, + Value? remoteRevision, + Value? workoutTemplateProgramId, + Value? snapshotProgramExerciseId, + Value? setsCountOverride, + Value? targetTimeSecondsOverride, + Value? targetRepsOverride, + Value? targetScoreOverride, + Value? rowid, + }) { + return WorkoutTemplateExerciseOverridesCompanion( + id: id ?? this.id, + createdAt: createdAt ?? this.createdAt, + updatedAt: updatedAt ?? this.updatedAt, + deletedAt: deletedAt ?? this.deletedAt, + schemaVersion: schemaVersion ?? this.schemaVersion, + syncState: syncState ?? this.syncState, + localRevision: localRevision ?? this.localRevision, + originDeviceId: originDeviceId ?? this.originDeviceId, + futureOwnerProfileId: futureOwnerProfileId ?? this.futureOwnerProfileId, + lastSyncedAt: lastSyncedAt ?? this.lastSyncedAt, + remoteRevision: remoteRevision ?? this.remoteRevision, + workoutTemplateProgramId: + workoutTemplateProgramId ?? this.workoutTemplateProgramId, + snapshotProgramExerciseId: + snapshotProgramExerciseId ?? this.snapshotProgramExerciseId, + setsCountOverride: setsCountOverride ?? this.setsCountOverride, + targetTimeSecondsOverride: + targetTimeSecondsOverride ?? this.targetTimeSecondsOverride, + targetRepsOverride: targetRepsOverride ?? this.targetRepsOverride, + targetScoreOverride: targetScoreOverride ?? this.targetScoreOverride, + rowid: rowid ?? this.rowid, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (createdAt.present) { + map['created_at'] = Variable(createdAt.value); + } + if (updatedAt.present) { + map['updated_at'] = Variable(updatedAt.value); + } + if (deletedAt.present) { + map['deleted_at'] = Variable(deletedAt.value); + } + if (schemaVersion.present) { + map['schema_version'] = Variable(schemaVersion.value); + } + if (syncState.present) { + map['sync_state'] = Variable(syncState.value); + } + if (localRevision.present) { + map['local_revision'] = Variable(localRevision.value); + } + if (originDeviceId.present) { + map['origin_device_id'] = Variable(originDeviceId.value); + } + if (futureOwnerProfileId.present) { + map['future_owner_profile_id'] = Variable( + futureOwnerProfileId.value, + ); + } + if (lastSyncedAt.present) { + map['last_synced_at'] = Variable(lastSyncedAt.value); + } + if (remoteRevision.present) { + map['remote_revision'] = Variable(remoteRevision.value); + } + if (workoutTemplateProgramId.present) { + map['workout_template_program_id'] = Variable( + workoutTemplateProgramId.value, + ); + } + if (snapshotProgramExerciseId.present) { + map['snapshot_program_exercise_id'] = Variable( + snapshotProgramExerciseId.value, + ); + } + if (setsCountOverride.present) { + map['sets_count_override'] = Variable(setsCountOverride.value); + } + if (targetTimeSecondsOverride.present) { + map['target_time_seconds_override'] = Variable( + targetTimeSecondsOverride.value, + ); + } + if (targetRepsOverride.present) { + map['target_reps_override'] = Variable(targetRepsOverride.value); + } + if (targetScoreOverride.present) { + map['target_score_override'] = Variable( + targetScoreOverride.value, + ); + } + if (rowid.present) { + map['rowid'] = Variable(rowid.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('WorkoutTemplateExerciseOverridesCompanion(') + ..write('id: $id, ') + ..write('createdAt: $createdAt, ') + ..write('updatedAt: $updatedAt, ') + ..write('deletedAt: $deletedAt, ') + ..write('schemaVersion: $schemaVersion, ') + ..write('syncState: $syncState, ') + ..write('localRevision: $localRevision, ') + ..write('originDeviceId: $originDeviceId, ') + ..write('futureOwnerProfileId: $futureOwnerProfileId, ') + ..write('lastSyncedAt: $lastSyncedAt, ') + ..write('remoteRevision: $remoteRevision, ') + ..write('workoutTemplateProgramId: $workoutTemplateProgramId, ') + ..write('snapshotProgramExerciseId: $snapshotProgramExerciseId, ') + ..write('setsCountOverride: $setsCountOverride, ') + ..write('targetTimeSecondsOverride: $targetTimeSecondsOverride, ') + ..write('targetRepsOverride: $targetRepsOverride, ') + ..write('targetScoreOverride: $targetScoreOverride, ') + ..write('rowid: $rowid') + ..write(')')) + .toString(); + } +} + +abstract class _$AppDatabase extends GeneratedDatabase { + _$AppDatabase(QueryExecutor e) : super(e); + $AppDatabaseManager get managers => $AppDatabaseManager(this); + late final $WorkoutTemplatesTable workoutTemplates = $WorkoutTemplatesTable( + this, + ); + late final $ActiveWorkoutSessionsTable activeWorkoutSessions = + $ActiveWorkoutSessionsTable(this); + late final $ActiveRestStatesTable activeRestStates = $ActiveRestStatesTable( + this, + ); + late final $ActiveSetResultsTable activeSetResults = $ActiveSetResultsTable( + this, + ); + late final $ChangeLogEntriesTable changeLogEntries = $ChangeLogEntriesTable( + this, + ); + late final $MediaAssetsTable mediaAssets = $MediaAssetsTable(this); + late final $ExercisesTable exercises = $ExercisesTable(this); + late final $ProgramsTable programs = $ProgramsTable(this); + late final $ProgramExercisesTable programExercises = $ProgramExercisesTable( + this, + ); + late final $WorkoutHistoriesTable workoutHistories = $WorkoutHistoriesTable( + this, + ); + late final $WorkoutHistorySetResultsTable workoutHistorySetResults = + $WorkoutHistorySetResultsTable(this); + late final $WorkoutTemplateProgramsTable workoutTemplatePrograms = + $WorkoutTemplateProgramsTable(this); + late final $WorkoutTemplateExerciseOverridesTable + workoutTemplateExerciseOverrides = $WorkoutTemplateExerciseOverridesTable( + this, + ); + @override + Iterable> get allTables => + allSchemaEntities.whereType>(); + @override + List get allSchemaEntities => [ + workoutTemplates, + activeWorkoutSessions, + activeRestStates, + activeSetResults, + changeLogEntries, + mediaAssets, + exercises, + programs, + programExercises, + workoutHistories, + workoutHistorySetResults, + workoutTemplatePrograms, + workoutTemplateExerciseOverrides, + ]; +} + +typedef $$WorkoutTemplatesTableCreateCompanionBuilder = + WorkoutTemplatesCompanion Function({ + required String id, + required DateTime createdAt, + required DateTime updatedAt, + Value deletedAt, + Value schemaVersion, + required String syncState, + required int localRevision, + required String originDeviceId, + Value futureOwnerProfileId, + Value lastSyncedAt, + Value remoteRevision, + required String name, + Value lastStartedAt, + Value rowid, + }); +typedef $$WorkoutTemplatesTableUpdateCompanionBuilder = + WorkoutTemplatesCompanion Function({ + Value id, + Value createdAt, + Value updatedAt, + Value deletedAt, + Value schemaVersion, + Value syncState, + Value localRevision, + Value originDeviceId, + Value futureOwnerProfileId, + Value lastSyncedAt, + Value remoteRevision, + Value name, + Value lastStartedAt, + Value rowid, + }); + +final class $$WorkoutTemplatesTableReferences + extends + BaseReferences<_$AppDatabase, $WorkoutTemplatesTable, WorkoutTemplate> { + $$WorkoutTemplatesTableReferences( + super.$_db, + super.$_table, + super.$_typedResult, + ); + + static MultiTypedResultKey< + $ActiveWorkoutSessionsTable, + List + > + _activeWorkoutSessionsRefsTable( + _$AppDatabase db, + ) => MultiTypedResultKey.fromTable( + db.activeWorkoutSessions, + aliasName: + 'workout_templates__id__active_workout_sessions__source_workout_template_id', + ); + + $$ActiveWorkoutSessionsTableProcessedTableManager + get activeWorkoutSessionsRefs { + final manager = + $$ActiveWorkoutSessionsTableTableManager( + $_db, + $_db.activeWorkoutSessions, + ).filter( + (f) => f.sourceWorkoutTemplateId.id.sqlEquals( + $_itemColumn('id')!, + ), + ); + + final cache = $_typedResult.readTableOrNull( + _activeWorkoutSessionsRefsTable($_db), + ); + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: cache), + ); + } + + static MultiTypedResultKey<$WorkoutHistoriesTable, List> + _workoutHistoriesRefsTable(_$AppDatabase db) => MultiTypedResultKey.fromTable( + db.workoutHistories, + aliasName: + 'workout_templates__id__workout_history__source_workout_template_id', + ); + + $$WorkoutHistoriesTableProcessedTableManager get workoutHistoriesRefs { + final manager = + $$WorkoutHistoriesTableTableManager($_db, $_db.workoutHistories).filter( + (f) => f.sourceWorkoutTemplateId.id.sqlEquals( + $_itemColumn('id')!, + ), + ); + + final cache = $_typedResult.readTableOrNull( + _workoutHistoriesRefsTable($_db), + ); + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: cache), + ); + } + + static MultiTypedResultKey< + $WorkoutTemplateProgramsTable, + List + > + _workoutTemplateProgramsRefsTable( + _$AppDatabase db, + ) => MultiTypedResultKey.fromTable( + db.workoutTemplatePrograms, + aliasName: + 'workout_templates__id__workout_template_programs__workout_template_id', + ); + + $$WorkoutTemplateProgramsTableProcessedTableManager + get workoutTemplateProgramsRefs { + final manager = + $$WorkoutTemplateProgramsTableTableManager( + $_db, + $_db.workoutTemplatePrograms, + ).filter( + (f) => f.workoutTemplateId.id.sqlEquals($_itemColumn('id')!), + ); + + final cache = $_typedResult.readTableOrNull( + _workoutTemplateProgramsRefsTable($_db), + ); + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: cache), + ); + } +} + +class $$WorkoutTemplatesTableFilterComposer + extends Composer<_$AppDatabase, $WorkoutTemplatesTable> { + $$WorkoutTemplatesTableFilterComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnFilters get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get createdAt => $composableBuilder( + column: $table.createdAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get updatedAt => $composableBuilder( + column: $table.updatedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get deletedAt => $composableBuilder( + column: $table.deletedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get schemaVersion => $composableBuilder( + column: $table.schemaVersion, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get syncState => $composableBuilder( + column: $table.syncState, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get futureOwnerProfileId => $composableBuilder( + column: $table.futureOwnerProfileId, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get lastSyncedAt => $composableBuilder( + column: $table.lastSyncedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get remoteRevision => $composableBuilder( + column: $table.remoteRevision, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get name => $composableBuilder( + column: $table.name, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get lastStartedAt => $composableBuilder( + column: $table.lastStartedAt, + builder: (column) => ColumnFilters(column), + ); + + Expression activeWorkoutSessionsRefs( + Expression Function($$ActiveWorkoutSessionsTableFilterComposer f) f, + ) { + final $$ActiveWorkoutSessionsTableFilterComposer composer = + $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.activeWorkoutSessions, + getReferencedColumn: (t) => t.sourceWorkoutTemplateId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ActiveWorkoutSessionsTableFilterComposer( + $db: $db, + $table: $db.activeWorkoutSessions, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } + + Expression workoutHistoriesRefs( + Expression Function($$WorkoutHistoriesTableFilterComposer f) f, + ) { + final $$WorkoutHistoriesTableFilterComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.workoutHistories, + getReferencedColumn: (t) => t.sourceWorkoutTemplateId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$WorkoutHistoriesTableFilterComposer( + $db: $db, + $table: $db.workoutHistories, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } + + Expression workoutTemplateProgramsRefs( + Expression Function($$WorkoutTemplateProgramsTableFilterComposer f) f, + ) { + final $$WorkoutTemplateProgramsTableFilterComposer composer = + $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.workoutTemplatePrograms, + getReferencedColumn: (t) => t.workoutTemplateId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$WorkoutTemplateProgramsTableFilterComposer( + $db: $db, + $table: $db.workoutTemplatePrograms, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } +} + +class $$WorkoutTemplatesTableOrderingComposer + extends Composer<_$AppDatabase, $WorkoutTemplatesTable> { + $$WorkoutTemplatesTableOrderingComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnOrderings get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get createdAt => $composableBuilder( + column: $table.createdAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get updatedAt => $composableBuilder( + column: $table.updatedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get deletedAt => $composableBuilder( + column: $table.deletedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get schemaVersion => $composableBuilder( + column: $table.schemaVersion, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get syncState => $composableBuilder( + column: $table.syncState, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get futureOwnerProfileId => $composableBuilder( + column: $table.futureOwnerProfileId, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get lastSyncedAt => $composableBuilder( + column: $table.lastSyncedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get remoteRevision => $composableBuilder( + column: $table.remoteRevision, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get name => $composableBuilder( + column: $table.name, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get lastStartedAt => $composableBuilder( + column: $table.lastStartedAt, + builder: (column) => ColumnOrderings(column), + ); +} + +class $$WorkoutTemplatesTableAnnotationComposer + extends Composer<_$AppDatabase, $WorkoutTemplatesTable> { + $$WorkoutTemplatesTableAnnotationComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + GeneratedColumn get id => + $composableBuilder(column: $table.id, builder: (column) => column); + + GeneratedColumn get createdAt => + $composableBuilder(column: $table.createdAt, builder: (column) => column); + + GeneratedColumn get updatedAt => + $composableBuilder(column: $table.updatedAt, builder: (column) => column); + + GeneratedColumn get deletedAt => + $composableBuilder(column: $table.deletedAt, builder: (column) => column); + + GeneratedColumn get schemaVersion => $composableBuilder( + column: $table.schemaVersion, + builder: (column) => column, + ); + + GeneratedColumn get syncState => + $composableBuilder(column: $table.syncState, builder: (column) => column); + + GeneratedColumn get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => column, + ); + + GeneratedColumn get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => column, + ); + + GeneratedColumn get futureOwnerProfileId => $composableBuilder( + column: $table.futureOwnerProfileId, + builder: (column) => column, + ); + + GeneratedColumn get lastSyncedAt => $composableBuilder( + column: $table.lastSyncedAt, + builder: (column) => column, + ); + + GeneratedColumn get remoteRevision => $composableBuilder( + column: $table.remoteRevision, + builder: (column) => column, + ); + + GeneratedColumn get name => + $composableBuilder(column: $table.name, builder: (column) => column); + + GeneratedColumn get lastStartedAt => $composableBuilder( + column: $table.lastStartedAt, + builder: (column) => column, + ); + + Expression activeWorkoutSessionsRefs( + Expression Function($$ActiveWorkoutSessionsTableAnnotationComposer a) f, + ) { + final $$ActiveWorkoutSessionsTableAnnotationComposer composer = + $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.activeWorkoutSessions, + getReferencedColumn: (t) => t.sourceWorkoutTemplateId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ActiveWorkoutSessionsTableAnnotationComposer( + $db: $db, + $table: $db.activeWorkoutSessions, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } + + Expression workoutHistoriesRefs( + Expression Function($$WorkoutHistoriesTableAnnotationComposer a) f, + ) { + final $$WorkoutHistoriesTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.workoutHistories, + getReferencedColumn: (t) => t.sourceWorkoutTemplateId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$WorkoutHistoriesTableAnnotationComposer( + $db: $db, + $table: $db.workoutHistories, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } + + Expression workoutTemplateProgramsRefs( + Expression Function($$WorkoutTemplateProgramsTableAnnotationComposer a) + f, + ) { + final $$WorkoutTemplateProgramsTableAnnotationComposer composer = + $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.workoutTemplatePrograms, + getReferencedColumn: (t) => t.workoutTemplateId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$WorkoutTemplateProgramsTableAnnotationComposer( + $db: $db, + $table: $db.workoutTemplatePrograms, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } +} + +class $$WorkoutTemplatesTableTableManager + extends + RootTableManager< + _$AppDatabase, + $WorkoutTemplatesTable, + WorkoutTemplate, + $$WorkoutTemplatesTableFilterComposer, + $$WorkoutTemplatesTableOrderingComposer, + $$WorkoutTemplatesTableAnnotationComposer, + $$WorkoutTemplatesTableCreateCompanionBuilder, + $$WorkoutTemplatesTableUpdateCompanionBuilder, + (WorkoutTemplate, $$WorkoutTemplatesTableReferences), + WorkoutTemplate, + PrefetchHooks Function({ + bool activeWorkoutSessionsRefs, + bool workoutHistoriesRefs, + bool workoutTemplateProgramsRefs, + }) + > { + $$WorkoutTemplatesTableTableManager( + _$AppDatabase db, + $WorkoutTemplatesTable table, + ) : super( + TableManagerState( + db: db, + table: table, + createFilteringComposer: () => + $$WorkoutTemplatesTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => + $$WorkoutTemplatesTableOrderingComposer($db: db, $table: table), + createComputedFieldComposer: () => + $$WorkoutTemplatesTableAnnotationComposer($db: db, $table: table), + updateCompanionCallback: + ({ + Value id = const Value.absent(), + Value createdAt = const Value.absent(), + Value updatedAt = const Value.absent(), + Value deletedAt = const Value.absent(), + Value schemaVersion = const Value.absent(), + Value syncState = const Value.absent(), + Value localRevision = const Value.absent(), + Value originDeviceId = const Value.absent(), + Value futureOwnerProfileId = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + Value remoteRevision = const Value.absent(), + Value name = const Value.absent(), + Value lastStartedAt = const Value.absent(), + Value rowid = const Value.absent(), + }) => WorkoutTemplatesCompanion( + id: id, + createdAt: createdAt, + updatedAt: updatedAt, + deletedAt: deletedAt, + schemaVersion: schemaVersion, + syncState: syncState, + localRevision: localRevision, + originDeviceId: originDeviceId, + futureOwnerProfileId: futureOwnerProfileId, + lastSyncedAt: lastSyncedAt, + remoteRevision: remoteRevision, + name: name, + lastStartedAt: lastStartedAt, + rowid: rowid, + ), + createCompanionCallback: + ({ + required String id, + required DateTime createdAt, + required DateTime updatedAt, + Value deletedAt = const Value.absent(), + Value schemaVersion = const Value.absent(), + required String syncState, + required int localRevision, + required String originDeviceId, + Value futureOwnerProfileId = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + Value remoteRevision = const Value.absent(), + required String name, + Value lastStartedAt = const Value.absent(), + Value rowid = const Value.absent(), + }) => WorkoutTemplatesCompanion.insert( + id: id, + createdAt: createdAt, + updatedAt: updatedAt, + deletedAt: deletedAt, + schemaVersion: schemaVersion, + syncState: syncState, + localRevision: localRevision, + originDeviceId: originDeviceId, + futureOwnerProfileId: futureOwnerProfileId, + lastSyncedAt: lastSyncedAt, + remoteRevision: remoteRevision, + name: name, + lastStartedAt: lastStartedAt, + rowid: rowid, + ), + withReferenceMapper: (p0) => p0 + .map( + (e) => ( + e.readTable(table), + $$WorkoutTemplatesTableReferences(db, table, e), + ), + ) + .toList(), + prefetchHooksCallback: + ({ + activeWorkoutSessionsRefs = false, + workoutHistoriesRefs = false, + workoutTemplateProgramsRefs = false, + }) { + return PrefetchHooks( + db: db, + explicitlyWatchedTables: [ + if (activeWorkoutSessionsRefs) db.activeWorkoutSessions, + if (workoutHistoriesRefs) db.workoutHistories, + if (workoutTemplateProgramsRefs) db.workoutTemplatePrograms, + ], + addJoins: null, + getPrefetchedDataCallback: (items) async { + return [ + if (activeWorkoutSessionsRefs) + await $_getPrefetchedData< + WorkoutTemplate, + $WorkoutTemplatesTable, + ActiveWorkoutSession + >( + currentTable: table, + referencedTable: $$WorkoutTemplatesTableReferences + ._activeWorkoutSessionsRefsTable(db), + managerFromTypedResult: (p0) => + $$WorkoutTemplatesTableReferences( + db, + table, + p0, + ).activeWorkoutSessionsRefs, + referencedItemsForCurrentItem: + (item, referencedItems) => referencedItems.where( + (e) => e.sourceWorkoutTemplateId == item.id, + ), + typedResults: items, + ), + if (workoutHistoriesRefs) + await $_getPrefetchedData< + WorkoutTemplate, + $WorkoutTemplatesTable, + WorkoutHistory + >( + currentTable: table, + referencedTable: $$WorkoutTemplatesTableReferences + ._workoutHistoriesRefsTable(db), + managerFromTypedResult: (p0) => + $$WorkoutTemplatesTableReferences( + db, + table, + p0, + ).workoutHistoriesRefs, + referencedItemsForCurrentItem: + (item, referencedItems) => referencedItems.where( + (e) => e.sourceWorkoutTemplateId == item.id, + ), + typedResults: items, + ), + if (workoutTemplateProgramsRefs) + await $_getPrefetchedData< + WorkoutTemplate, + $WorkoutTemplatesTable, + WorkoutTemplateProgram + >( + currentTable: table, + referencedTable: $$WorkoutTemplatesTableReferences + ._workoutTemplateProgramsRefsTable(db), + managerFromTypedResult: (p0) => + $$WorkoutTemplatesTableReferences( + db, + table, + p0, + ).workoutTemplateProgramsRefs, + referencedItemsForCurrentItem: + (item, referencedItems) => referencedItems.where( + (e) => e.workoutTemplateId == item.id, + ), + typedResults: items, + ), + ]; + }, + ); + }, + ), + ); +} + +typedef $$WorkoutTemplatesTableProcessedTableManager = + ProcessedTableManager< + _$AppDatabase, + $WorkoutTemplatesTable, + WorkoutTemplate, + $$WorkoutTemplatesTableFilterComposer, + $$WorkoutTemplatesTableOrderingComposer, + $$WorkoutTemplatesTableAnnotationComposer, + $$WorkoutTemplatesTableCreateCompanionBuilder, + $$WorkoutTemplatesTableUpdateCompanionBuilder, + (WorkoutTemplate, $$WorkoutTemplatesTableReferences), + WorkoutTemplate, + PrefetchHooks Function({ + bool activeWorkoutSessionsRefs, + bool workoutHistoriesRefs, + bool workoutTemplateProgramsRefs, + }) + >; +typedef $$ActiveWorkoutSessionsTableCreateCompanionBuilder = + ActiveWorkoutSessionsCompanion Function({ + required String id, + required DateTime createdAt, + required DateTime updatedAt, + Value deletedAt, + Value schemaVersion, + required String syncState, + required int localRevision, + required String originDeviceId, + Value futureOwnerProfileId, + Value lastSyncedAt, + Value remoteRevision, + Value sourceWorkoutTemplateId, + required String status, + required DateTime startedAt, + Value pausedAt, + Value endedAt, + required DateTime lastPersistedAt, + required int elapsedActiveMs, + required int currentProgramIndex, + required int currentExerciseIndex, + required int currentSetIndex, + required String resolvedTemplateSnapshotJson, + Value rowid, + }); +typedef $$ActiveWorkoutSessionsTableUpdateCompanionBuilder = + ActiveWorkoutSessionsCompanion Function({ + Value id, + Value createdAt, + Value updatedAt, + Value deletedAt, + Value schemaVersion, + Value syncState, + Value localRevision, + Value originDeviceId, + Value futureOwnerProfileId, + Value lastSyncedAt, + Value remoteRevision, + Value sourceWorkoutTemplateId, + Value status, + Value startedAt, + Value pausedAt, + Value endedAt, + Value lastPersistedAt, + Value elapsedActiveMs, + Value currentProgramIndex, + Value currentExerciseIndex, + Value currentSetIndex, + Value resolvedTemplateSnapshotJson, + Value rowid, + }); + +final class $$ActiveWorkoutSessionsTableReferences + extends + BaseReferences< + _$AppDatabase, + $ActiveWorkoutSessionsTable, + ActiveWorkoutSession + > { + $$ActiveWorkoutSessionsTableReferences( + super.$_db, + super.$_table, + super.$_typedResult, + ); + + static $WorkoutTemplatesTable _sourceWorkoutTemplateIdTable( + _$AppDatabase db, + ) => db.workoutTemplates.createAlias( + 'active_workout_sessions__source_workout_template_id__workout_templates__id', + ); + + $$WorkoutTemplatesTableProcessedTableManager? get sourceWorkoutTemplateId { + final $_column = $_itemColumn('source_workout_template_id'); + if ($_column == null) return null; + final manager = $$WorkoutTemplatesTableTableManager( + $_db, + $_db.workoutTemplates, + ).filter((f) => f.id.sqlEquals($_column)); + final item = $_typedResult.readTableOrNull( + _sourceWorkoutTemplateIdTable($_db), + ); + if (item == null) return manager; + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: [item]), + ); + } + + static MultiTypedResultKey<$ActiveRestStatesTable, List> + _activeRestStatesRefsTable(_$AppDatabase db) => MultiTypedResultKey.fromTable( + db.activeRestStates, + aliasName: + 'active_workout_sessions__id__active_rest_states__active_workout_session_id', + ); + + $$ActiveRestStatesTableProcessedTableManager get activeRestStatesRefs { + final manager = + $$ActiveRestStatesTableTableManager($_db, $_db.activeRestStates).filter( + (f) => f.activeWorkoutSessionId.id.sqlEquals( + $_itemColumn('id')!, + ), + ); + + final cache = $_typedResult.readTableOrNull( + _activeRestStatesRefsTable($_db), + ); + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: cache), + ); + } + + static MultiTypedResultKey<$ActiveSetResultsTable, List> + _activeSetResultsRefsTable(_$AppDatabase db) => MultiTypedResultKey.fromTable( + db.activeSetResults, + aliasName: + 'active_workout_sessions__id__active_set_results__active_workout_session_id', + ); + + $$ActiveSetResultsTableProcessedTableManager get activeSetResultsRefs { + final manager = + $$ActiveSetResultsTableTableManager($_db, $_db.activeSetResults).filter( + (f) => f.activeWorkoutSessionId.id.sqlEquals( + $_itemColumn('id')!, + ), + ); + + final cache = $_typedResult.readTableOrNull( + _activeSetResultsRefsTable($_db), + ); + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: cache), + ); + } + + static MultiTypedResultKey<$WorkoutHistoriesTable, List> + _workoutHistoriesRefsTable(_$AppDatabase db) => MultiTypedResultKey.fromTable( + db.workoutHistories, + aliasName: + 'active_workout_sessions__id__workout_history__source_active_workout_session_id', + ); + + $$WorkoutHistoriesTableProcessedTableManager get workoutHistoriesRefs { + final manager = + $$WorkoutHistoriesTableTableManager($_db, $_db.workoutHistories).filter( + (f) => f.sourceActiveWorkoutSessionId.id.sqlEquals( + $_itemColumn('id')!, + ), + ); + + final cache = $_typedResult.readTableOrNull( + _workoutHistoriesRefsTable($_db), + ); + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: cache), + ); + } +} + +class $$ActiveWorkoutSessionsTableFilterComposer + extends Composer<_$AppDatabase, $ActiveWorkoutSessionsTable> { + $$ActiveWorkoutSessionsTableFilterComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnFilters get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get createdAt => $composableBuilder( + column: $table.createdAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get updatedAt => $composableBuilder( + column: $table.updatedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get deletedAt => $composableBuilder( + column: $table.deletedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get schemaVersion => $composableBuilder( + column: $table.schemaVersion, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get syncState => $composableBuilder( + column: $table.syncState, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get futureOwnerProfileId => $composableBuilder( + column: $table.futureOwnerProfileId, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get lastSyncedAt => $composableBuilder( + column: $table.lastSyncedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get remoteRevision => $composableBuilder( + column: $table.remoteRevision, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get status => $composableBuilder( + column: $table.status, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get startedAt => $composableBuilder( + column: $table.startedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get pausedAt => $composableBuilder( + column: $table.pausedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get endedAt => $composableBuilder( + column: $table.endedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get lastPersistedAt => $composableBuilder( + column: $table.lastPersistedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get elapsedActiveMs => $composableBuilder( + column: $table.elapsedActiveMs, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get currentProgramIndex => $composableBuilder( + column: $table.currentProgramIndex, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get currentExerciseIndex => $composableBuilder( + column: $table.currentExerciseIndex, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get currentSetIndex => $composableBuilder( + column: $table.currentSetIndex, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get resolvedTemplateSnapshotJson => $composableBuilder( + column: $table.resolvedTemplateSnapshotJson, + builder: (column) => ColumnFilters(column), + ); + + $$WorkoutTemplatesTableFilterComposer get sourceWorkoutTemplateId { + final $$WorkoutTemplatesTableFilterComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.sourceWorkoutTemplateId, + referencedTable: $db.workoutTemplates, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$WorkoutTemplatesTableFilterComposer( + $db: $db, + $table: $db.workoutTemplates, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } + + Expression activeRestStatesRefs( + Expression Function($$ActiveRestStatesTableFilterComposer f) f, + ) { + final $$ActiveRestStatesTableFilterComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.activeRestStates, + getReferencedColumn: (t) => t.activeWorkoutSessionId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ActiveRestStatesTableFilterComposer( + $db: $db, + $table: $db.activeRestStates, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } + + Expression activeSetResultsRefs( + Expression Function($$ActiveSetResultsTableFilterComposer f) f, + ) { + final $$ActiveSetResultsTableFilterComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.activeSetResults, + getReferencedColumn: (t) => t.activeWorkoutSessionId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ActiveSetResultsTableFilterComposer( + $db: $db, + $table: $db.activeSetResults, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } + + Expression workoutHistoriesRefs( + Expression Function($$WorkoutHistoriesTableFilterComposer f) f, + ) { + final $$WorkoutHistoriesTableFilterComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.workoutHistories, + getReferencedColumn: (t) => t.sourceActiveWorkoutSessionId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$WorkoutHistoriesTableFilterComposer( + $db: $db, + $table: $db.workoutHistories, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } +} + +class $$ActiveWorkoutSessionsTableOrderingComposer + extends Composer<_$AppDatabase, $ActiveWorkoutSessionsTable> { + $$ActiveWorkoutSessionsTableOrderingComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnOrderings get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get createdAt => $composableBuilder( + column: $table.createdAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get updatedAt => $composableBuilder( + column: $table.updatedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get deletedAt => $composableBuilder( + column: $table.deletedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get schemaVersion => $composableBuilder( + column: $table.schemaVersion, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get syncState => $composableBuilder( + column: $table.syncState, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get futureOwnerProfileId => $composableBuilder( + column: $table.futureOwnerProfileId, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get lastSyncedAt => $composableBuilder( + column: $table.lastSyncedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get remoteRevision => $composableBuilder( + column: $table.remoteRevision, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get status => $composableBuilder( + column: $table.status, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get startedAt => $composableBuilder( + column: $table.startedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get pausedAt => $composableBuilder( + column: $table.pausedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get endedAt => $composableBuilder( + column: $table.endedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get lastPersistedAt => $composableBuilder( + column: $table.lastPersistedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get elapsedActiveMs => $composableBuilder( + column: $table.elapsedActiveMs, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get currentProgramIndex => $composableBuilder( + column: $table.currentProgramIndex, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get currentExerciseIndex => $composableBuilder( + column: $table.currentExerciseIndex, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get currentSetIndex => $composableBuilder( + column: $table.currentSetIndex, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get resolvedTemplateSnapshotJson => + $composableBuilder( + column: $table.resolvedTemplateSnapshotJson, + builder: (column) => ColumnOrderings(column), + ); + + $$WorkoutTemplatesTableOrderingComposer get sourceWorkoutTemplateId { + final $$WorkoutTemplatesTableOrderingComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.sourceWorkoutTemplateId, + referencedTable: $db.workoutTemplates, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$WorkoutTemplatesTableOrderingComposer( + $db: $db, + $table: $db.workoutTemplates, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } +} + +class $$ActiveWorkoutSessionsTableAnnotationComposer + extends Composer<_$AppDatabase, $ActiveWorkoutSessionsTable> { + $$ActiveWorkoutSessionsTableAnnotationComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + GeneratedColumn get id => + $composableBuilder(column: $table.id, builder: (column) => column); + + GeneratedColumn get createdAt => + $composableBuilder(column: $table.createdAt, builder: (column) => column); + + GeneratedColumn get updatedAt => + $composableBuilder(column: $table.updatedAt, builder: (column) => column); + + GeneratedColumn get deletedAt => + $composableBuilder(column: $table.deletedAt, builder: (column) => column); + + GeneratedColumn get schemaVersion => $composableBuilder( + column: $table.schemaVersion, + builder: (column) => column, + ); + + GeneratedColumn get syncState => + $composableBuilder(column: $table.syncState, builder: (column) => column); + + GeneratedColumn get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => column, + ); + + GeneratedColumn get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => column, + ); + + GeneratedColumn get futureOwnerProfileId => $composableBuilder( + column: $table.futureOwnerProfileId, + builder: (column) => column, + ); + + GeneratedColumn get lastSyncedAt => $composableBuilder( + column: $table.lastSyncedAt, + builder: (column) => column, + ); + + GeneratedColumn get remoteRevision => $composableBuilder( + column: $table.remoteRevision, + builder: (column) => column, + ); + + GeneratedColumn get status => + $composableBuilder(column: $table.status, builder: (column) => column); + + GeneratedColumn get startedAt => + $composableBuilder(column: $table.startedAt, builder: (column) => column); + + GeneratedColumn get pausedAt => + $composableBuilder(column: $table.pausedAt, builder: (column) => column); + + GeneratedColumn get endedAt => + $composableBuilder(column: $table.endedAt, builder: (column) => column); + + GeneratedColumn get lastPersistedAt => $composableBuilder( + column: $table.lastPersistedAt, + builder: (column) => column, + ); + + GeneratedColumn get elapsedActiveMs => $composableBuilder( + column: $table.elapsedActiveMs, + builder: (column) => column, + ); + + GeneratedColumn get currentProgramIndex => $composableBuilder( + column: $table.currentProgramIndex, + builder: (column) => column, + ); + + GeneratedColumn get currentExerciseIndex => $composableBuilder( + column: $table.currentExerciseIndex, + builder: (column) => column, + ); + + GeneratedColumn get currentSetIndex => $composableBuilder( + column: $table.currentSetIndex, + builder: (column) => column, + ); + + GeneratedColumn get resolvedTemplateSnapshotJson => + $composableBuilder( + column: $table.resolvedTemplateSnapshotJson, + builder: (column) => column, + ); + + $$WorkoutTemplatesTableAnnotationComposer get sourceWorkoutTemplateId { + final $$WorkoutTemplatesTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.sourceWorkoutTemplateId, + referencedTable: $db.workoutTemplates, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$WorkoutTemplatesTableAnnotationComposer( + $db: $db, + $table: $db.workoutTemplates, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } + + Expression activeRestStatesRefs( + Expression Function($$ActiveRestStatesTableAnnotationComposer a) f, + ) { + final $$ActiveRestStatesTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.activeRestStates, + getReferencedColumn: (t) => t.activeWorkoutSessionId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ActiveRestStatesTableAnnotationComposer( + $db: $db, + $table: $db.activeRestStates, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } + + Expression activeSetResultsRefs( + Expression Function($$ActiveSetResultsTableAnnotationComposer a) f, + ) { + final $$ActiveSetResultsTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.activeSetResults, + getReferencedColumn: (t) => t.activeWorkoutSessionId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ActiveSetResultsTableAnnotationComposer( + $db: $db, + $table: $db.activeSetResults, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } + + Expression workoutHistoriesRefs( + Expression Function($$WorkoutHistoriesTableAnnotationComposer a) f, + ) { + final $$WorkoutHistoriesTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.workoutHistories, + getReferencedColumn: (t) => t.sourceActiveWorkoutSessionId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$WorkoutHistoriesTableAnnotationComposer( + $db: $db, + $table: $db.workoutHistories, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } +} + +class $$ActiveWorkoutSessionsTableTableManager + extends + RootTableManager< + _$AppDatabase, + $ActiveWorkoutSessionsTable, + ActiveWorkoutSession, + $$ActiveWorkoutSessionsTableFilterComposer, + $$ActiveWorkoutSessionsTableOrderingComposer, + $$ActiveWorkoutSessionsTableAnnotationComposer, + $$ActiveWorkoutSessionsTableCreateCompanionBuilder, + $$ActiveWorkoutSessionsTableUpdateCompanionBuilder, + (ActiveWorkoutSession, $$ActiveWorkoutSessionsTableReferences), + ActiveWorkoutSession, + PrefetchHooks Function({ + bool sourceWorkoutTemplateId, + bool activeRestStatesRefs, + bool activeSetResultsRefs, + bool workoutHistoriesRefs, + }) + > { + $$ActiveWorkoutSessionsTableTableManager( + _$AppDatabase db, + $ActiveWorkoutSessionsTable table, + ) : super( + TableManagerState( + db: db, + table: table, + createFilteringComposer: () => + $$ActiveWorkoutSessionsTableFilterComposer( + $db: db, + $table: table, + ), + createOrderingComposer: () => + $$ActiveWorkoutSessionsTableOrderingComposer( + $db: db, + $table: table, + ), + createComputedFieldComposer: () => + $$ActiveWorkoutSessionsTableAnnotationComposer( + $db: db, + $table: table, + ), + updateCompanionCallback: + ({ + Value id = const Value.absent(), + Value createdAt = const Value.absent(), + Value updatedAt = const Value.absent(), + Value deletedAt = const Value.absent(), + Value schemaVersion = const Value.absent(), + Value syncState = const Value.absent(), + Value localRevision = const Value.absent(), + Value originDeviceId = const Value.absent(), + Value futureOwnerProfileId = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + Value remoteRevision = const Value.absent(), + Value sourceWorkoutTemplateId = const Value.absent(), + Value status = const Value.absent(), + Value startedAt = const Value.absent(), + Value pausedAt = const Value.absent(), + Value endedAt = const Value.absent(), + Value lastPersistedAt = const Value.absent(), + Value elapsedActiveMs = const Value.absent(), + Value currentProgramIndex = const Value.absent(), + Value currentExerciseIndex = const Value.absent(), + Value currentSetIndex = const Value.absent(), + Value resolvedTemplateSnapshotJson = + const Value.absent(), + Value rowid = const Value.absent(), + }) => ActiveWorkoutSessionsCompanion( + id: id, + createdAt: createdAt, + updatedAt: updatedAt, + deletedAt: deletedAt, + schemaVersion: schemaVersion, + syncState: syncState, + localRevision: localRevision, + originDeviceId: originDeviceId, + futureOwnerProfileId: futureOwnerProfileId, + lastSyncedAt: lastSyncedAt, + remoteRevision: remoteRevision, + sourceWorkoutTemplateId: sourceWorkoutTemplateId, + status: status, + startedAt: startedAt, + pausedAt: pausedAt, + endedAt: endedAt, + lastPersistedAt: lastPersistedAt, + elapsedActiveMs: elapsedActiveMs, + currentProgramIndex: currentProgramIndex, + currentExerciseIndex: currentExerciseIndex, + currentSetIndex: currentSetIndex, + resolvedTemplateSnapshotJson: resolvedTemplateSnapshotJson, + rowid: rowid, + ), + createCompanionCallback: + ({ + required String id, + required DateTime createdAt, + required DateTime updatedAt, + Value deletedAt = const Value.absent(), + Value schemaVersion = const Value.absent(), + required String syncState, + required int localRevision, + required String originDeviceId, + Value futureOwnerProfileId = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + Value remoteRevision = const Value.absent(), + Value sourceWorkoutTemplateId = const Value.absent(), + required String status, + required DateTime startedAt, + Value pausedAt = const Value.absent(), + Value endedAt = const Value.absent(), + required DateTime lastPersistedAt, + required int elapsedActiveMs, + required int currentProgramIndex, + required int currentExerciseIndex, + required int currentSetIndex, + required String resolvedTemplateSnapshotJson, + Value rowid = const Value.absent(), + }) => ActiveWorkoutSessionsCompanion.insert( + id: id, + createdAt: createdAt, + updatedAt: updatedAt, + deletedAt: deletedAt, + schemaVersion: schemaVersion, + syncState: syncState, + localRevision: localRevision, + originDeviceId: originDeviceId, + futureOwnerProfileId: futureOwnerProfileId, + lastSyncedAt: lastSyncedAt, + remoteRevision: remoteRevision, + sourceWorkoutTemplateId: sourceWorkoutTemplateId, + status: status, + startedAt: startedAt, + pausedAt: pausedAt, + endedAt: endedAt, + lastPersistedAt: lastPersistedAt, + elapsedActiveMs: elapsedActiveMs, + currentProgramIndex: currentProgramIndex, + currentExerciseIndex: currentExerciseIndex, + currentSetIndex: currentSetIndex, + resolvedTemplateSnapshotJson: resolvedTemplateSnapshotJson, + rowid: rowid, + ), + withReferenceMapper: (p0) => p0 + .map( + (e) => ( + e.readTable(table), + $$ActiveWorkoutSessionsTableReferences(db, table, e), + ), + ) + .toList(), + prefetchHooksCallback: + ({ + sourceWorkoutTemplateId = false, + activeRestStatesRefs = false, + activeSetResultsRefs = false, + workoutHistoriesRefs = false, + }) { + return PrefetchHooks( + db: db, + explicitlyWatchedTables: [ + if (activeRestStatesRefs) db.activeRestStates, + if (activeSetResultsRefs) db.activeSetResults, + if (workoutHistoriesRefs) db.workoutHistories, + ], + addJoins: + < + T extends TableManagerState< + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic + > + >(state) { + if (sourceWorkoutTemplateId) { + state = + state.withJoin( + currentTable: table, + currentColumn: + table.sourceWorkoutTemplateId, + referencedTable: + $$ActiveWorkoutSessionsTableReferences + ._sourceWorkoutTemplateIdTable(db), + referencedColumn: + $$ActiveWorkoutSessionsTableReferences + ._sourceWorkoutTemplateIdTable(db) + .id, + ) + as T; + } + + return state; + }, + getPrefetchedDataCallback: (items) async { + return [ + if (activeRestStatesRefs) + await $_getPrefetchedData< + ActiveWorkoutSession, + $ActiveWorkoutSessionsTable, + ActiveRestState + >( + currentTable: table, + referencedTable: + $$ActiveWorkoutSessionsTableReferences + ._activeRestStatesRefsTable(db), + managerFromTypedResult: (p0) => + $$ActiveWorkoutSessionsTableReferences( + db, + table, + p0, + ).activeRestStatesRefs, + referencedItemsForCurrentItem: + (item, referencedItems) => referencedItems.where( + (e) => e.activeWorkoutSessionId == item.id, + ), + typedResults: items, + ), + if (activeSetResultsRefs) + await $_getPrefetchedData< + ActiveWorkoutSession, + $ActiveWorkoutSessionsTable, + ActiveSetResult + >( + currentTable: table, + referencedTable: + $$ActiveWorkoutSessionsTableReferences + ._activeSetResultsRefsTable(db), + managerFromTypedResult: (p0) => + $$ActiveWorkoutSessionsTableReferences( + db, + table, + p0, + ).activeSetResultsRefs, + referencedItemsForCurrentItem: + (item, referencedItems) => referencedItems.where( + (e) => e.activeWorkoutSessionId == item.id, + ), + typedResults: items, + ), + if (workoutHistoriesRefs) + await $_getPrefetchedData< + ActiveWorkoutSession, + $ActiveWorkoutSessionsTable, + WorkoutHistory + >( + currentTable: table, + referencedTable: + $$ActiveWorkoutSessionsTableReferences + ._workoutHistoriesRefsTable(db), + managerFromTypedResult: (p0) => + $$ActiveWorkoutSessionsTableReferences( + db, + table, + p0, + ).workoutHistoriesRefs, + referencedItemsForCurrentItem: + (item, referencedItems) => referencedItems.where( + (e) => + e.sourceActiveWorkoutSessionId == item.id, + ), + typedResults: items, + ), + ]; + }, + ); + }, + ), + ); +} + +typedef $$ActiveWorkoutSessionsTableProcessedTableManager = + ProcessedTableManager< + _$AppDatabase, + $ActiveWorkoutSessionsTable, + ActiveWorkoutSession, + $$ActiveWorkoutSessionsTableFilterComposer, + $$ActiveWorkoutSessionsTableOrderingComposer, + $$ActiveWorkoutSessionsTableAnnotationComposer, + $$ActiveWorkoutSessionsTableCreateCompanionBuilder, + $$ActiveWorkoutSessionsTableUpdateCompanionBuilder, + (ActiveWorkoutSession, $$ActiveWorkoutSessionsTableReferences), + ActiveWorkoutSession, + PrefetchHooks Function({ + bool sourceWorkoutTemplateId, + bool activeRestStatesRefs, + bool activeSetResultsRefs, + bool workoutHistoriesRefs, + }) + >; +typedef $$ActiveRestStatesTableCreateCompanionBuilder = + ActiveRestStatesCompanion Function({ + required String id, + required DateTime createdAt, + required DateTime updatedAt, + Value deletedAt, + Value schemaVersion, + required String syncState, + required int localRevision, + required String originDeviceId, + Value futureOwnerProfileId, + Value lastSyncedAt, + Value remoteRevision, + required String activeWorkoutSessionId, + required int afterProgramIndex, + required int afterExerciseIndex, + required int afterSetIndex, + required int plannedRestSeconds, + required int adjustedRestSeconds, + required DateTime startedAt, + Value endedAt, + Value skippedAt, + Value rowid, + }); +typedef $$ActiveRestStatesTableUpdateCompanionBuilder = + ActiveRestStatesCompanion Function({ + Value id, + Value createdAt, + Value updatedAt, + Value deletedAt, + Value schemaVersion, + Value syncState, + Value localRevision, + Value originDeviceId, + Value futureOwnerProfileId, + Value lastSyncedAt, + Value remoteRevision, + Value activeWorkoutSessionId, + Value afterProgramIndex, + Value afterExerciseIndex, + Value afterSetIndex, + Value plannedRestSeconds, + Value adjustedRestSeconds, + Value startedAt, + Value endedAt, + Value skippedAt, + Value rowid, + }); + +final class $$ActiveRestStatesTableReferences + extends + BaseReferences<_$AppDatabase, $ActiveRestStatesTable, ActiveRestState> { + $$ActiveRestStatesTableReferences( + super.$_db, + super.$_table, + super.$_typedResult, + ); + + static $ActiveWorkoutSessionsTable _activeWorkoutSessionIdTable( + _$AppDatabase db, + ) => db.activeWorkoutSessions.createAlias( + 'active_rest_states__active_workout_session_id__active_workout_sessions__id', + ); + + $$ActiveWorkoutSessionsTableProcessedTableManager get activeWorkoutSessionId { + final $_column = $_itemColumn('active_workout_session_id')!; + + final manager = $$ActiveWorkoutSessionsTableTableManager( + $_db, + $_db.activeWorkoutSessions, + ).filter((f) => f.id.sqlEquals($_column)); + final item = $_typedResult.readTableOrNull( + _activeWorkoutSessionIdTable($_db), + ); + if (item == null) return manager; + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: [item]), + ); + } +} + +class $$ActiveRestStatesTableFilterComposer + extends Composer<_$AppDatabase, $ActiveRestStatesTable> { + $$ActiveRestStatesTableFilterComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnFilters get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get createdAt => $composableBuilder( + column: $table.createdAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get updatedAt => $composableBuilder( + column: $table.updatedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get deletedAt => $composableBuilder( + column: $table.deletedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get schemaVersion => $composableBuilder( + column: $table.schemaVersion, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get syncState => $composableBuilder( + column: $table.syncState, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get futureOwnerProfileId => $composableBuilder( + column: $table.futureOwnerProfileId, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get lastSyncedAt => $composableBuilder( + column: $table.lastSyncedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get remoteRevision => $composableBuilder( + column: $table.remoteRevision, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get afterProgramIndex => $composableBuilder( + column: $table.afterProgramIndex, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get afterExerciseIndex => $composableBuilder( + column: $table.afterExerciseIndex, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get afterSetIndex => $composableBuilder( + column: $table.afterSetIndex, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get plannedRestSeconds => $composableBuilder( + column: $table.plannedRestSeconds, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get adjustedRestSeconds => $composableBuilder( + column: $table.adjustedRestSeconds, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get startedAt => $composableBuilder( + column: $table.startedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get endedAt => $composableBuilder( + column: $table.endedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get skippedAt => $composableBuilder( + column: $table.skippedAt, + builder: (column) => ColumnFilters(column), + ); + + $$ActiveWorkoutSessionsTableFilterComposer get activeWorkoutSessionId { + final $$ActiveWorkoutSessionsTableFilterComposer composer = + $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.activeWorkoutSessionId, + referencedTable: $db.activeWorkoutSessions, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ActiveWorkoutSessionsTableFilterComposer( + $db: $db, + $table: $db.activeWorkoutSessions, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } +} + +class $$ActiveRestStatesTableOrderingComposer + extends Composer<_$AppDatabase, $ActiveRestStatesTable> { + $$ActiveRestStatesTableOrderingComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnOrderings get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get createdAt => $composableBuilder( + column: $table.createdAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get updatedAt => $composableBuilder( + column: $table.updatedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get deletedAt => $composableBuilder( + column: $table.deletedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get schemaVersion => $composableBuilder( + column: $table.schemaVersion, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get syncState => $composableBuilder( + column: $table.syncState, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get futureOwnerProfileId => $composableBuilder( + column: $table.futureOwnerProfileId, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get lastSyncedAt => $composableBuilder( + column: $table.lastSyncedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get remoteRevision => $composableBuilder( + column: $table.remoteRevision, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get afterProgramIndex => $composableBuilder( + column: $table.afterProgramIndex, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get afterExerciseIndex => $composableBuilder( + column: $table.afterExerciseIndex, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get afterSetIndex => $composableBuilder( + column: $table.afterSetIndex, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get plannedRestSeconds => $composableBuilder( + column: $table.plannedRestSeconds, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get adjustedRestSeconds => $composableBuilder( + column: $table.adjustedRestSeconds, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get startedAt => $composableBuilder( + column: $table.startedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get endedAt => $composableBuilder( + column: $table.endedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get skippedAt => $composableBuilder( + column: $table.skippedAt, + builder: (column) => ColumnOrderings(column), + ); + + $$ActiveWorkoutSessionsTableOrderingComposer get activeWorkoutSessionId { + final $$ActiveWorkoutSessionsTableOrderingComposer composer = + $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.activeWorkoutSessionId, + referencedTable: $db.activeWorkoutSessions, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ActiveWorkoutSessionsTableOrderingComposer( + $db: $db, + $table: $db.activeWorkoutSessions, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } +} + +class $$ActiveRestStatesTableAnnotationComposer + extends Composer<_$AppDatabase, $ActiveRestStatesTable> { + $$ActiveRestStatesTableAnnotationComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + GeneratedColumn get id => + $composableBuilder(column: $table.id, builder: (column) => column); + + GeneratedColumn get createdAt => + $composableBuilder(column: $table.createdAt, builder: (column) => column); + + GeneratedColumn get updatedAt => + $composableBuilder(column: $table.updatedAt, builder: (column) => column); + + GeneratedColumn get deletedAt => + $composableBuilder(column: $table.deletedAt, builder: (column) => column); + + GeneratedColumn get schemaVersion => $composableBuilder( + column: $table.schemaVersion, + builder: (column) => column, + ); + + GeneratedColumn get syncState => + $composableBuilder(column: $table.syncState, builder: (column) => column); + + GeneratedColumn get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => column, + ); + + GeneratedColumn get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => column, + ); + + GeneratedColumn get futureOwnerProfileId => $composableBuilder( + column: $table.futureOwnerProfileId, + builder: (column) => column, + ); + + GeneratedColumn get lastSyncedAt => $composableBuilder( + column: $table.lastSyncedAt, + builder: (column) => column, + ); + + GeneratedColumn get remoteRevision => $composableBuilder( + column: $table.remoteRevision, + builder: (column) => column, + ); + + GeneratedColumn get afterProgramIndex => $composableBuilder( + column: $table.afterProgramIndex, + builder: (column) => column, + ); + + GeneratedColumn get afterExerciseIndex => $composableBuilder( + column: $table.afterExerciseIndex, + builder: (column) => column, + ); + + GeneratedColumn get afterSetIndex => $composableBuilder( + column: $table.afterSetIndex, + builder: (column) => column, + ); + + GeneratedColumn get plannedRestSeconds => $composableBuilder( + column: $table.plannedRestSeconds, + builder: (column) => column, + ); + + GeneratedColumn get adjustedRestSeconds => $composableBuilder( + column: $table.adjustedRestSeconds, + builder: (column) => column, + ); + + GeneratedColumn get startedAt => + $composableBuilder(column: $table.startedAt, builder: (column) => column); + + GeneratedColumn get endedAt => + $composableBuilder(column: $table.endedAt, builder: (column) => column); + + GeneratedColumn get skippedAt => + $composableBuilder(column: $table.skippedAt, builder: (column) => column); + + $$ActiveWorkoutSessionsTableAnnotationComposer get activeWorkoutSessionId { + final $$ActiveWorkoutSessionsTableAnnotationComposer composer = + $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.activeWorkoutSessionId, + referencedTable: $db.activeWorkoutSessions, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ActiveWorkoutSessionsTableAnnotationComposer( + $db: $db, + $table: $db.activeWorkoutSessions, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } +} + +class $$ActiveRestStatesTableTableManager + extends + RootTableManager< + _$AppDatabase, + $ActiveRestStatesTable, + ActiveRestState, + $$ActiveRestStatesTableFilterComposer, + $$ActiveRestStatesTableOrderingComposer, + $$ActiveRestStatesTableAnnotationComposer, + $$ActiveRestStatesTableCreateCompanionBuilder, + $$ActiveRestStatesTableUpdateCompanionBuilder, + (ActiveRestState, $$ActiveRestStatesTableReferences), + ActiveRestState, + PrefetchHooks Function({bool activeWorkoutSessionId}) + > { + $$ActiveRestStatesTableTableManager( + _$AppDatabase db, + $ActiveRestStatesTable table, + ) : super( + TableManagerState( + db: db, + table: table, + createFilteringComposer: () => + $$ActiveRestStatesTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => + $$ActiveRestStatesTableOrderingComposer($db: db, $table: table), + createComputedFieldComposer: () => + $$ActiveRestStatesTableAnnotationComposer($db: db, $table: table), + updateCompanionCallback: + ({ + Value id = const Value.absent(), + Value createdAt = const Value.absent(), + Value updatedAt = const Value.absent(), + Value deletedAt = const Value.absent(), + Value schemaVersion = const Value.absent(), + Value syncState = const Value.absent(), + Value localRevision = const Value.absent(), + Value originDeviceId = const Value.absent(), + Value futureOwnerProfileId = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + Value remoteRevision = const Value.absent(), + Value activeWorkoutSessionId = const Value.absent(), + Value afterProgramIndex = const Value.absent(), + Value afterExerciseIndex = const Value.absent(), + Value afterSetIndex = const Value.absent(), + Value plannedRestSeconds = const Value.absent(), + Value adjustedRestSeconds = const Value.absent(), + Value startedAt = const Value.absent(), + Value endedAt = const Value.absent(), + Value skippedAt = const Value.absent(), + Value rowid = const Value.absent(), + }) => ActiveRestStatesCompanion( + id: id, + createdAt: createdAt, + updatedAt: updatedAt, + deletedAt: deletedAt, + schemaVersion: schemaVersion, + syncState: syncState, + localRevision: localRevision, + originDeviceId: originDeviceId, + futureOwnerProfileId: futureOwnerProfileId, + lastSyncedAt: lastSyncedAt, + remoteRevision: remoteRevision, + activeWorkoutSessionId: activeWorkoutSessionId, + afterProgramIndex: afterProgramIndex, + afterExerciseIndex: afterExerciseIndex, + afterSetIndex: afterSetIndex, + plannedRestSeconds: plannedRestSeconds, + adjustedRestSeconds: adjustedRestSeconds, + startedAt: startedAt, + endedAt: endedAt, + skippedAt: skippedAt, + rowid: rowid, + ), + createCompanionCallback: + ({ + required String id, + required DateTime createdAt, + required DateTime updatedAt, + Value deletedAt = const Value.absent(), + Value schemaVersion = const Value.absent(), + required String syncState, + required int localRevision, + required String originDeviceId, + Value futureOwnerProfileId = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + Value remoteRevision = const Value.absent(), + required String activeWorkoutSessionId, + required int afterProgramIndex, + required int afterExerciseIndex, + required int afterSetIndex, + required int plannedRestSeconds, + required int adjustedRestSeconds, + required DateTime startedAt, + Value endedAt = const Value.absent(), + Value skippedAt = const Value.absent(), + Value rowid = const Value.absent(), + }) => ActiveRestStatesCompanion.insert( + id: id, + createdAt: createdAt, + updatedAt: updatedAt, + deletedAt: deletedAt, + schemaVersion: schemaVersion, + syncState: syncState, + localRevision: localRevision, + originDeviceId: originDeviceId, + futureOwnerProfileId: futureOwnerProfileId, + lastSyncedAt: lastSyncedAt, + remoteRevision: remoteRevision, + activeWorkoutSessionId: activeWorkoutSessionId, + afterProgramIndex: afterProgramIndex, + afterExerciseIndex: afterExerciseIndex, + afterSetIndex: afterSetIndex, + plannedRestSeconds: plannedRestSeconds, + adjustedRestSeconds: adjustedRestSeconds, + startedAt: startedAt, + endedAt: endedAt, + skippedAt: skippedAt, + rowid: rowid, + ), + withReferenceMapper: (p0) => p0 + .map( + (e) => ( + e.readTable(table), + $$ActiveRestStatesTableReferences(db, table, e), + ), + ) + .toList(), + prefetchHooksCallback: ({activeWorkoutSessionId = false}) { + return PrefetchHooks( + db: db, + explicitlyWatchedTables: [], + addJoins: + < + T extends TableManagerState< + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic + > + >(state) { + if (activeWorkoutSessionId) { + state = + state.withJoin( + currentTable: table, + currentColumn: table.activeWorkoutSessionId, + referencedTable: + $$ActiveRestStatesTableReferences + ._activeWorkoutSessionIdTable(db), + referencedColumn: + $$ActiveRestStatesTableReferences + ._activeWorkoutSessionIdTable(db) + .id, + ) + as T; + } + + return state; + }, + getPrefetchedDataCallback: (items) async { + return []; + }, + ); + }, + ), + ); +} + +typedef $$ActiveRestStatesTableProcessedTableManager = + ProcessedTableManager< + _$AppDatabase, + $ActiveRestStatesTable, + ActiveRestState, + $$ActiveRestStatesTableFilterComposer, + $$ActiveRestStatesTableOrderingComposer, + $$ActiveRestStatesTableAnnotationComposer, + $$ActiveRestStatesTableCreateCompanionBuilder, + $$ActiveRestStatesTableUpdateCompanionBuilder, + (ActiveRestState, $$ActiveRestStatesTableReferences), + ActiveRestState, + PrefetchHooks Function({bool activeWorkoutSessionId}) + >; +typedef $$ActiveSetResultsTableCreateCompanionBuilder = + ActiveSetResultsCompanion Function({ + required String id, + required DateTime createdAt, + required DateTime updatedAt, + Value deletedAt, + Value schemaVersion, + required String syncState, + required int localRevision, + required String originDeviceId, + Value futureOwnerProfileId, + Value lastSyncedAt, + Value remoteRevision, + required String activeWorkoutSessionId, + required String programSnapshotId, + required String exerciseSnapshotId, + required int programIndex, + required int exerciseIndex, + required int setIndex, + Value startedAt, + Value completedAt, + Value actualTimeMs, + Value actualReps, + Value actualScore, + Value scoreLabelSnapshot, + Value scoreUnitSnapshot, + Value note, + Value rowid, + }); +typedef $$ActiveSetResultsTableUpdateCompanionBuilder = + ActiveSetResultsCompanion Function({ + Value id, + Value createdAt, + Value updatedAt, + Value deletedAt, + Value schemaVersion, + Value syncState, + Value localRevision, + Value originDeviceId, + Value futureOwnerProfileId, + Value lastSyncedAt, + Value remoteRevision, + Value activeWorkoutSessionId, + Value programSnapshotId, + Value exerciseSnapshotId, + Value programIndex, + Value exerciseIndex, + Value setIndex, + Value startedAt, + Value completedAt, + Value actualTimeMs, + Value actualReps, + Value actualScore, + Value scoreLabelSnapshot, + Value scoreUnitSnapshot, + Value note, + Value rowid, + }); + +final class $$ActiveSetResultsTableReferences + extends + BaseReferences<_$AppDatabase, $ActiveSetResultsTable, ActiveSetResult> { + $$ActiveSetResultsTableReferences( + super.$_db, + super.$_table, + super.$_typedResult, + ); + + static $ActiveWorkoutSessionsTable _activeWorkoutSessionIdTable( + _$AppDatabase db, + ) => db.activeWorkoutSessions.createAlias( + 'active_set_results__active_workout_session_id__active_workout_sessions__id', + ); + + $$ActiveWorkoutSessionsTableProcessedTableManager get activeWorkoutSessionId { + final $_column = $_itemColumn('active_workout_session_id')!; + + final manager = $$ActiveWorkoutSessionsTableTableManager( + $_db, + $_db.activeWorkoutSessions, + ).filter((f) => f.id.sqlEquals($_column)); + final item = $_typedResult.readTableOrNull( + _activeWorkoutSessionIdTable($_db), + ); + if (item == null) return manager; + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: [item]), + ); + } +} + +class $$ActiveSetResultsTableFilterComposer + extends Composer<_$AppDatabase, $ActiveSetResultsTable> { + $$ActiveSetResultsTableFilterComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnFilters get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get createdAt => $composableBuilder( + column: $table.createdAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get updatedAt => $composableBuilder( + column: $table.updatedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get deletedAt => $composableBuilder( + column: $table.deletedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get schemaVersion => $composableBuilder( + column: $table.schemaVersion, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get syncState => $composableBuilder( + column: $table.syncState, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get futureOwnerProfileId => $composableBuilder( + column: $table.futureOwnerProfileId, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get lastSyncedAt => $composableBuilder( + column: $table.lastSyncedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get remoteRevision => $composableBuilder( + column: $table.remoteRevision, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get programSnapshotId => $composableBuilder( + column: $table.programSnapshotId, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get exerciseSnapshotId => $composableBuilder( + column: $table.exerciseSnapshotId, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get programIndex => $composableBuilder( + column: $table.programIndex, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get exerciseIndex => $composableBuilder( + column: $table.exerciseIndex, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get setIndex => $composableBuilder( + column: $table.setIndex, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get startedAt => $composableBuilder( + column: $table.startedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get completedAt => $composableBuilder( + column: $table.completedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get actualTimeMs => $composableBuilder( + column: $table.actualTimeMs, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get actualReps => $composableBuilder( + column: $table.actualReps, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get actualScore => $composableBuilder( + column: $table.actualScore, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get scoreLabelSnapshot => $composableBuilder( + column: $table.scoreLabelSnapshot, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get scoreUnitSnapshot => $composableBuilder( + column: $table.scoreUnitSnapshot, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get note => $composableBuilder( + column: $table.note, + builder: (column) => ColumnFilters(column), + ); + + $$ActiveWorkoutSessionsTableFilterComposer get activeWorkoutSessionId { + final $$ActiveWorkoutSessionsTableFilterComposer composer = + $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.activeWorkoutSessionId, + referencedTable: $db.activeWorkoutSessions, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ActiveWorkoutSessionsTableFilterComposer( + $db: $db, + $table: $db.activeWorkoutSessions, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } +} + +class $$ActiveSetResultsTableOrderingComposer + extends Composer<_$AppDatabase, $ActiveSetResultsTable> { + $$ActiveSetResultsTableOrderingComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnOrderings get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get createdAt => $composableBuilder( + column: $table.createdAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get updatedAt => $composableBuilder( + column: $table.updatedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get deletedAt => $composableBuilder( + column: $table.deletedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get schemaVersion => $composableBuilder( + column: $table.schemaVersion, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get syncState => $composableBuilder( + column: $table.syncState, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get futureOwnerProfileId => $composableBuilder( + column: $table.futureOwnerProfileId, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get lastSyncedAt => $composableBuilder( + column: $table.lastSyncedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get remoteRevision => $composableBuilder( + column: $table.remoteRevision, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get programSnapshotId => $composableBuilder( + column: $table.programSnapshotId, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get exerciseSnapshotId => $composableBuilder( + column: $table.exerciseSnapshotId, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get programIndex => $composableBuilder( + column: $table.programIndex, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get exerciseIndex => $composableBuilder( + column: $table.exerciseIndex, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get setIndex => $composableBuilder( + column: $table.setIndex, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get startedAt => $composableBuilder( + column: $table.startedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get completedAt => $composableBuilder( + column: $table.completedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get actualTimeMs => $composableBuilder( + column: $table.actualTimeMs, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get actualReps => $composableBuilder( + column: $table.actualReps, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get actualScore => $composableBuilder( + column: $table.actualScore, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get scoreLabelSnapshot => $composableBuilder( + column: $table.scoreLabelSnapshot, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get scoreUnitSnapshot => $composableBuilder( + column: $table.scoreUnitSnapshot, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get note => $composableBuilder( + column: $table.note, + builder: (column) => ColumnOrderings(column), + ); + + $$ActiveWorkoutSessionsTableOrderingComposer get activeWorkoutSessionId { + final $$ActiveWorkoutSessionsTableOrderingComposer composer = + $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.activeWorkoutSessionId, + referencedTable: $db.activeWorkoutSessions, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ActiveWorkoutSessionsTableOrderingComposer( + $db: $db, + $table: $db.activeWorkoutSessions, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } +} + +class $$ActiveSetResultsTableAnnotationComposer + extends Composer<_$AppDatabase, $ActiveSetResultsTable> { + $$ActiveSetResultsTableAnnotationComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + GeneratedColumn get id => + $composableBuilder(column: $table.id, builder: (column) => column); + + GeneratedColumn get createdAt => + $composableBuilder(column: $table.createdAt, builder: (column) => column); + + GeneratedColumn get updatedAt => + $composableBuilder(column: $table.updatedAt, builder: (column) => column); + + GeneratedColumn get deletedAt => + $composableBuilder(column: $table.deletedAt, builder: (column) => column); + + GeneratedColumn get schemaVersion => $composableBuilder( + column: $table.schemaVersion, + builder: (column) => column, + ); + + GeneratedColumn get syncState => + $composableBuilder(column: $table.syncState, builder: (column) => column); + + GeneratedColumn get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => column, + ); + + GeneratedColumn get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => column, + ); + + GeneratedColumn get futureOwnerProfileId => $composableBuilder( + column: $table.futureOwnerProfileId, + builder: (column) => column, + ); + + GeneratedColumn get lastSyncedAt => $composableBuilder( + column: $table.lastSyncedAt, + builder: (column) => column, + ); + + GeneratedColumn get remoteRevision => $composableBuilder( + column: $table.remoteRevision, + builder: (column) => column, + ); + + GeneratedColumn get programSnapshotId => $composableBuilder( + column: $table.programSnapshotId, + builder: (column) => column, + ); + + GeneratedColumn get exerciseSnapshotId => $composableBuilder( + column: $table.exerciseSnapshotId, + builder: (column) => column, + ); + + GeneratedColumn get programIndex => $composableBuilder( + column: $table.programIndex, + builder: (column) => column, + ); + + GeneratedColumn get exerciseIndex => $composableBuilder( + column: $table.exerciseIndex, + builder: (column) => column, + ); + + GeneratedColumn get setIndex => + $composableBuilder(column: $table.setIndex, builder: (column) => column); + + GeneratedColumn get startedAt => + $composableBuilder(column: $table.startedAt, builder: (column) => column); + + GeneratedColumn get completedAt => $composableBuilder( + column: $table.completedAt, + builder: (column) => column, + ); + + GeneratedColumn get actualTimeMs => $composableBuilder( + column: $table.actualTimeMs, + builder: (column) => column, + ); + + GeneratedColumn get actualReps => $composableBuilder( + column: $table.actualReps, + builder: (column) => column, + ); + + GeneratedColumn get actualScore => $composableBuilder( + column: $table.actualScore, + builder: (column) => column, + ); + + GeneratedColumn get scoreLabelSnapshot => $composableBuilder( + column: $table.scoreLabelSnapshot, + builder: (column) => column, + ); + + GeneratedColumn get scoreUnitSnapshot => $composableBuilder( + column: $table.scoreUnitSnapshot, + builder: (column) => column, + ); + + GeneratedColumn get note => + $composableBuilder(column: $table.note, builder: (column) => column); + + $$ActiveWorkoutSessionsTableAnnotationComposer get activeWorkoutSessionId { + final $$ActiveWorkoutSessionsTableAnnotationComposer composer = + $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.activeWorkoutSessionId, + referencedTable: $db.activeWorkoutSessions, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ActiveWorkoutSessionsTableAnnotationComposer( + $db: $db, + $table: $db.activeWorkoutSessions, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } +} + +class $$ActiveSetResultsTableTableManager + extends + RootTableManager< + _$AppDatabase, + $ActiveSetResultsTable, + ActiveSetResult, + $$ActiveSetResultsTableFilterComposer, + $$ActiveSetResultsTableOrderingComposer, + $$ActiveSetResultsTableAnnotationComposer, + $$ActiveSetResultsTableCreateCompanionBuilder, + $$ActiveSetResultsTableUpdateCompanionBuilder, + (ActiveSetResult, $$ActiveSetResultsTableReferences), + ActiveSetResult, + PrefetchHooks Function({bool activeWorkoutSessionId}) + > { + $$ActiveSetResultsTableTableManager( + _$AppDatabase db, + $ActiveSetResultsTable table, + ) : super( + TableManagerState( + db: db, + table: table, + createFilteringComposer: () => + $$ActiveSetResultsTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => + $$ActiveSetResultsTableOrderingComposer($db: db, $table: table), + createComputedFieldComposer: () => + $$ActiveSetResultsTableAnnotationComposer($db: db, $table: table), + updateCompanionCallback: + ({ + Value id = const Value.absent(), + Value createdAt = const Value.absent(), + Value updatedAt = const Value.absent(), + Value deletedAt = const Value.absent(), + Value schemaVersion = const Value.absent(), + Value syncState = const Value.absent(), + Value localRevision = const Value.absent(), + Value originDeviceId = const Value.absent(), + Value futureOwnerProfileId = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + Value remoteRevision = const Value.absent(), + Value activeWorkoutSessionId = const Value.absent(), + Value programSnapshotId = const Value.absent(), + Value exerciseSnapshotId = const Value.absent(), + Value programIndex = const Value.absent(), + Value exerciseIndex = const Value.absent(), + Value setIndex = const Value.absent(), + Value startedAt = const Value.absent(), + Value completedAt = const Value.absent(), + Value actualTimeMs = const Value.absent(), + Value actualReps = const Value.absent(), + Value actualScore = const Value.absent(), + Value scoreLabelSnapshot = const Value.absent(), + Value scoreUnitSnapshot = const Value.absent(), + Value note = const Value.absent(), + Value rowid = const Value.absent(), + }) => ActiveSetResultsCompanion( + id: id, + createdAt: createdAt, + updatedAt: updatedAt, + deletedAt: deletedAt, + schemaVersion: schemaVersion, + syncState: syncState, + localRevision: localRevision, + originDeviceId: originDeviceId, + futureOwnerProfileId: futureOwnerProfileId, + lastSyncedAt: lastSyncedAt, + remoteRevision: remoteRevision, + activeWorkoutSessionId: activeWorkoutSessionId, + programSnapshotId: programSnapshotId, + exerciseSnapshotId: exerciseSnapshotId, + programIndex: programIndex, + exerciseIndex: exerciseIndex, + setIndex: setIndex, + startedAt: startedAt, + completedAt: completedAt, + actualTimeMs: actualTimeMs, + actualReps: actualReps, + actualScore: actualScore, + scoreLabelSnapshot: scoreLabelSnapshot, + scoreUnitSnapshot: scoreUnitSnapshot, + note: note, + rowid: rowid, + ), + createCompanionCallback: + ({ + required String id, + required DateTime createdAt, + required DateTime updatedAt, + Value deletedAt = const Value.absent(), + Value schemaVersion = const Value.absent(), + required String syncState, + required int localRevision, + required String originDeviceId, + Value futureOwnerProfileId = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + Value remoteRevision = const Value.absent(), + required String activeWorkoutSessionId, + required String programSnapshotId, + required String exerciseSnapshotId, + required int programIndex, + required int exerciseIndex, + required int setIndex, + Value startedAt = const Value.absent(), + Value completedAt = const Value.absent(), + Value actualTimeMs = const Value.absent(), + Value actualReps = const Value.absent(), + Value actualScore = const Value.absent(), + Value scoreLabelSnapshot = const Value.absent(), + Value scoreUnitSnapshot = const Value.absent(), + Value note = const Value.absent(), + Value rowid = const Value.absent(), + }) => ActiveSetResultsCompanion.insert( + id: id, + createdAt: createdAt, + updatedAt: updatedAt, + deletedAt: deletedAt, + schemaVersion: schemaVersion, + syncState: syncState, + localRevision: localRevision, + originDeviceId: originDeviceId, + futureOwnerProfileId: futureOwnerProfileId, + lastSyncedAt: lastSyncedAt, + remoteRevision: remoteRevision, + activeWorkoutSessionId: activeWorkoutSessionId, + programSnapshotId: programSnapshotId, + exerciseSnapshotId: exerciseSnapshotId, + programIndex: programIndex, + exerciseIndex: exerciseIndex, + setIndex: setIndex, + startedAt: startedAt, + completedAt: completedAt, + actualTimeMs: actualTimeMs, + actualReps: actualReps, + actualScore: actualScore, + scoreLabelSnapshot: scoreLabelSnapshot, + scoreUnitSnapshot: scoreUnitSnapshot, + note: note, + rowid: rowid, + ), + withReferenceMapper: (p0) => p0 + .map( + (e) => ( + e.readTable(table), + $$ActiveSetResultsTableReferences(db, table, e), + ), + ) + .toList(), + prefetchHooksCallback: ({activeWorkoutSessionId = false}) { + return PrefetchHooks( + db: db, + explicitlyWatchedTables: [], + addJoins: + < + T extends TableManagerState< + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic + > + >(state) { + if (activeWorkoutSessionId) { + state = + state.withJoin( + currentTable: table, + currentColumn: table.activeWorkoutSessionId, + referencedTable: + $$ActiveSetResultsTableReferences + ._activeWorkoutSessionIdTable(db), + referencedColumn: + $$ActiveSetResultsTableReferences + ._activeWorkoutSessionIdTable(db) + .id, + ) + as T; + } + + return state; + }, + getPrefetchedDataCallback: (items) async { + return []; + }, + ); + }, + ), + ); +} + +typedef $$ActiveSetResultsTableProcessedTableManager = + ProcessedTableManager< + _$AppDatabase, + $ActiveSetResultsTable, + ActiveSetResult, + $$ActiveSetResultsTableFilterComposer, + $$ActiveSetResultsTableOrderingComposer, + $$ActiveSetResultsTableAnnotationComposer, + $$ActiveSetResultsTableCreateCompanionBuilder, + $$ActiveSetResultsTableUpdateCompanionBuilder, + (ActiveSetResult, $$ActiveSetResultsTableReferences), + ActiveSetResult, + PrefetchHooks Function({bool activeWorkoutSessionId}) + >; +typedef $$ChangeLogEntriesTableCreateCompanionBuilder = + ChangeLogEntriesCompanion Function({ + required String id, + required String entityType, + required String entityId, + required String operation, + Value payloadHash, + required int localRevision, + required String originDeviceId, + required DateTime createdAt, + Value syncedAt, + Value rowid, + }); +typedef $$ChangeLogEntriesTableUpdateCompanionBuilder = + ChangeLogEntriesCompanion Function({ + Value id, + Value entityType, + Value entityId, + Value operation, + Value payloadHash, + Value localRevision, + Value originDeviceId, + Value createdAt, + Value syncedAt, + Value rowid, + }); + +class $$ChangeLogEntriesTableFilterComposer + extends Composer<_$AppDatabase, $ChangeLogEntriesTable> { + $$ChangeLogEntriesTableFilterComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnFilters get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get entityType => $composableBuilder( + column: $table.entityType, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get entityId => $composableBuilder( + column: $table.entityId, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get operation => $composableBuilder( + column: $table.operation, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get payloadHash => $composableBuilder( + column: $table.payloadHash, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get createdAt => $composableBuilder( + column: $table.createdAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get syncedAt => $composableBuilder( + column: $table.syncedAt, + builder: (column) => ColumnFilters(column), + ); +} + +class $$ChangeLogEntriesTableOrderingComposer + extends Composer<_$AppDatabase, $ChangeLogEntriesTable> { + $$ChangeLogEntriesTableOrderingComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnOrderings get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get entityType => $composableBuilder( + column: $table.entityType, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get entityId => $composableBuilder( + column: $table.entityId, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get operation => $composableBuilder( + column: $table.operation, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get payloadHash => $composableBuilder( + column: $table.payloadHash, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get createdAt => $composableBuilder( + column: $table.createdAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get syncedAt => $composableBuilder( + column: $table.syncedAt, + builder: (column) => ColumnOrderings(column), + ); +} + +class $$ChangeLogEntriesTableAnnotationComposer + extends Composer<_$AppDatabase, $ChangeLogEntriesTable> { + $$ChangeLogEntriesTableAnnotationComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + GeneratedColumn get id => + $composableBuilder(column: $table.id, builder: (column) => column); + + GeneratedColumn get entityType => $composableBuilder( + column: $table.entityType, + builder: (column) => column, + ); + + GeneratedColumn get entityId => + $composableBuilder(column: $table.entityId, builder: (column) => column); + + GeneratedColumn get operation => + $composableBuilder(column: $table.operation, builder: (column) => column); + + GeneratedColumn get payloadHash => $composableBuilder( + column: $table.payloadHash, + builder: (column) => column, + ); + + GeneratedColumn get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => column, + ); + + GeneratedColumn get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => column, + ); + + GeneratedColumn get createdAt => + $composableBuilder(column: $table.createdAt, builder: (column) => column); + + GeneratedColumn get syncedAt => + $composableBuilder(column: $table.syncedAt, builder: (column) => column); +} + +class $$ChangeLogEntriesTableTableManager + extends + RootTableManager< + _$AppDatabase, + $ChangeLogEntriesTable, + ChangeLogEntry, + $$ChangeLogEntriesTableFilterComposer, + $$ChangeLogEntriesTableOrderingComposer, + $$ChangeLogEntriesTableAnnotationComposer, + $$ChangeLogEntriesTableCreateCompanionBuilder, + $$ChangeLogEntriesTableUpdateCompanionBuilder, + ( + ChangeLogEntry, + BaseReferences< + _$AppDatabase, + $ChangeLogEntriesTable, + ChangeLogEntry + >, + ), + ChangeLogEntry, + PrefetchHooks Function() + > { + $$ChangeLogEntriesTableTableManager( + _$AppDatabase db, + $ChangeLogEntriesTable table, + ) : super( + TableManagerState( + db: db, + table: table, + createFilteringComposer: () => + $$ChangeLogEntriesTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => + $$ChangeLogEntriesTableOrderingComposer($db: db, $table: table), + createComputedFieldComposer: () => + $$ChangeLogEntriesTableAnnotationComposer($db: db, $table: table), + updateCompanionCallback: + ({ + Value id = const Value.absent(), + Value entityType = const Value.absent(), + Value entityId = const Value.absent(), + Value operation = const Value.absent(), + Value payloadHash = const Value.absent(), + Value localRevision = const Value.absent(), + Value originDeviceId = const Value.absent(), + Value createdAt = const Value.absent(), + Value syncedAt = const Value.absent(), + Value rowid = const Value.absent(), + }) => ChangeLogEntriesCompanion( + id: id, + entityType: entityType, + entityId: entityId, + operation: operation, + payloadHash: payloadHash, + localRevision: localRevision, + originDeviceId: originDeviceId, + createdAt: createdAt, + syncedAt: syncedAt, + rowid: rowid, + ), + createCompanionCallback: + ({ + required String id, + required String entityType, + required String entityId, + required String operation, + Value payloadHash = const Value.absent(), + required int localRevision, + required String originDeviceId, + required DateTime createdAt, + Value syncedAt = const Value.absent(), + Value rowid = const Value.absent(), + }) => ChangeLogEntriesCompanion.insert( + id: id, + entityType: entityType, + entityId: entityId, + operation: operation, + payloadHash: payloadHash, + localRevision: localRevision, + originDeviceId: originDeviceId, + createdAt: createdAt, + syncedAt: syncedAt, + rowid: rowid, + ), + withReferenceMapper: (p0) => p0 + .map((e) => (e.readTable(table), BaseReferences(db, table, e))) + .toList(), + prefetchHooksCallback: null, + ), + ); +} + +typedef $$ChangeLogEntriesTableProcessedTableManager = + ProcessedTableManager< + _$AppDatabase, + $ChangeLogEntriesTable, + ChangeLogEntry, + $$ChangeLogEntriesTableFilterComposer, + $$ChangeLogEntriesTableOrderingComposer, + $$ChangeLogEntriesTableAnnotationComposer, + $$ChangeLogEntriesTableCreateCompanionBuilder, + $$ChangeLogEntriesTableUpdateCompanionBuilder, + ( + ChangeLogEntry, + BaseReferences<_$AppDatabase, $ChangeLogEntriesTable, ChangeLogEntry>, + ), + ChangeLogEntry, + PrefetchHooks Function() + >; +typedef $$MediaAssetsTableCreateCompanionBuilder = + MediaAssetsCompanion Function({ + required String id, + required DateTime createdAt, + required DateTime updatedAt, + Value deletedAt, + Value schemaVersion, + required String syncState, + required int localRevision, + required String originDeviceId, + Value futureOwnerProfileId, + Value lastSyncedAt, + Value remoteRevision, + required String kind, + required String localUri, + Value mimeType, + Value sizeBytes, + Value width, + Value height, + Value durationMs, + Value checksum, + Value remoteUri, + Value thumbnailLocalUri, + Value rowid, + }); +typedef $$MediaAssetsTableUpdateCompanionBuilder = + MediaAssetsCompanion Function({ + Value id, + Value createdAt, + Value updatedAt, + Value deletedAt, + Value schemaVersion, + Value syncState, + Value localRevision, + Value originDeviceId, + Value futureOwnerProfileId, + Value lastSyncedAt, + Value remoteRevision, + Value kind, + Value localUri, + Value mimeType, + Value sizeBytes, + Value width, + Value height, + Value durationMs, + Value checksum, + Value remoteUri, + Value thumbnailLocalUri, + Value rowid, + }); + +final class $$MediaAssetsTableReferences + extends BaseReferences<_$AppDatabase, $MediaAssetsTable, MediaAsset> { + $$MediaAssetsTableReferences(super.$_db, super.$_table, super.$_typedResult); + + static MultiTypedResultKey<$ExercisesTable, List> + _exerciseImageReferencesTable(_$AppDatabase db) => + MultiTypedResultKey.fromTable( + db.exercises, + aliasName: 'media_assets__id__exercises__image_media_id', + ); + + $$ExercisesTableProcessedTableManager get exerciseImageReferences { + final manager = $$ExercisesTableTableManager( + $_db, + $_db.exercises, + ).filter((f) => f.imageMediaId.id.sqlEquals($_itemColumn('id')!)); + + final cache = $_typedResult.readTableOrNull( + _exerciseImageReferencesTable($_db), + ); + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: cache), + ); + } + + static MultiTypedResultKey<$ExercisesTable, List> + _exerciseVideoReferencesTable(_$AppDatabase db) => + MultiTypedResultKey.fromTable( + db.exercises, + aliasName: 'media_assets__id__exercises__video_media_id', + ); + + $$ExercisesTableProcessedTableManager get exerciseVideoReferences { + final manager = $$ExercisesTableTableManager( + $_db, + $_db.exercises, + ).filter((f) => f.videoMediaId.id.sqlEquals($_itemColumn('id')!)); + + final cache = $_typedResult.readTableOrNull( + _exerciseVideoReferencesTable($_db), + ); + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: cache), + ); + } + + static MultiTypedResultKey<$ProgramExercisesTable, List> + _programExerciseImageSnapshotReferencesTable( + _$AppDatabase db, + ) => MultiTypedResultKey.fromTable( + db.programExercises, + aliasName: + 'media_assets__id__program_exercises__exercise_image_media_id_snapshot', + ); + + $$ProgramExercisesTableProcessedTableManager + get programExerciseImageSnapshotReferences { + final manager = + $$ProgramExercisesTableTableManager($_db, $_db.programExercises).filter( + (f) => f.exerciseImageMediaIdSnapshot.id.sqlEquals( + $_itemColumn('id')!, + ), + ); + + final cache = $_typedResult.readTableOrNull( + _programExerciseImageSnapshotReferencesTable($_db), + ); + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: cache), + ); + } + + static MultiTypedResultKey<$ProgramExercisesTable, List> + _programExerciseVideoSnapshotReferencesTable( + _$AppDatabase db, + ) => MultiTypedResultKey.fromTable( + db.programExercises, + aliasName: + 'media_assets__id__program_exercises__exercise_video_media_id_snapshot', + ); + + $$ProgramExercisesTableProcessedTableManager + get programExerciseVideoSnapshotReferences { + final manager = + $$ProgramExercisesTableTableManager($_db, $_db.programExercises).filter( + (f) => f.exerciseVideoMediaIdSnapshot.id.sqlEquals( + $_itemColumn('id')!, + ), + ); + + final cache = $_typedResult.readTableOrNull( + _programExerciseVideoSnapshotReferencesTable($_db), + ); + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: cache), + ); + } +} + +class $$MediaAssetsTableFilterComposer + extends Composer<_$AppDatabase, $MediaAssetsTable> { + $$MediaAssetsTableFilterComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnFilters get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get createdAt => $composableBuilder( + column: $table.createdAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get updatedAt => $composableBuilder( + column: $table.updatedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get deletedAt => $composableBuilder( + column: $table.deletedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get schemaVersion => $composableBuilder( + column: $table.schemaVersion, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get syncState => $composableBuilder( + column: $table.syncState, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get futureOwnerProfileId => $composableBuilder( + column: $table.futureOwnerProfileId, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get lastSyncedAt => $composableBuilder( + column: $table.lastSyncedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get remoteRevision => $composableBuilder( + column: $table.remoteRevision, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get kind => $composableBuilder( + column: $table.kind, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get localUri => $composableBuilder( + column: $table.localUri, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get mimeType => $composableBuilder( + column: $table.mimeType, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get sizeBytes => $composableBuilder( + column: $table.sizeBytes, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get width => $composableBuilder( + column: $table.width, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get height => $composableBuilder( + column: $table.height, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get durationMs => $composableBuilder( + column: $table.durationMs, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get checksum => $composableBuilder( + column: $table.checksum, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get remoteUri => $composableBuilder( + column: $table.remoteUri, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get thumbnailLocalUri => $composableBuilder( + column: $table.thumbnailLocalUri, + builder: (column) => ColumnFilters(column), + ); + + Expression exerciseImageReferences( + Expression Function($$ExercisesTableFilterComposer f) f, + ) { + final $$ExercisesTableFilterComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.exercises, + getReferencedColumn: (t) => t.imageMediaId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ExercisesTableFilterComposer( + $db: $db, + $table: $db.exercises, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } + + Expression exerciseVideoReferences( + Expression Function($$ExercisesTableFilterComposer f) f, + ) { + final $$ExercisesTableFilterComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.exercises, + getReferencedColumn: (t) => t.videoMediaId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ExercisesTableFilterComposer( + $db: $db, + $table: $db.exercises, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } + + Expression programExerciseImageSnapshotReferences( + Expression Function($$ProgramExercisesTableFilterComposer f) f, + ) { + final $$ProgramExercisesTableFilterComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.programExercises, + getReferencedColumn: (t) => t.exerciseImageMediaIdSnapshot, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ProgramExercisesTableFilterComposer( + $db: $db, + $table: $db.programExercises, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } + + Expression programExerciseVideoSnapshotReferences( + Expression Function($$ProgramExercisesTableFilterComposer f) f, + ) { + final $$ProgramExercisesTableFilterComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.programExercises, + getReferencedColumn: (t) => t.exerciseVideoMediaIdSnapshot, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ProgramExercisesTableFilterComposer( + $db: $db, + $table: $db.programExercises, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } +} + +class $$MediaAssetsTableOrderingComposer + extends Composer<_$AppDatabase, $MediaAssetsTable> { + $$MediaAssetsTableOrderingComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnOrderings get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get createdAt => $composableBuilder( + column: $table.createdAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get updatedAt => $composableBuilder( + column: $table.updatedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get deletedAt => $composableBuilder( + column: $table.deletedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get schemaVersion => $composableBuilder( + column: $table.schemaVersion, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get syncState => $composableBuilder( + column: $table.syncState, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get futureOwnerProfileId => $composableBuilder( + column: $table.futureOwnerProfileId, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get lastSyncedAt => $composableBuilder( + column: $table.lastSyncedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get remoteRevision => $composableBuilder( + column: $table.remoteRevision, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get kind => $composableBuilder( + column: $table.kind, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get localUri => $composableBuilder( + column: $table.localUri, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get mimeType => $composableBuilder( + column: $table.mimeType, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get sizeBytes => $composableBuilder( + column: $table.sizeBytes, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get width => $composableBuilder( + column: $table.width, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get height => $composableBuilder( + column: $table.height, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get durationMs => $composableBuilder( + column: $table.durationMs, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get checksum => $composableBuilder( + column: $table.checksum, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get remoteUri => $composableBuilder( + column: $table.remoteUri, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get thumbnailLocalUri => $composableBuilder( + column: $table.thumbnailLocalUri, + builder: (column) => ColumnOrderings(column), + ); +} + +class $$MediaAssetsTableAnnotationComposer + extends Composer<_$AppDatabase, $MediaAssetsTable> { + $$MediaAssetsTableAnnotationComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + GeneratedColumn get id => + $composableBuilder(column: $table.id, builder: (column) => column); + + GeneratedColumn get createdAt => + $composableBuilder(column: $table.createdAt, builder: (column) => column); + + GeneratedColumn get updatedAt => + $composableBuilder(column: $table.updatedAt, builder: (column) => column); + + GeneratedColumn get deletedAt => + $composableBuilder(column: $table.deletedAt, builder: (column) => column); + + GeneratedColumn get schemaVersion => $composableBuilder( + column: $table.schemaVersion, + builder: (column) => column, + ); + + GeneratedColumn get syncState => + $composableBuilder(column: $table.syncState, builder: (column) => column); + + GeneratedColumn get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => column, + ); + + GeneratedColumn get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => column, + ); + + GeneratedColumn get futureOwnerProfileId => $composableBuilder( + column: $table.futureOwnerProfileId, + builder: (column) => column, + ); + + GeneratedColumn get lastSyncedAt => $composableBuilder( + column: $table.lastSyncedAt, + builder: (column) => column, + ); + + GeneratedColumn get remoteRevision => $composableBuilder( + column: $table.remoteRevision, + builder: (column) => column, + ); + + GeneratedColumn get kind => + $composableBuilder(column: $table.kind, builder: (column) => column); + + GeneratedColumn get localUri => + $composableBuilder(column: $table.localUri, builder: (column) => column); + + GeneratedColumn get mimeType => + $composableBuilder(column: $table.mimeType, builder: (column) => column); + + GeneratedColumn get sizeBytes => + $composableBuilder(column: $table.sizeBytes, builder: (column) => column); + + GeneratedColumn get width => + $composableBuilder(column: $table.width, builder: (column) => column); + + GeneratedColumn get height => + $composableBuilder(column: $table.height, builder: (column) => column); + + GeneratedColumn get durationMs => $composableBuilder( + column: $table.durationMs, + builder: (column) => column, + ); + + GeneratedColumn get checksum => + $composableBuilder(column: $table.checksum, builder: (column) => column); + + GeneratedColumn get remoteUri => + $composableBuilder(column: $table.remoteUri, builder: (column) => column); + + GeneratedColumn get thumbnailLocalUri => $composableBuilder( + column: $table.thumbnailLocalUri, + builder: (column) => column, + ); + + Expression exerciseImageReferences( + Expression Function($$ExercisesTableAnnotationComposer a) f, + ) { + final $$ExercisesTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.exercises, + getReferencedColumn: (t) => t.imageMediaId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ExercisesTableAnnotationComposer( + $db: $db, + $table: $db.exercises, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } + + Expression exerciseVideoReferences( + Expression Function($$ExercisesTableAnnotationComposer a) f, + ) { + final $$ExercisesTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.exercises, + getReferencedColumn: (t) => t.videoMediaId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ExercisesTableAnnotationComposer( + $db: $db, + $table: $db.exercises, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } + + Expression programExerciseImageSnapshotReferences( + Expression Function($$ProgramExercisesTableAnnotationComposer a) f, + ) { + final $$ProgramExercisesTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.programExercises, + getReferencedColumn: (t) => t.exerciseImageMediaIdSnapshot, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ProgramExercisesTableAnnotationComposer( + $db: $db, + $table: $db.programExercises, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } + + Expression programExerciseVideoSnapshotReferences( + Expression Function($$ProgramExercisesTableAnnotationComposer a) f, + ) { + final $$ProgramExercisesTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.programExercises, + getReferencedColumn: (t) => t.exerciseVideoMediaIdSnapshot, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ProgramExercisesTableAnnotationComposer( + $db: $db, + $table: $db.programExercises, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } +} + +class $$MediaAssetsTableTableManager + extends + RootTableManager< + _$AppDatabase, + $MediaAssetsTable, + MediaAsset, + $$MediaAssetsTableFilterComposer, + $$MediaAssetsTableOrderingComposer, + $$MediaAssetsTableAnnotationComposer, + $$MediaAssetsTableCreateCompanionBuilder, + $$MediaAssetsTableUpdateCompanionBuilder, + (MediaAsset, $$MediaAssetsTableReferences), + MediaAsset, + PrefetchHooks Function({ + bool exerciseImageReferences, + bool exerciseVideoReferences, + bool programExerciseImageSnapshotReferences, + bool programExerciseVideoSnapshotReferences, + }) + > { + $$MediaAssetsTableTableManager(_$AppDatabase db, $MediaAssetsTable table) + : super( + TableManagerState( + db: db, + table: table, + createFilteringComposer: () => + $$MediaAssetsTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => + $$MediaAssetsTableOrderingComposer($db: db, $table: table), + createComputedFieldComposer: () => + $$MediaAssetsTableAnnotationComposer($db: db, $table: table), + updateCompanionCallback: + ({ + Value id = const Value.absent(), + Value createdAt = const Value.absent(), + Value updatedAt = const Value.absent(), + Value deletedAt = const Value.absent(), + Value schemaVersion = const Value.absent(), + Value syncState = const Value.absent(), + Value localRevision = const Value.absent(), + Value originDeviceId = const Value.absent(), + Value futureOwnerProfileId = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + Value remoteRevision = const Value.absent(), + Value kind = const Value.absent(), + Value localUri = const Value.absent(), + Value mimeType = const Value.absent(), + Value sizeBytes = const Value.absent(), + Value width = const Value.absent(), + Value height = const Value.absent(), + Value durationMs = const Value.absent(), + Value checksum = const Value.absent(), + Value remoteUri = const Value.absent(), + Value thumbnailLocalUri = const Value.absent(), + Value rowid = const Value.absent(), + }) => MediaAssetsCompanion( + id: id, + createdAt: createdAt, + updatedAt: updatedAt, + deletedAt: deletedAt, + schemaVersion: schemaVersion, + syncState: syncState, + localRevision: localRevision, + originDeviceId: originDeviceId, + futureOwnerProfileId: futureOwnerProfileId, + lastSyncedAt: lastSyncedAt, + remoteRevision: remoteRevision, + kind: kind, + localUri: localUri, + mimeType: mimeType, + sizeBytes: sizeBytes, + width: width, + height: height, + durationMs: durationMs, + checksum: checksum, + remoteUri: remoteUri, + thumbnailLocalUri: thumbnailLocalUri, + rowid: rowid, + ), + createCompanionCallback: + ({ + required String id, + required DateTime createdAt, + required DateTime updatedAt, + Value deletedAt = const Value.absent(), + Value schemaVersion = const Value.absent(), + required String syncState, + required int localRevision, + required String originDeviceId, + Value futureOwnerProfileId = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + Value remoteRevision = const Value.absent(), + required String kind, + required String localUri, + Value mimeType = const Value.absent(), + Value sizeBytes = const Value.absent(), + Value width = const Value.absent(), + Value height = const Value.absent(), + Value durationMs = const Value.absent(), + Value checksum = const Value.absent(), + Value remoteUri = const Value.absent(), + Value thumbnailLocalUri = const Value.absent(), + Value rowid = const Value.absent(), + }) => MediaAssetsCompanion.insert( + id: id, + createdAt: createdAt, + updatedAt: updatedAt, + deletedAt: deletedAt, + schemaVersion: schemaVersion, + syncState: syncState, + localRevision: localRevision, + originDeviceId: originDeviceId, + futureOwnerProfileId: futureOwnerProfileId, + lastSyncedAt: lastSyncedAt, + remoteRevision: remoteRevision, + kind: kind, + localUri: localUri, + mimeType: mimeType, + sizeBytes: sizeBytes, + width: width, + height: height, + durationMs: durationMs, + checksum: checksum, + remoteUri: remoteUri, + thumbnailLocalUri: thumbnailLocalUri, + rowid: rowid, + ), + withReferenceMapper: (p0) => p0 + .map( + (e) => ( + e.readTable(table), + $$MediaAssetsTableReferences(db, table, e), + ), + ) + .toList(), + prefetchHooksCallback: + ({ + exerciseImageReferences = false, + exerciseVideoReferences = false, + programExerciseImageSnapshotReferences = false, + programExerciseVideoSnapshotReferences = false, + }) { + return PrefetchHooks( + db: db, + explicitlyWatchedTables: [ + if (exerciseImageReferences) db.exercises, + if (exerciseVideoReferences) db.exercises, + if (programExerciseImageSnapshotReferences) + db.programExercises, + if (programExerciseVideoSnapshotReferences) + db.programExercises, + ], + addJoins: null, + getPrefetchedDataCallback: (items) async { + return [ + if (exerciseImageReferences) + await $_getPrefetchedData< + MediaAsset, + $MediaAssetsTable, + Exercise + >( + currentTable: table, + referencedTable: $$MediaAssetsTableReferences + ._exerciseImageReferencesTable(db), + managerFromTypedResult: (p0) => + $$MediaAssetsTableReferences( + db, + table, + p0, + ).exerciseImageReferences, + referencedItemsForCurrentItem: + (item, referencedItems) => referencedItems.where( + (e) => e.imageMediaId == item.id, + ), + typedResults: items, + ), + if (exerciseVideoReferences) + await $_getPrefetchedData< + MediaAsset, + $MediaAssetsTable, + Exercise + >( + currentTable: table, + referencedTable: $$MediaAssetsTableReferences + ._exerciseVideoReferencesTable(db), + managerFromTypedResult: (p0) => + $$MediaAssetsTableReferences( + db, + table, + p0, + ).exerciseVideoReferences, + referencedItemsForCurrentItem: + (item, referencedItems) => referencedItems.where( + (e) => e.videoMediaId == item.id, + ), + typedResults: items, + ), + if (programExerciseImageSnapshotReferences) + await $_getPrefetchedData< + MediaAsset, + $MediaAssetsTable, + ProgramExercise + >( + currentTable: table, + referencedTable: $$MediaAssetsTableReferences + ._programExerciseImageSnapshotReferencesTable(db), + managerFromTypedResult: (p0) => + $$MediaAssetsTableReferences( + db, + table, + p0, + ).programExerciseImageSnapshotReferences, + referencedItemsForCurrentItem: + (item, referencedItems) => referencedItems.where( + (e) => + e.exerciseImageMediaIdSnapshot == item.id, + ), + typedResults: items, + ), + if (programExerciseVideoSnapshotReferences) + await $_getPrefetchedData< + MediaAsset, + $MediaAssetsTable, + ProgramExercise + >( + currentTable: table, + referencedTable: $$MediaAssetsTableReferences + ._programExerciseVideoSnapshotReferencesTable(db), + managerFromTypedResult: (p0) => + $$MediaAssetsTableReferences( + db, + table, + p0, + ).programExerciseVideoSnapshotReferences, + referencedItemsForCurrentItem: + (item, referencedItems) => referencedItems.where( + (e) => + e.exerciseVideoMediaIdSnapshot == item.id, + ), + typedResults: items, + ), + ]; + }, + ); + }, + ), + ); +} + +typedef $$MediaAssetsTableProcessedTableManager = + ProcessedTableManager< + _$AppDatabase, + $MediaAssetsTable, + MediaAsset, + $$MediaAssetsTableFilterComposer, + $$MediaAssetsTableOrderingComposer, + $$MediaAssetsTableAnnotationComposer, + $$MediaAssetsTableCreateCompanionBuilder, + $$MediaAssetsTableUpdateCompanionBuilder, + (MediaAsset, $$MediaAssetsTableReferences), + MediaAsset, + PrefetchHooks Function({ + bool exerciseImageReferences, + bool exerciseVideoReferences, + bool programExerciseImageSnapshotReferences, + bool programExerciseVideoSnapshotReferences, + }) + >; +typedef $$ExercisesTableCreateCompanionBuilder = + ExercisesCompanion Function({ + required String id, + required DateTime createdAt, + required DateTime updatedAt, + Value deletedAt, + Value schemaVersion, + required String syncState, + required int localRevision, + required String originDeviceId, + Value futureOwnerProfileId, + Value lastSyncedAt, + Value remoteRevision, + required String name, + Value description, + Value imageMediaId, + Value videoMediaId, + required bool hasTimeMeasure, + required bool hasRepsMeasure, + required bool hasScoreMeasure, + Value scoreLabel, + Value scoreUnit, + Value archivedAt, + Value rowid, + }); +typedef $$ExercisesTableUpdateCompanionBuilder = + ExercisesCompanion Function({ + Value id, + Value createdAt, + Value updatedAt, + Value deletedAt, + Value schemaVersion, + Value syncState, + Value localRevision, + Value originDeviceId, + Value futureOwnerProfileId, + Value lastSyncedAt, + Value remoteRevision, + Value name, + Value description, + Value imageMediaId, + Value videoMediaId, + Value hasTimeMeasure, + Value hasRepsMeasure, + Value hasScoreMeasure, + Value scoreLabel, + Value scoreUnit, + Value archivedAt, + Value rowid, + }); + +final class $$ExercisesTableReferences + extends BaseReferences<_$AppDatabase, $ExercisesTable, Exercise> { + $$ExercisesTableReferences(super.$_db, super.$_table, super.$_typedResult); + + static $MediaAssetsTable _imageMediaIdTable(_$AppDatabase db) => + db.mediaAssets.createAlias('exercises__image_media_id__media_assets__id'); + + $$MediaAssetsTableProcessedTableManager? get imageMediaId { + final $_column = $_itemColumn('image_media_id'); + if ($_column == null) return null; + final manager = $$MediaAssetsTableTableManager( + $_db, + $_db.mediaAssets, + ).filter((f) => f.id.sqlEquals($_column)); + final item = $_typedResult.readTableOrNull(_imageMediaIdTable($_db)); + if (item == null) return manager; + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: [item]), + ); + } + + static $MediaAssetsTable _videoMediaIdTable(_$AppDatabase db) => + db.mediaAssets.createAlias('exercises__video_media_id__media_assets__id'); + + $$MediaAssetsTableProcessedTableManager? get videoMediaId { + final $_column = $_itemColumn('video_media_id'); + if ($_column == null) return null; + final manager = $$MediaAssetsTableTableManager( + $_db, + $_db.mediaAssets, + ).filter((f) => f.id.sqlEquals($_column)); + final item = $_typedResult.readTableOrNull(_videoMediaIdTable($_db)); + if (item == null) return manager; + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: [item]), + ); + } + + static MultiTypedResultKey<$ProgramExercisesTable, List> + _programExercisesRefsTable(_$AppDatabase db) => MultiTypedResultKey.fromTable( + db.programExercises, + aliasName: 'exercises__id__program_exercises__source_exercise_id', + ); + + $$ProgramExercisesTableProcessedTableManager get programExercisesRefs { + final manager = + $$ProgramExercisesTableTableManager($_db, $_db.programExercises).filter( + (f) => f.sourceExerciseId.id.sqlEquals($_itemColumn('id')!), + ); + + final cache = $_typedResult.readTableOrNull( + _programExercisesRefsTable($_db), + ); + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: cache), + ); + } +} + +class $$ExercisesTableFilterComposer + extends Composer<_$AppDatabase, $ExercisesTable> { + $$ExercisesTableFilterComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnFilters get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get createdAt => $composableBuilder( + column: $table.createdAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get updatedAt => $composableBuilder( + column: $table.updatedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get deletedAt => $composableBuilder( + column: $table.deletedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get schemaVersion => $composableBuilder( + column: $table.schemaVersion, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get syncState => $composableBuilder( + column: $table.syncState, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get futureOwnerProfileId => $composableBuilder( + column: $table.futureOwnerProfileId, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get lastSyncedAt => $composableBuilder( + column: $table.lastSyncedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get remoteRevision => $composableBuilder( + column: $table.remoteRevision, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get name => $composableBuilder( + column: $table.name, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get description => $composableBuilder( + column: $table.description, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get hasTimeMeasure => $composableBuilder( + column: $table.hasTimeMeasure, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get hasRepsMeasure => $composableBuilder( + column: $table.hasRepsMeasure, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get hasScoreMeasure => $composableBuilder( + column: $table.hasScoreMeasure, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get scoreLabel => $composableBuilder( + column: $table.scoreLabel, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get scoreUnit => $composableBuilder( + column: $table.scoreUnit, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get archivedAt => $composableBuilder( + column: $table.archivedAt, + builder: (column) => ColumnFilters(column), + ); + + $$MediaAssetsTableFilterComposer get imageMediaId { + final $$MediaAssetsTableFilterComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.imageMediaId, + referencedTable: $db.mediaAssets, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$MediaAssetsTableFilterComposer( + $db: $db, + $table: $db.mediaAssets, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } + + $$MediaAssetsTableFilterComposer get videoMediaId { + final $$MediaAssetsTableFilterComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.videoMediaId, + referencedTable: $db.mediaAssets, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$MediaAssetsTableFilterComposer( + $db: $db, + $table: $db.mediaAssets, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } + + Expression programExercisesRefs( + Expression Function($$ProgramExercisesTableFilterComposer f) f, + ) { + final $$ProgramExercisesTableFilterComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.programExercises, + getReferencedColumn: (t) => t.sourceExerciseId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ProgramExercisesTableFilterComposer( + $db: $db, + $table: $db.programExercises, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } +} + +class $$ExercisesTableOrderingComposer + extends Composer<_$AppDatabase, $ExercisesTable> { + $$ExercisesTableOrderingComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnOrderings get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get createdAt => $composableBuilder( + column: $table.createdAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get updatedAt => $composableBuilder( + column: $table.updatedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get deletedAt => $composableBuilder( + column: $table.deletedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get schemaVersion => $composableBuilder( + column: $table.schemaVersion, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get syncState => $composableBuilder( + column: $table.syncState, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get futureOwnerProfileId => $composableBuilder( + column: $table.futureOwnerProfileId, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get lastSyncedAt => $composableBuilder( + column: $table.lastSyncedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get remoteRevision => $composableBuilder( + column: $table.remoteRevision, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get name => $composableBuilder( + column: $table.name, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get description => $composableBuilder( + column: $table.description, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get hasTimeMeasure => $composableBuilder( + column: $table.hasTimeMeasure, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get hasRepsMeasure => $composableBuilder( + column: $table.hasRepsMeasure, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get hasScoreMeasure => $composableBuilder( + column: $table.hasScoreMeasure, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get scoreLabel => $composableBuilder( + column: $table.scoreLabel, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get scoreUnit => $composableBuilder( + column: $table.scoreUnit, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get archivedAt => $composableBuilder( + column: $table.archivedAt, + builder: (column) => ColumnOrderings(column), + ); + + $$MediaAssetsTableOrderingComposer get imageMediaId { + final $$MediaAssetsTableOrderingComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.imageMediaId, + referencedTable: $db.mediaAssets, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$MediaAssetsTableOrderingComposer( + $db: $db, + $table: $db.mediaAssets, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } + + $$MediaAssetsTableOrderingComposer get videoMediaId { + final $$MediaAssetsTableOrderingComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.videoMediaId, + referencedTable: $db.mediaAssets, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$MediaAssetsTableOrderingComposer( + $db: $db, + $table: $db.mediaAssets, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } +} + +class $$ExercisesTableAnnotationComposer + extends Composer<_$AppDatabase, $ExercisesTable> { + $$ExercisesTableAnnotationComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + GeneratedColumn get id => + $composableBuilder(column: $table.id, builder: (column) => column); + + GeneratedColumn get createdAt => + $composableBuilder(column: $table.createdAt, builder: (column) => column); + + GeneratedColumn get updatedAt => + $composableBuilder(column: $table.updatedAt, builder: (column) => column); + + GeneratedColumn get deletedAt => + $composableBuilder(column: $table.deletedAt, builder: (column) => column); + + GeneratedColumn get schemaVersion => $composableBuilder( + column: $table.schemaVersion, + builder: (column) => column, + ); + + GeneratedColumn get syncState => + $composableBuilder(column: $table.syncState, builder: (column) => column); + + GeneratedColumn get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => column, + ); + + GeneratedColumn get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => column, + ); + + GeneratedColumn get futureOwnerProfileId => $composableBuilder( + column: $table.futureOwnerProfileId, + builder: (column) => column, + ); + + GeneratedColumn get lastSyncedAt => $composableBuilder( + column: $table.lastSyncedAt, + builder: (column) => column, + ); + + GeneratedColumn get remoteRevision => $composableBuilder( + column: $table.remoteRevision, + builder: (column) => column, + ); + + GeneratedColumn get name => + $composableBuilder(column: $table.name, builder: (column) => column); + + GeneratedColumn get description => $composableBuilder( + column: $table.description, + builder: (column) => column, + ); + + GeneratedColumn get hasTimeMeasure => $composableBuilder( + column: $table.hasTimeMeasure, + builder: (column) => column, + ); + + GeneratedColumn get hasRepsMeasure => $composableBuilder( + column: $table.hasRepsMeasure, + builder: (column) => column, + ); + + GeneratedColumn get hasScoreMeasure => $composableBuilder( + column: $table.hasScoreMeasure, + builder: (column) => column, + ); + + GeneratedColumn get scoreLabel => $composableBuilder( + column: $table.scoreLabel, + builder: (column) => column, + ); + + GeneratedColumn get scoreUnit => + $composableBuilder(column: $table.scoreUnit, builder: (column) => column); + + GeneratedColumn get archivedAt => $composableBuilder( + column: $table.archivedAt, + builder: (column) => column, + ); + + $$MediaAssetsTableAnnotationComposer get imageMediaId { + final $$MediaAssetsTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.imageMediaId, + referencedTable: $db.mediaAssets, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$MediaAssetsTableAnnotationComposer( + $db: $db, + $table: $db.mediaAssets, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } + + $$MediaAssetsTableAnnotationComposer get videoMediaId { + final $$MediaAssetsTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.videoMediaId, + referencedTable: $db.mediaAssets, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$MediaAssetsTableAnnotationComposer( + $db: $db, + $table: $db.mediaAssets, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } + + Expression programExercisesRefs( + Expression Function($$ProgramExercisesTableAnnotationComposer a) f, + ) { + final $$ProgramExercisesTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.programExercises, + getReferencedColumn: (t) => t.sourceExerciseId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ProgramExercisesTableAnnotationComposer( + $db: $db, + $table: $db.programExercises, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } +} + +class $$ExercisesTableTableManager + extends + RootTableManager< + _$AppDatabase, + $ExercisesTable, + Exercise, + $$ExercisesTableFilterComposer, + $$ExercisesTableOrderingComposer, + $$ExercisesTableAnnotationComposer, + $$ExercisesTableCreateCompanionBuilder, + $$ExercisesTableUpdateCompanionBuilder, + (Exercise, $$ExercisesTableReferences), + Exercise, + PrefetchHooks Function({ + bool imageMediaId, + bool videoMediaId, + bool programExercisesRefs, + }) + > { + $$ExercisesTableTableManager(_$AppDatabase db, $ExercisesTable table) + : super( + TableManagerState( + db: db, + table: table, + createFilteringComposer: () => + $$ExercisesTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => + $$ExercisesTableOrderingComposer($db: db, $table: table), + createComputedFieldComposer: () => + $$ExercisesTableAnnotationComposer($db: db, $table: table), + updateCompanionCallback: + ({ + Value id = const Value.absent(), + Value createdAt = const Value.absent(), + Value updatedAt = const Value.absent(), + Value deletedAt = const Value.absent(), + Value schemaVersion = const Value.absent(), + Value syncState = const Value.absent(), + Value localRevision = const Value.absent(), + Value originDeviceId = const Value.absent(), + Value futureOwnerProfileId = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + Value remoteRevision = const Value.absent(), + Value name = const Value.absent(), + Value description = const Value.absent(), + Value imageMediaId = const Value.absent(), + Value videoMediaId = const Value.absent(), + Value hasTimeMeasure = const Value.absent(), + Value hasRepsMeasure = const Value.absent(), + Value hasScoreMeasure = const Value.absent(), + Value scoreLabel = const Value.absent(), + Value scoreUnit = const Value.absent(), + Value archivedAt = const Value.absent(), + Value rowid = const Value.absent(), + }) => ExercisesCompanion( + id: id, + createdAt: createdAt, + updatedAt: updatedAt, + deletedAt: deletedAt, + schemaVersion: schemaVersion, + syncState: syncState, + localRevision: localRevision, + originDeviceId: originDeviceId, + futureOwnerProfileId: futureOwnerProfileId, + lastSyncedAt: lastSyncedAt, + remoteRevision: remoteRevision, + name: name, + description: description, + imageMediaId: imageMediaId, + videoMediaId: videoMediaId, + hasTimeMeasure: hasTimeMeasure, + hasRepsMeasure: hasRepsMeasure, + hasScoreMeasure: hasScoreMeasure, + scoreLabel: scoreLabel, + scoreUnit: scoreUnit, + archivedAt: archivedAt, + rowid: rowid, + ), + createCompanionCallback: + ({ + required String id, + required DateTime createdAt, + required DateTime updatedAt, + Value deletedAt = const Value.absent(), + Value schemaVersion = const Value.absent(), + required String syncState, + required int localRevision, + required String originDeviceId, + Value futureOwnerProfileId = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + Value remoteRevision = const Value.absent(), + required String name, + Value description = const Value.absent(), + Value imageMediaId = const Value.absent(), + Value videoMediaId = const Value.absent(), + required bool hasTimeMeasure, + required bool hasRepsMeasure, + required bool hasScoreMeasure, + Value scoreLabel = const Value.absent(), + Value scoreUnit = const Value.absent(), + Value archivedAt = const Value.absent(), + Value rowid = const Value.absent(), + }) => ExercisesCompanion.insert( + id: id, + createdAt: createdAt, + updatedAt: updatedAt, + deletedAt: deletedAt, + schemaVersion: schemaVersion, + syncState: syncState, + localRevision: localRevision, + originDeviceId: originDeviceId, + futureOwnerProfileId: futureOwnerProfileId, + lastSyncedAt: lastSyncedAt, + remoteRevision: remoteRevision, + name: name, + description: description, + imageMediaId: imageMediaId, + videoMediaId: videoMediaId, + hasTimeMeasure: hasTimeMeasure, + hasRepsMeasure: hasRepsMeasure, + hasScoreMeasure: hasScoreMeasure, + scoreLabel: scoreLabel, + scoreUnit: scoreUnit, + archivedAt: archivedAt, + rowid: rowid, + ), + withReferenceMapper: (p0) => p0 + .map( + (e) => ( + e.readTable(table), + $$ExercisesTableReferences(db, table, e), + ), + ) + .toList(), + prefetchHooksCallback: + ({ + imageMediaId = false, + videoMediaId = false, + programExercisesRefs = false, + }) { + return PrefetchHooks( + db: db, + explicitlyWatchedTables: [ + if (programExercisesRefs) db.programExercises, + ], + addJoins: + < + T extends TableManagerState< + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic + > + >(state) { + if (imageMediaId) { + state = + state.withJoin( + currentTable: table, + currentColumn: table.imageMediaId, + referencedTable: $$ExercisesTableReferences + ._imageMediaIdTable(db), + referencedColumn: $$ExercisesTableReferences + ._imageMediaIdTable(db) + .id, + ) + as T; + } + if (videoMediaId) { + state = + state.withJoin( + currentTable: table, + currentColumn: table.videoMediaId, + referencedTable: $$ExercisesTableReferences + ._videoMediaIdTable(db), + referencedColumn: $$ExercisesTableReferences + ._videoMediaIdTable(db) + .id, + ) + as T; + } + + return state; + }, + getPrefetchedDataCallback: (items) async { + return [ + if (programExercisesRefs) + await $_getPrefetchedData< + Exercise, + $ExercisesTable, + ProgramExercise + >( + currentTable: table, + referencedTable: $$ExercisesTableReferences + ._programExercisesRefsTable(db), + managerFromTypedResult: (p0) => + $$ExercisesTableReferences( + db, + table, + p0, + ).programExercisesRefs, + referencedItemsForCurrentItem: + (item, referencedItems) => referencedItems.where( + (e) => e.sourceExerciseId == item.id, + ), + typedResults: items, + ), + ]; + }, + ); + }, + ), + ); +} + +typedef $$ExercisesTableProcessedTableManager = + ProcessedTableManager< + _$AppDatabase, + $ExercisesTable, + Exercise, + $$ExercisesTableFilterComposer, + $$ExercisesTableOrderingComposer, + $$ExercisesTableAnnotationComposer, + $$ExercisesTableCreateCompanionBuilder, + $$ExercisesTableUpdateCompanionBuilder, + (Exercise, $$ExercisesTableReferences), + Exercise, + PrefetchHooks Function({ + bool imageMediaId, + bool videoMediaId, + bool programExercisesRefs, + }) + >; +typedef $$ProgramsTableCreateCompanionBuilder = + ProgramsCompanion Function({ + required String id, + required DateTime createdAt, + required DateTime updatedAt, + Value deletedAt, + Value schemaVersion, + required String syncState, + required int localRevision, + required String originDeviceId, + Value futureOwnerProfileId, + Value lastSyncedAt, + Value remoteRevision, + required String name, + required int defaultRestSeconds, + Value rowid, + }); +typedef $$ProgramsTableUpdateCompanionBuilder = + ProgramsCompanion Function({ + Value id, + Value createdAt, + Value updatedAt, + Value deletedAt, + Value schemaVersion, + Value syncState, + Value localRevision, + Value originDeviceId, + Value futureOwnerProfileId, + Value lastSyncedAt, + Value remoteRevision, + Value name, + Value defaultRestSeconds, + Value rowid, + }); + +final class $$ProgramsTableReferences + extends BaseReferences<_$AppDatabase, $ProgramsTable, Program> { + $$ProgramsTableReferences(super.$_db, super.$_table, super.$_typedResult); + + static MultiTypedResultKey<$ProgramExercisesTable, List> + _programExercisesRefsTable(_$AppDatabase db) => MultiTypedResultKey.fromTable( + db.programExercises, + aliasName: 'programs__id__program_exercises__program_id', + ); + + $$ProgramExercisesTableProcessedTableManager get programExercisesRefs { + final manager = $$ProgramExercisesTableTableManager( + $_db, + $_db.programExercises, + ).filter((f) => f.programId.id.sqlEquals($_itemColumn('id')!)); + + final cache = $_typedResult.readTableOrNull( + _programExercisesRefsTable($_db), + ); + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: cache), + ); + } + + static MultiTypedResultKey< + $WorkoutTemplateProgramsTable, + List + > + _workoutTemplateProgramsRefsTable(_$AppDatabase db) => + MultiTypedResultKey.fromTable( + db.workoutTemplatePrograms, + aliasName: 'programs__id__workout_template_programs__source_program_id', + ); + + $$WorkoutTemplateProgramsTableProcessedTableManager + get workoutTemplateProgramsRefs { + final manager = + $$WorkoutTemplateProgramsTableTableManager( + $_db, + $_db.workoutTemplatePrograms, + ).filter( + (f) => f.sourceProgramId.id.sqlEquals($_itemColumn('id')!), + ); + + final cache = $_typedResult.readTableOrNull( + _workoutTemplateProgramsRefsTable($_db), + ); + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: cache), + ); + } +} + +class $$ProgramsTableFilterComposer + extends Composer<_$AppDatabase, $ProgramsTable> { + $$ProgramsTableFilterComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnFilters get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get createdAt => $composableBuilder( + column: $table.createdAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get updatedAt => $composableBuilder( + column: $table.updatedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get deletedAt => $composableBuilder( + column: $table.deletedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get schemaVersion => $composableBuilder( + column: $table.schemaVersion, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get syncState => $composableBuilder( + column: $table.syncState, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get futureOwnerProfileId => $composableBuilder( + column: $table.futureOwnerProfileId, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get lastSyncedAt => $composableBuilder( + column: $table.lastSyncedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get remoteRevision => $composableBuilder( + column: $table.remoteRevision, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get name => $composableBuilder( + column: $table.name, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get defaultRestSeconds => $composableBuilder( + column: $table.defaultRestSeconds, + builder: (column) => ColumnFilters(column), + ); + + Expression programExercisesRefs( + Expression Function($$ProgramExercisesTableFilterComposer f) f, + ) { + final $$ProgramExercisesTableFilterComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.programExercises, + getReferencedColumn: (t) => t.programId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ProgramExercisesTableFilterComposer( + $db: $db, + $table: $db.programExercises, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } + + Expression workoutTemplateProgramsRefs( + Expression Function($$WorkoutTemplateProgramsTableFilterComposer f) f, + ) { + final $$WorkoutTemplateProgramsTableFilterComposer composer = + $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.workoutTemplatePrograms, + getReferencedColumn: (t) => t.sourceProgramId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$WorkoutTemplateProgramsTableFilterComposer( + $db: $db, + $table: $db.workoutTemplatePrograms, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } +} + +class $$ProgramsTableOrderingComposer + extends Composer<_$AppDatabase, $ProgramsTable> { + $$ProgramsTableOrderingComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnOrderings get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get createdAt => $composableBuilder( + column: $table.createdAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get updatedAt => $composableBuilder( + column: $table.updatedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get deletedAt => $composableBuilder( + column: $table.deletedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get schemaVersion => $composableBuilder( + column: $table.schemaVersion, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get syncState => $composableBuilder( + column: $table.syncState, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get futureOwnerProfileId => $composableBuilder( + column: $table.futureOwnerProfileId, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get lastSyncedAt => $composableBuilder( + column: $table.lastSyncedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get remoteRevision => $composableBuilder( + column: $table.remoteRevision, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get name => $composableBuilder( + column: $table.name, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get defaultRestSeconds => $composableBuilder( + column: $table.defaultRestSeconds, + builder: (column) => ColumnOrderings(column), + ); +} + +class $$ProgramsTableAnnotationComposer + extends Composer<_$AppDatabase, $ProgramsTable> { + $$ProgramsTableAnnotationComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + GeneratedColumn get id => + $composableBuilder(column: $table.id, builder: (column) => column); + + GeneratedColumn get createdAt => + $composableBuilder(column: $table.createdAt, builder: (column) => column); + + GeneratedColumn get updatedAt => + $composableBuilder(column: $table.updatedAt, builder: (column) => column); + + GeneratedColumn get deletedAt => + $composableBuilder(column: $table.deletedAt, builder: (column) => column); + + GeneratedColumn get schemaVersion => $composableBuilder( + column: $table.schemaVersion, + builder: (column) => column, + ); + + GeneratedColumn get syncState => + $composableBuilder(column: $table.syncState, builder: (column) => column); + + GeneratedColumn get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => column, + ); + + GeneratedColumn get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => column, + ); + + GeneratedColumn get futureOwnerProfileId => $composableBuilder( + column: $table.futureOwnerProfileId, + builder: (column) => column, + ); + + GeneratedColumn get lastSyncedAt => $composableBuilder( + column: $table.lastSyncedAt, + builder: (column) => column, + ); + + GeneratedColumn get remoteRevision => $composableBuilder( + column: $table.remoteRevision, + builder: (column) => column, + ); + + GeneratedColumn get name => + $composableBuilder(column: $table.name, builder: (column) => column); + + GeneratedColumn get defaultRestSeconds => $composableBuilder( + column: $table.defaultRestSeconds, + builder: (column) => column, + ); + + Expression programExercisesRefs( + Expression Function($$ProgramExercisesTableAnnotationComposer a) f, + ) { + final $$ProgramExercisesTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.programExercises, + getReferencedColumn: (t) => t.programId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ProgramExercisesTableAnnotationComposer( + $db: $db, + $table: $db.programExercises, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } + + Expression workoutTemplateProgramsRefs( + Expression Function($$WorkoutTemplateProgramsTableAnnotationComposer a) + f, + ) { + final $$WorkoutTemplateProgramsTableAnnotationComposer composer = + $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.workoutTemplatePrograms, + getReferencedColumn: (t) => t.sourceProgramId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$WorkoutTemplateProgramsTableAnnotationComposer( + $db: $db, + $table: $db.workoutTemplatePrograms, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } +} + +class $$ProgramsTableTableManager + extends + RootTableManager< + _$AppDatabase, + $ProgramsTable, + Program, + $$ProgramsTableFilterComposer, + $$ProgramsTableOrderingComposer, + $$ProgramsTableAnnotationComposer, + $$ProgramsTableCreateCompanionBuilder, + $$ProgramsTableUpdateCompanionBuilder, + (Program, $$ProgramsTableReferences), + Program, + PrefetchHooks Function({ + bool programExercisesRefs, + bool workoutTemplateProgramsRefs, + }) + > { + $$ProgramsTableTableManager(_$AppDatabase db, $ProgramsTable table) + : super( + TableManagerState( + db: db, + table: table, + createFilteringComposer: () => + $$ProgramsTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => + $$ProgramsTableOrderingComposer($db: db, $table: table), + createComputedFieldComposer: () => + $$ProgramsTableAnnotationComposer($db: db, $table: table), + updateCompanionCallback: + ({ + Value id = const Value.absent(), + Value createdAt = const Value.absent(), + Value updatedAt = const Value.absent(), + Value deletedAt = const Value.absent(), + Value schemaVersion = const Value.absent(), + Value syncState = const Value.absent(), + Value localRevision = const Value.absent(), + Value originDeviceId = const Value.absent(), + Value futureOwnerProfileId = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + Value remoteRevision = const Value.absent(), + Value name = const Value.absent(), + Value defaultRestSeconds = const Value.absent(), + Value rowid = const Value.absent(), + }) => ProgramsCompanion( + id: id, + createdAt: createdAt, + updatedAt: updatedAt, + deletedAt: deletedAt, + schemaVersion: schemaVersion, + syncState: syncState, + localRevision: localRevision, + originDeviceId: originDeviceId, + futureOwnerProfileId: futureOwnerProfileId, + lastSyncedAt: lastSyncedAt, + remoteRevision: remoteRevision, + name: name, + defaultRestSeconds: defaultRestSeconds, + rowid: rowid, + ), + createCompanionCallback: + ({ + required String id, + required DateTime createdAt, + required DateTime updatedAt, + Value deletedAt = const Value.absent(), + Value schemaVersion = const Value.absent(), + required String syncState, + required int localRevision, + required String originDeviceId, + Value futureOwnerProfileId = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + Value remoteRevision = const Value.absent(), + required String name, + required int defaultRestSeconds, + Value rowid = const Value.absent(), + }) => ProgramsCompanion.insert( + id: id, + createdAt: createdAt, + updatedAt: updatedAt, + deletedAt: deletedAt, + schemaVersion: schemaVersion, + syncState: syncState, + localRevision: localRevision, + originDeviceId: originDeviceId, + futureOwnerProfileId: futureOwnerProfileId, + lastSyncedAt: lastSyncedAt, + remoteRevision: remoteRevision, + name: name, + defaultRestSeconds: defaultRestSeconds, + rowid: rowid, + ), + withReferenceMapper: (p0) => p0 + .map( + (e) => ( + e.readTable(table), + $$ProgramsTableReferences(db, table, e), + ), + ) + .toList(), + prefetchHooksCallback: + ({ + programExercisesRefs = false, + workoutTemplateProgramsRefs = false, + }) { + return PrefetchHooks( + db: db, + explicitlyWatchedTables: [ + if (programExercisesRefs) db.programExercises, + if (workoutTemplateProgramsRefs) db.workoutTemplatePrograms, + ], + addJoins: null, + getPrefetchedDataCallback: (items) async { + return [ + if (programExercisesRefs) + await $_getPrefetchedData< + Program, + $ProgramsTable, + ProgramExercise + >( + currentTable: table, + referencedTable: $$ProgramsTableReferences + ._programExercisesRefsTable(db), + managerFromTypedResult: (p0) => + $$ProgramsTableReferences( + db, + table, + p0, + ).programExercisesRefs, + referencedItemsForCurrentItem: + (item, referencedItems) => referencedItems.where( + (e) => e.programId == item.id, + ), + typedResults: items, + ), + if (workoutTemplateProgramsRefs) + await $_getPrefetchedData< + Program, + $ProgramsTable, + WorkoutTemplateProgram + >( + currentTable: table, + referencedTable: $$ProgramsTableReferences + ._workoutTemplateProgramsRefsTable(db), + managerFromTypedResult: (p0) => + $$ProgramsTableReferences( + db, + table, + p0, + ).workoutTemplateProgramsRefs, + referencedItemsForCurrentItem: + (item, referencedItems) => referencedItems.where( + (e) => e.sourceProgramId == item.id, + ), + typedResults: items, + ), + ]; + }, + ); + }, + ), + ); +} + +typedef $$ProgramsTableProcessedTableManager = + ProcessedTableManager< + _$AppDatabase, + $ProgramsTable, + Program, + $$ProgramsTableFilterComposer, + $$ProgramsTableOrderingComposer, + $$ProgramsTableAnnotationComposer, + $$ProgramsTableCreateCompanionBuilder, + $$ProgramsTableUpdateCompanionBuilder, + (Program, $$ProgramsTableReferences), + Program, + PrefetchHooks Function({ + bool programExercisesRefs, + bool workoutTemplateProgramsRefs, + }) + >; +typedef $$ProgramExercisesTableCreateCompanionBuilder = + ProgramExercisesCompanion Function({ + required String id, + required DateTime createdAt, + required DateTime updatedAt, + Value deletedAt, + Value schemaVersion, + required String syncState, + required int localRevision, + required String originDeviceId, + Value futureOwnerProfileId, + Value lastSyncedAt, + Value remoteRevision, + required String programId, + Value sourceExerciseId, + required int position, + required String exerciseNameSnapshot, + Value exerciseDescriptionSnapshot, + Value exerciseImageMediaIdSnapshot, + Value exerciseVideoMediaIdSnapshot, + Value exerciseArchivedSnapshot, + required bool availableTimeSnapshot, + required bool availableRepsSnapshot, + required bool availableScoreSnapshot, + Value scoreLabelSnapshot, + Value scoreUnitSnapshot, + required int setsCount, + required bool timeEnabled, + required bool repsEnabled, + required bool scoreEnabled, + Value targetTimeSeconds, + Value targetReps, + Value targetScore, + Value restSecondsOverride, + Value rowid, + }); +typedef $$ProgramExercisesTableUpdateCompanionBuilder = + ProgramExercisesCompanion Function({ + Value id, + Value createdAt, + Value updatedAt, + Value deletedAt, + Value schemaVersion, + Value syncState, + Value localRevision, + Value originDeviceId, + Value futureOwnerProfileId, + Value lastSyncedAt, + Value remoteRevision, + Value programId, + Value sourceExerciseId, + Value position, + Value exerciseNameSnapshot, + Value exerciseDescriptionSnapshot, + Value exerciseImageMediaIdSnapshot, + Value exerciseVideoMediaIdSnapshot, + Value exerciseArchivedSnapshot, + Value availableTimeSnapshot, + Value availableRepsSnapshot, + Value availableScoreSnapshot, + Value scoreLabelSnapshot, + Value scoreUnitSnapshot, + Value setsCount, + Value timeEnabled, + Value repsEnabled, + Value scoreEnabled, + Value targetTimeSeconds, + Value targetReps, + Value targetScore, + Value restSecondsOverride, + Value rowid, + }); + +final class $$ProgramExercisesTableReferences + extends + BaseReferences<_$AppDatabase, $ProgramExercisesTable, ProgramExercise> { + $$ProgramExercisesTableReferences( + super.$_db, + super.$_table, + super.$_typedResult, + ); + + static $ProgramsTable _programIdTable(_$AppDatabase db) => + db.programs.createAlias('program_exercises__program_id__programs__id'); + + $$ProgramsTableProcessedTableManager get programId { + final $_column = $_itemColumn('program_id')!; + + final manager = $$ProgramsTableTableManager( + $_db, + $_db.programs, + ).filter((f) => f.id.sqlEquals($_column)); + final item = $_typedResult.readTableOrNull(_programIdTable($_db)); + if (item == null) return manager; + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: [item]), + ); + } + + static $ExercisesTable _sourceExerciseIdTable(_$AppDatabase db) => db + .exercises + .createAlias('program_exercises__source_exercise_id__exercises__id'); + + $$ExercisesTableProcessedTableManager? get sourceExerciseId { + final $_column = $_itemColumn('source_exercise_id'); + if ($_column == null) return null; + final manager = $$ExercisesTableTableManager( + $_db, + $_db.exercises, + ).filter((f) => f.id.sqlEquals($_column)); + final item = $_typedResult.readTableOrNull(_sourceExerciseIdTable($_db)); + if (item == null) return manager; + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: [item]), + ); + } + + static $MediaAssetsTable _exerciseImageMediaIdSnapshotTable( + _$AppDatabase db, + ) => db.mediaAssets.createAlias( + 'program_exercises__exercise_image_media_id_snapshot__media_assets__id', + ); + + $$MediaAssetsTableProcessedTableManager? get exerciseImageMediaIdSnapshot { + final $_column = $_itemColumn('exercise_image_media_id_snapshot'); + if ($_column == null) return null; + final manager = $$MediaAssetsTableTableManager( + $_db, + $_db.mediaAssets, + ).filter((f) => f.id.sqlEquals($_column)); + final item = $_typedResult.readTableOrNull( + _exerciseImageMediaIdSnapshotTable($_db), + ); + if (item == null) return manager; + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: [item]), + ); + } + + static $MediaAssetsTable _exerciseVideoMediaIdSnapshotTable( + _$AppDatabase db, + ) => db.mediaAssets.createAlias( + 'program_exercises__exercise_video_media_id_snapshot__media_assets__id', + ); + + $$MediaAssetsTableProcessedTableManager? get exerciseVideoMediaIdSnapshot { + final $_column = $_itemColumn('exercise_video_media_id_snapshot'); + if ($_column == null) return null; + final manager = $$MediaAssetsTableTableManager( + $_db, + $_db.mediaAssets, + ).filter((f) => f.id.sqlEquals($_column)); + final item = $_typedResult.readTableOrNull( + _exerciseVideoMediaIdSnapshotTable($_db), + ); + if (item == null) return manager; + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: [item]), + ); + } +} + +class $$ProgramExercisesTableFilterComposer + extends Composer<_$AppDatabase, $ProgramExercisesTable> { + $$ProgramExercisesTableFilterComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnFilters get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get createdAt => $composableBuilder( + column: $table.createdAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get updatedAt => $composableBuilder( + column: $table.updatedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get deletedAt => $composableBuilder( + column: $table.deletedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get schemaVersion => $composableBuilder( + column: $table.schemaVersion, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get syncState => $composableBuilder( + column: $table.syncState, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get futureOwnerProfileId => $composableBuilder( + column: $table.futureOwnerProfileId, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get lastSyncedAt => $composableBuilder( + column: $table.lastSyncedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get remoteRevision => $composableBuilder( + column: $table.remoteRevision, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get position => $composableBuilder( + column: $table.position, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get exerciseNameSnapshot => $composableBuilder( + column: $table.exerciseNameSnapshot, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get exerciseDescriptionSnapshot => $composableBuilder( + column: $table.exerciseDescriptionSnapshot, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get exerciseArchivedSnapshot => $composableBuilder( + column: $table.exerciseArchivedSnapshot, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get availableTimeSnapshot => $composableBuilder( + column: $table.availableTimeSnapshot, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get availableRepsSnapshot => $composableBuilder( + column: $table.availableRepsSnapshot, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get availableScoreSnapshot => $composableBuilder( + column: $table.availableScoreSnapshot, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get scoreLabelSnapshot => $composableBuilder( + column: $table.scoreLabelSnapshot, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get scoreUnitSnapshot => $composableBuilder( + column: $table.scoreUnitSnapshot, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get setsCount => $composableBuilder( + column: $table.setsCount, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get timeEnabled => $composableBuilder( + column: $table.timeEnabled, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get repsEnabled => $composableBuilder( + column: $table.repsEnabled, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get scoreEnabled => $composableBuilder( + column: $table.scoreEnabled, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get targetTimeSeconds => $composableBuilder( + column: $table.targetTimeSeconds, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get targetReps => $composableBuilder( + column: $table.targetReps, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get targetScore => $composableBuilder( + column: $table.targetScore, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get restSecondsOverride => $composableBuilder( + column: $table.restSecondsOverride, + builder: (column) => ColumnFilters(column), + ); + + $$ProgramsTableFilterComposer get programId { + final $$ProgramsTableFilterComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.programId, + referencedTable: $db.programs, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ProgramsTableFilterComposer( + $db: $db, + $table: $db.programs, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } + + $$ExercisesTableFilterComposer get sourceExerciseId { + final $$ExercisesTableFilterComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.sourceExerciseId, + referencedTable: $db.exercises, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ExercisesTableFilterComposer( + $db: $db, + $table: $db.exercises, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } + + $$MediaAssetsTableFilterComposer get exerciseImageMediaIdSnapshot { + final $$MediaAssetsTableFilterComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.exerciseImageMediaIdSnapshot, + referencedTable: $db.mediaAssets, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$MediaAssetsTableFilterComposer( + $db: $db, + $table: $db.mediaAssets, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } + + $$MediaAssetsTableFilterComposer get exerciseVideoMediaIdSnapshot { + final $$MediaAssetsTableFilterComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.exerciseVideoMediaIdSnapshot, + referencedTable: $db.mediaAssets, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$MediaAssetsTableFilterComposer( + $db: $db, + $table: $db.mediaAssets, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } +} + +class $$ProgramExercisesTableOrderingComposer + extends Composer<_$AppDatabase, $ProgramExercisesTable> { + $$ProgramExercisesTableOrderingComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnOrderings get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get createdAt => $composableBuilder( + column: $table.createdAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get updatedAt => $composableBuilder( + column: $table.updatedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get deletedAt => $composableBuilder( + column: $table.deletedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get schemaVersion => $composableBuilder( + column: $table.schemaVersion, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get syncState => $composableBuilder( + column: $table.syncState, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get futureOwnerProfileId => $composableBuilder( + column: $table.futureOwnerProfileId, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get lastSyncedAt => $composableBuilder( + column: $table.lastSyncedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get remoteRevision => $composableBuilder( + column: $table.remoteRevision, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get position => $composableBuilder( + column: $table.position, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get exerciseNameSnapshot => $composableBuilder( + column: $table.exerciseNameSnapshot, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get exerciseDescriptionSnapshot => $composableBuilder( + column: $table.exerciseDescriptionSnapshot, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get exerciseArchivedSnapshot => $composableBuilder( + column: $table.exerciseArchivedSnapshot, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get availableTimeSnapshot => $composableBuilder( + column: $table.availableTimeSnapshot, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get availableRepsSnapshot => $composableBuilder( + column: $table.availableRepsSnapshot, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get availableScoreSnapshot => $composableBuilder( + column: $table.availableScoreSnapshot, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get scoreLabelSnapshot => $composableBuilder( + column: $table.scoreLabelSnapshot, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get scoreUnitSnapshot => $composableBuilder( + column: $table.scoreUnitSnapshot, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get setsCount => $composableBuilder( + column: $table.setsCount, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get timeEnabled => $composableBuilder( + column: $table.timeEnabled, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get repsEnabled => $composableBuilder( + column: $table.repsEnabled, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get scoreEnabled => $composableBuilder( + column: $table.scoreEnabled, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get targetTimeSeconds => $composableBuilder( + column: $table.targetTimeSeconds, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get targetReps => $composableBuilder( + column: $table.targetReps, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get targetScore => $composableBuilder( + column: $table.targetScore, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get restSecondsOverride => $composableBuilder( + column: $table.restSecondsOverride, + builder: (column) => ColumnOrderings(column), + ); + + $$ProgramsTableOrderingComposer get programId { + final $$ProgramsTableOrderingComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.programId, + referencedTable: $db.programs, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ProgramsTableOrderingComposer( + $db: $db, + $table: $db.programs, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } + + $$ExercisesTableOrderingComposer get sourceExerciseId { + final $$ExercisesTableOrderingComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.sourceExerciseId, + referencedTable: $db.exercises, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ExercisesTableOrderingComposer( + $db: $db, + $table: $db.exercises, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } + + $$MediaAssetsTableOrderingComposer get exerciseImageMediaIdSnapshot { + final $$MediaAssetsTableOrderingComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.exerciseImageMediaIdSnapshot, + referencedTable: $db.mediaAssets, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$MediaAssetsTableOrderingComposer( + $db: $db, + $table: $db.mediaAssets, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } + + $$MediaAssetsTableOrderingComposer get exerciseVideoMediaIdSnapshot { + final $$MediaAssetsTableOrderingComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.exerciseVideoMediaIdSnapshot, + referencedTable: $db.mediaAssets, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$MediaAssetsTableOrderingComposer( + $db: $db, + $table: $db.mediaAssets, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } +} + +class $$ProgramExercisesTableAnnotationComposer + extends Composer<_$AppDatabase, $ProgramExercisesTable> { + $$ProgramExercisesTableAnnotationComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + GeneratedColumn get id => + $composableBuilder(column: $table.id, builder: (column) => column); + + GeneratedColumn get createdAt => + $composableBuilder(column: $table.createdAt, builder: (column) => column); + + GeneratedColumn get updatedAt => + $composableBuilder(column: $table.updatedAt, builder: (column) => column); + + GeneratedColumn get deletedAt => + $composableBuilder(column: $table.deletedAt, builder: (column) => column); + + GeneratedColumn get schemaVersion => $composableBuilder( + column: $table.schemaVersion, + builder: (column) => column, + ); + + GeneratedColumn get syncState => + $composableBuilder(column: $table.syncState, builder: (column) => column); + + GeneratedColumn get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => column, + ); + + GeneratedColumn get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => column, + ); + + GeneratedColumn get futureOwnerProfileId => $composableBuilder( + column: $table.futureOwnerProfileId, + builder: (column) => column, + ); + + GeneratedColumn get lastSyncedAt => $composableBuilder( + column: $table.lastSyncedAt, + builder: (column) => column, + ); + + GeneratedColumn get remoteRevision => $composableBuilder( + column: $table.remoteRevision, + builder: (column) => column, + ); + + GeneratedColumn get position => + $composableBuilder(column: $table.position, builder: (column) => column); + + GeneratedColumn get exerciseNameSnapshot => $composableBuilder( + column: $table.exerciseNameSnapshot, + builder: (column) => column, + ); + + GeneratedColumn get exerciseDescriptionSnapshot => $composableBuilder( + column: $table.exerciseDescriptionSnapshot, + builder: (column) => column, + ); + + GeneratedColumn get exerciseArchivedSnapshot => $composableBuilder( + column: $table.exerciseArchivedSnapshot, + builder: (column) => column, + ); + + GeneratedColumn get availableTimeSnapshot => $composableBuilder( + column: $table.availableTimeSnapshot, + builder: (column) => column, + ); + + GeneratedColumn get availableRepsSnapshot => $composableBuilder( + column: $table.availableRepsSnapshot, + builder: (column) => column, + ); + + GeneratedColumn get availableScoreSnapshot => $composableBuilder( + column: $table.availableScoreSnapshot, + builder: (column) => column, + ); + + GeneratedColumn get scoreLabelSnapshot => $composableBuilder( + column: $table.scoreLabelSnapshot, + builder: (column) => column, + ); + + GeneratedColumn get scoreUnitSnapshot => $composableBuilder( + column: $table.scoreUnitSnapshot, + builder: (column) => column, + ); + + GeneratedColumn get setsCount => + $composableBuilder(column: $table.setsCount, builder: (column) => column); + + GeneratedColumn get timeEnabled => $composableBuilder( + column: $table.timeEnabled, + builder: (column) => column, + ); + + GeneratedColumn get repsEnabled => $composableBuilder( + column: $table.repsEnabled, + builder: (column) => column, + ); + + GeneratedColumn get scoreEnabled => $composableBuilder( + column: $table.scoreEnabled, + builder: (column) => column, + ); + + GeneratedColumn get targetTimeSeconds => $composableBuilder( + column: $table.targetTimeSeconds, + builder: (column) => column, + ); + + GeneratedColumn get targetReps => $composableBuilder( + column: $table.targetReps, + builder: (column) => column, + ); + + GeneratedColumn get targetScore => $composableBuilder( + column: $table.targetScore, + builder: (column) => column, + ); + + GeneratedColumn get restSecondsOverride => $composableBuilder( + column: $table.restSecondsOverride, + builder: (column) => column, + ); + + $$ProgramsTableAnnotationComposer get programId { + final $$ProgramsTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.programId, + referencedTable: $db.programs, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ProgramsTableAnnotationComposer( + $db: $db, + $table: $db.programs, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } + + $$ExercisesTableAnnotationComposer get sourceExerciseId { + final $$ExercisesTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.sourceExerciseId, + referencedTable: $db.exercises, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ExercisesTableAnnotationComposer( + $db: $db, + $table: $db.exercises, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } + + $$MediaAssetsTableAnnotationComposer get exerciseImageMediaIdSnapshot { + final $$MediaAssetsTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.exerciseImageMediaIdSnapshot, + referencedTable: $db.mediaAssets, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$MediaAssetsTableAnnotationComposer( + $db: $db, + $table: $db.mediaAssets, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } + + $$MediaAssetsTableAnnotationComposer get exerciseVideoMediaIdSnapshot { + final $$MediaAssetsTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.exerciseVideoMediaIdSnapshot, + referencedTable: $db.mediaAssets, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$MediaAssetsTableAnnotationComposer( + $db: $db, + $table: $db.mediaAssets, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } +} + +class $$ProgramExercisesTableTableManager + extends + RootTableManager< + _$AppDatabase, + $ProgramExercisesTable, + ProgramExercise, + $$ProgramExercisesTableFilterComposer, + $$ProgramExercisesTableOrderingComposer, + $$ProgramExercisesTableAnnotationComposer, + $$ProgramExercisesTableCreateCompanionBuilder, + $$ProgramExercisesTableUpdateCompanionBuilder, + (ProgramExercise, $$ProgramExercisesTableReferences), + ProgramExercise, + PrefetchHooks Function({ + bool programId, + bool sourceExerciseId, + bool exerciseImageMediaIdSnapshot, + bool exerciseVideoMediaIdSnapshot, + }) + > { + $$ProgramExercisesTableTableManager( + _$AppDatabase db, + $ProgramExercisesTable table, + ) : super( + TableManagerState( + db: db, + table: table, + createFilteringComposer: () => + $$ProgramExercisesTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => + $$ProgramExercisesTableOrderingComposer($db: db, $table: table), + createComputedFieldComposer: () => + $$ProgramExercisesTableAnnotationComposer($db: db, $table: table), + updateCompanionCallback: + ({ + Value id = const Value.absent(), + Value createdAt = const Value.absent(), + Value updatedAt = const Value.absent(), + Value deletedAt = const Value.absent(), + Value schemaVersion = const Value.absent(), + Value syncState = const Value.absent(), + Value localRevision = const Value.absent(), + Value originDeviceId = const Value.absent(), + Value futureOwnerProfileId = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + Value remoteRevision = const Value.absent(), + Value programId = const Value.absent(), + Value sourceExerciseId = const Value.absent(), + Value position = const Value.absent(), + Value exerciseNameSnapshot = const Value.absent(), + Value exerciseDescriptionSnapshot = + const Value.absent(), + Value exerciseImageMediaIdSnapshot = + const Value.absent(), + Value exerciseVideoMediaIdSnapshot = + const Value.absent(), + Value exerciseArchivedSnapshot = const Value.absent(), + Value availableTimeSnapshot = const Value.absent(), + Value availableRepsSnapshot = const Value.absent(), + Value availableScoreSnapshot = const Value.absent(), + Value scoreLabelSnapshot = const Value.absent(), + Value scoreUnitSnapshot = const Value.absent(), + Value setsCount = const Value.absent(), + Value timeEnabled = const Value.absent(), + Value repsEnabled = const Value.absent(), + Value scoreEnabled = const Value.absent(), + Value targetTimeSeconds = const Value.absent(), + Value targetReps = const Value.absent(), + Value targetScore = const Value.absent(), + Value restSecondsOverride = const Value.absent(), + Value rowid = const Value.absent(), + }) => ProgramExercisesCompanion( + id: id, + createdAt: createdAt, + updatedAt: updatedAt, + deletedAt: deletedAt, + schemaVersion: schemaVersion, + syncState: syncState, + localRevision: localRevision, + originDeviceId: originDeviceId, + futureOwnerProfileId: futureOwnerProfileId, + lastSyncedAt: lastSyncedAt, + remoteRevision: remoteRevision, + programId: programId, + sourceExerciseId: sourceExerciseId, + position: position, + exerciseNameSnapshot: exerciseNameSnapshot, + exerciseDescriptionSnapshot: exerciseDescriptionSnapshot, + exerciseImageMediaIdSnapshot: exerciseImageMediaIdSnapshot, + exerciseVideoMediaIdSnapshot: exerciseVideoMediaIdSnapshot, + exerciseArchivedSnapshot: exerciseArchivedSnapshot, + availableTimeSnapshot: availableTimeSnapshot, + availableRepsSnapshot: availableRepsSnapshot, + availableScoreSnapshot: availableScoreSnapshot, + scoreLabelSnapshot: scoreLabelSnapshot, + scoreUnitSnapshot: scoreUnitSnapshot, + setsCount: setsCount, + timeEnabled: timeEnabled, + repsEnabled: repsEnabled, + scoreEnabled: scoreEnabled, + targetTimeSeconds: targetTimeSeconds, + targetReps: targetReps, + targetScore: targetScore, + restSecondsOverride: restSecondsOverride, + rowid: rowid, + ), + createCompanionCallback: + ({ + required String id, + required DateTime createdAt, + required DateTime updatedAt, + Value deletedAt = const Value.absent(), + Value schemaVersion = const Value.absent(), + required String syncState, + required int localRevision, + required String originDeviceId, + Value futureOwnerProfileId = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + Value remoteRevision = const Value.absent(), + required String programId, + Value sourceExerciseId = const Value.absent(), + required int position, + required String exerciseNameSnapshot, + Value exerciseDescriptionSnapshot = + const Value.absent(), + Value exerciseImageMediaIdSnapshot = + const Value.absent(), + Value exerciseVideoMediaIdSnapshot = + const Value.absent(), + Value exerciseArchivedSnapshot = const Value.absent(), + required bool availableTimeSnapshot, + required bool availableRepsSnapshot, + required bool availableScoreSnapshot, + Value scoreLabelSnapshot = const Value.absent(), + Value scoreUnitSnapshot = const Value.absent(), + required int setsCount, + required bool timeEnabled, + required bool repsEnabled, + required bool scoreEnabled, + Value targetTimeSeconds = const Value.absent(), + Value targetReps = const Value.absent(), + Value targetScore = const Value.absent(), + Value restSecondsOverride = const Value.absent(), + Value rowid = const Value.absent(), + }) => ProgramExercisesCompanion.insert( + id: id, + createdAt: createdAt, + updatedAt: updatedAt, + deletedAt: deletedAt, + schemaVersion: schemaVersion, + syncState: syncState, + localRevision: localRevision, + originDeviceId: originDeviceId, + futureOwnerProfileId: futureOwnerProfileId, + lastSyncedAt: lastSyncedAt, + remoteRevision: remoteRevision, + programId: programId, + sourceExerciseId: sourceExerciseId, + position: position, + exerciseNameSnapshot: exerciseNameSnapshot, + exerciseDescriptionSnapshot: exerciseDescriptionSnapshot, + exerciseImageMediaIdSnapshot: exerciseImageMediaIdSnapshot, + exerciseVideoMediaIdSnapshot: exerciseVideoMediaIdSnapshot, + exerciseArchivedSnapshot: exerciseArchivedSnapshot, + availableTimeSnapshot: availableTimeSnapshot, + availableRepsSnapshot: availableRepsSnapshot, + availableScoreSnapshot: availableScoreSnapshot, + scoreLabelSnapshot: scoreLabelSnapshot, + scoreUnitSnapshot: scoreUnitSnapshot, + setsCount: setsCount, + timeEnabled: timeEnabled, + repsEnabled: repsEnabled, + scoreEnabled: scoreEnabled, + targetTimeSeconds: targetTimeSeconds, + targetReps: targetReps, + targetScore: targetScore, + restSecondsOverride: restSecondsOverride, + rowid: rowid, + ), + withReferenceMapper: (p0) => p0 + .map( + (e) => ( + e.readTable(table), + $$ProgramExercisesTableReferences(db, table, e), + ), + ) + .toList(), + prefetchHooksCallback: + ({ + programId = false, + sourceExerciseId = false, + exerciseImageMediaIdSnapshot = false, + exerciseVideoMediaIdSnapshot = false, + }) { + return PrefetchHooks( + db: db, + explicitlyWatchedTables: [], + addJoins: + < + T extends TableManagerState< + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic + > + >(state) { + if (programId) { + state = + state.withJoin( + currentTable: table, + currentColumn: table.programId, + referencedTable: + $$ProgramExercisesTableReferences + ._programIdTable(db), + referencedColumn: + $$ProgramExercisesTableReferences + ._programIdTable(db) + .id, + ) + as T; + } + if (sourceExerciseId) { + state = + state.withJoin( + currentTable: table, + currentColumn: table.sourceExerciseId, + referencedTable: + $$ProgramExercisesTableReferences + ._sourceExerciseIdTable(db), + referencedColumn: + $$ProgramExercisesTableReferences + ._sourceExerciseIdTable(db) + .id, + ) + as T; + } + if (exerciseImageMediaIdSnapshot) { + state = + state.withJoin( + currentTable: table, + currentColumn: + table.exerciseImageMediaIdSnapshot, + referencedTable: + $$ProgramExercisesTableReferences + ._exerciseImageMediaIdSnapshotTable( + db, + ), + referencedColumn: + $$ProgramExercisesTableReferences + ._exerciseImageMediaIdSnapshotTable( + db, + ) + .id, + ) + as T; + } + if (exerciseVideoMediaIdSnapshot) { + state = + state.withJoin( + currentTable: table, + currentColumn: + table.exerciseVideoMediaIdSnapshot, + referencedTable: + $$ProgramExercisesTableReferences + ._exerciseVideoMediaIdSnapshotTable( + db, + ), + referencedColumn: + $$ProgramExercisesTableReferences + ._exerciseVideoMediaIdSnapshotTable( + db, + ) + .id, + ) + as T; + } + + return state; + }, + getPrefetchedDataCallback: (items) async { + return []; + }, + ); + }, + ), + ); +} + +typedef $$ProgramExercisesTableProcessedTableManager = + ProcessedTableManager< + _$AppDatabase, + $ProgramExercisesTable, + ProgramExercise, + $$ProgramExercisesTableFilterComposer, + $$ProgramExercisesTableOrderingComposer, + $$ProgramExercisesTableAnnotationComposer, + $$ProgramExercisesTableCreateCompanionBuilder, + $$ProgramExercisesTableUpdateCompanionBuilder, + (ProgramExercise, $$ProgramExercisesTableReferences), + ProgramExercise, + PrefetchHooks Function({ + bool programId, + bool sourceExerciseId, + bool exerciseImageMediaIdSnapshot, + bool exerciseVideoMediaIdSnapshot, + }) + >; +typedef $$WorkoutHistoriesTableCreateCompanionBuilder = + WorkoutHistoriesCompanion Function({ + required String id, + required DateTime createdAt, + required DateTime updatedAt, + Value deletedAt, + Value schemaVersion, + required String syncState, + required int localRevision, + required String originDeviceId, + Value futureOwnerProfileId, + Value lastSyncedAt, + Value remoteRevision, + Value sourceWorkoutTemplateId, + Value sourceActiveWorkoutSessionId, + required String nameSnapshot, + required DateTime startedAt, + required DateTime endedAt, + required int totalActiveMs, + required bool completed, + required String historySnapshotJson, + Value rowid, + }); +typedef $$WorkoutHistoriesTableUpdateCompanionBuilder = + WorkoutHistoriesCompanion Function({ + Value id, + Value createdAt, + Value updatedAt, + Value deletedAt, + Value schemaVersion, + Value syncState, + Value localRevision, + Value originDeviceId, + Value futureOwnerProfileId, + Value lastSyncedAt, + Value remoteRevision, + Value sourceWorkoutTemplateId, + Value sourceActiveWorkoutSessionId, + Value nameSnapshot, + Value startedAt, + Value endedAt, + Value totalActiveMs, + Value completed, + Value historySnapshotJson, + Value rowid, + }); + +final class $$WorkoutHistoriesTableReferences + extends + BaseReferences<_$AppDatabase, $WorkoutHistoriesTable, WorkoutHistory> { + $$WorkoutHistoriesTableReferences( + super.$_db, + super.$_table, + super.$_typedResult, + ); + + static $WorkoutTemplatesTable _sourceWorkoutTemplateIdTable( + _$AppDatabase db, + ) => db.workoutTemplates.createAlias( + 'workout_history__source_workout_template_id__workout_templates__id', + ); + + $$WorkoutTemplatesTableProcessedTableManager? get sourceWorkoutTemplateId { + final $_column = $_itemColumn('source_workout_template_id'); + if ($_column == null) return null; + final manager = $$WorkoutTemplatesTableTableManager( + $_db, + $_db.workoutTemplates, + ).filter((f) => f.id.sqlEquals($_column)); + final item = $_typedResult.readTableOrNull( + _sourceWorkoutTemplateIdTable($_db), + ); + if (item == null) return manager; + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: [item]), + ); + } + + static $ActiveWorkoutSessionsTable _sourceActiveWorkoutSessionIdTable( + _$AppDatabase db, + ) => db.activeWorkoutSessions.createAlias( + 'workout_history__source_active_workout_session_id__active_workout_sessions__id', + ); + + $$ActiveWorkoutSessionsTableProcessedTableManager? + get sourceActiveWorkoutSessionId { + final $_column = $_itemColumn('source_active_workout_session_id'); + if ($_column == null) return null; + final manager = $$ActiveWorkoutSessionsTableTableManager( + $_db, + $_db.activeWorkoutSessions, + ).filter((f) => f.id.sqlEquals($_column)); + final item = $_typedResult.readTableOrNull( + _sourceActiveWorkoutSessionIdTable($_db), + ); + if (item == null) return manager; + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: [item]), + ); + } + + static MultiTypedResultKey< + $WorkoutHistorySetResultsTable, + List + > + _workoutHistorySetResultsRefsTable( + _$AppDatabase db, + ) => MultiTypedResultKey.fromTable( + db.workoutHistorySetResults, + aliasName: + 'workout_history__id__workout_history_set_results__workout_history_id', + ); + + $$WorkoutHistorySetResultsTableProcessedTableManager + get workoutHistorySetResultsRefs { + final manager = + $$WorkoutHistorySetResultsTableTableManager( + $_db, + $_db.workoutHistorySetResults, + ).filter( + (f) => f.workoutHistoryId.id.sqlEquals($_itemColumn('id')!), + ); + + final cache = $_typedResult.readTableOrNull( + _workoutHistorySetResultsRefsTable($_db), + ); + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: cache), + ); + } +} + +class $$WorkoutHistoriesTableFilterComposer + extends Composer<_$AppDatabase, $WorkoutHistoriesTable> { + $$WorkoutHistoriesTableFilterComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnFilters get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get createdAt => $composableBuilder( + column: $table.createdAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get updatedAt => $composableBuilder( + column: $table.updatedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get deletedAt => $composableBuilder( + column: $table.deletedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get schemaVersion => $composableBuilder( + column: $table.schemaVersion, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get syncState => $composableBuilder( + column: $table.syncState, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get futureOwnerProfileId => $composableBuilder( + column: $table.futureOwnerProfileId, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get lastSyncedAt => $composableBuilder( + column: $table.lastSyncedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get remoteRevision => $composableBuilder( + column: $table.remoteRevision, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get nameSnapshot => $composableBuilder( + column: $table.nameSnapshot, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get startedAt => $composableBuilder( + column: $table.startedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get endedAt => $composableBuilder( + column: $table.endedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get totalActiveMs => $composableBuilder( + column: $table.totalActiveMs, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get completed => $composableBuilder( + column: $table.completed, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get historySnapshotJson => $composableBuilder( + column: $table.historySnapshotJson, + builder: (column) => ColumnFilters(column), + ); + + $$WorkoutTemplatesTableFilterComposer get sourceWorkoutTemplateId { + final $$WorkoutTemplatesTableFilterComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.sourceWorkoutTemplateId, + referencedTable: $db.workoutTemplates, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$WorkoutTemplatesTableFilterComposer( + $db: $db, + $table: $db.workoutTemplates, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } + + $$ActiveWorkoutSessionsTableFilterComposer get sourceActiveWorkoutSessionId { + final $$ActiveWorkoutSessionsTableFilterComposer composer = + $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.sourceActiveWorkoutSessionId, + referencedTable: $db.activeWorkoutSessions, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ActiveWorkoutSessionsTableFilterComposer( + $db: $db, + $table: $db.activeWorkoutSessions, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } + + Expression workoutHistorySetResultsRefs( + Expression Function($$WorkoutHistorySetResultsTableFilterComposer f) + f, + ) { + final $$WorkoutHistorySetResultsTableFilterComposer composer = + $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.workoutHistorySetResults, + getReferencedColumn: (t) => t.workoutHistoryId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$WorkoutHistorySetResultsTableFilterComposer( + $db: $db, + $table: $db.workoutHistorySetResults, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } +} + +class $$WorkoutHistoriesTableOrderingComposer + extends Composer<_$AppDatabase, $WorkoutHistoriesTable> { + $$WorkoutHistoriesTableOrderingComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnOrderings get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get createdAt => $composableBuilder( + column: $table.createdAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get updatedAt => $composableBuilder( + column: $table.updatedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get deletedAt => $composableBuilder( + column: $table.deletedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get schemaVersion => $composableBuilder( + column: $table.schemaVersion, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get syncState => $composableBuilder( + column: $table.syncState, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get futureOwnerProfileId => $composableBuilder( + column: $table.futureOwnerProfileId, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get lastSyncedAt => $composableBuilder( + column: $table.lastSyncedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get remoteRevision => $composableBuilder( + column: $table.remoteRevision, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get nameSnapshot => $composableBuilder( + column: $table.nameSnapshot, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get startedAt => $composableBuilder( + column: $table.startedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get endedAt => $composableBuilder( + column: $table.endedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get totalActiveMs => $composableBuilder( + column: $table.totalActiveMs, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get completed => $composableBuilder( + column: $table.completed, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get historySnapshotJson => $composableBuilder( + column: $table.historySnapshotJson, + builder: (column) => ColumnOrderings(column), + ); + + $$WorkoutTemplatesTableOrderingComposer get sourceWorkoutTemplateId { + final $$WorkoutTemplatesTableOrderingComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.sourceWorkoutTemplateId, + referencedTable: $db.workoutTemplates, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$WorkoutTemplatesTableOrderingComposer( + $db: $db, + $table: $db.workoutTemplates, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } + + $$ActiveWorkoutSessionsTableOrderingComposer + get sourceActiveWorkoutSessionId { + final $$ActiveWorkoutSessionsTableOrderingComposer composer = + $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.sourceActiveWorkoutSessionId, + referencedTable: $db.activeWorkoutSessions, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ActiveWorkoutSessionsTableOrderingComposer( + $db: $db, + $table: $db.activeWorkoutSessions, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } +} + +class $$WorkoutHistoriesTableAnnotationComposer + extends Composer<_$AppDatabase, $WorkoutHistoriesTable> { + $$WorkoutHistoriesTableAnnotationComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + GeneratedColumn get id => + $composableBuilder(column: $table.id, builder: (column) => column); + + GeneratedColumn get createdAt => + $composableBuilder(column: $table.createdAt, builder: (column) => column); + + GeneratedColumn get updatedAt => + $composableBuilder(column: $table.updatedAt, builder: (column) => column); + + GeneratedColumn get deletedAt => + $composableBuilder(column: $table.deletedAt, builder: (column) => column); + + GeneratedColumn get schemaVersion => $composableBuilder( + column: $table.schemaVersion, + builder: (column) => column, + ); + + GeneratedColumn get syncState => + $composableBuilder(column: $table.syncState, builder: (column) => column); + + GeneratedColumn get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => column, + ); + + GeneratedColumn get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => column, + ); + + GeneratedColumn get futureOwnerProfileId => $composableBuilder( + column: $table.futureOwnerProfileId, + builder: (column) => column, + ); + + GeneratedColumn get lastSyncedAt => $composableBuilder( + column: $table.lastSyncedAt, + builder: (column) => column, + ); + + GeneratedColumn get remoteRevision => $composableBuilder( + column: $table.remoteRevision, + builder: (column) => column, + ); + + GeneratedColumn get nameSnapshot => $composableBuilder( + column: $table.nameSnapshot, + builder: (column) => column, + ); + + GeneratedColumn get startedAt => + $composableBuilder(column: $table.startedAt, builder: (column) => column); + + GeneratedColumn get endedAt => + $composableBuilder(column: $table.endedAt, builder: (column) => column); + + GeneratedColumn get totalActiveMs => $composableBuilder( + column: $table.totalActiveMs, + builder: (column) => column, + ); + + GeneratedColumn get completed => + $composableBuilder(column: $table.completed, builder: (column) => column); + + GeneratedColumn get historySnapshotJson => $composableBuilder( + column: $table.historySnapshotJson, + builder: (column) => column, + ); + + $$WorkoutTemplatesTableAnnotationComposer get sourceWorkoutTemplateId { + final $$WorkoutTemplatesTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.sourceWorkoutTemplateId, + referencedTable: $db.workoutTemplates, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$WorkoutTemplatesTableAnnotationComposer( + $db: $db, + $table: $db.workoutTemplates, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } + + $$ActiveWorkoutSessionsTableAnnotationComposer + get sourceActiveWorkoutSessionId { + final $$ActiveWorkoutSessionsTableAnnotationComposer composer = + $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.sourceActiveWorkoutSessionId, + referencedTable: $db.activeWorkoutSessions, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ActiveWorkoutSessionsTableAnnotationComposer( + $db: $db, + $table: $db.activeWorkoutSessions, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } + + Expression workoutHistorySetResultsRefs( + Expression Function($$WorkoutHistorySetResultsTableAnnotationComposer a) + f, + ) { + final $$WorkoutHistorySetResultsTableAnnotationComposer composer = + $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.workoutHistorySetResults, + getReferencedColumn: (t) => t.workoutHistoryId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$WorkoutHistorySetResultsTableAnnotationComposer( + $db: $db, + $table: $db.workoutHistorySetResults, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } +} + +class $$WorkoutHistoriesTableTableManager + extends + RootTableManager< + _$AppDatabase, + $WorkoutHistoriesTable, + WorkoutHistory, + $$WorkoutHistoriesTableFilterComposer, + $$WorkoutHistoriesTableOrderingComposer, + $$WorkoutHistoriesTableAnnotationComposer, + $$WorkoutHistoriesTableCreateCompanionBuilder, + $$WorkoutHistoriesTableUpdateCompanionBuilder, + (WorkoutHistory, $$WorkoutHistoriesTableReferences), + WorkoutHistory, + PrefetchHooks Function({ + bool sourceWorkoutTemplateId, + bool sourceActiveWorkoutSessionId, + bool workoutHistorySetResultsRefs, + }) + > { + $$WorkoutHistoriesTableTableManager( + _$AppDatabase db, + $WorkoutHistoriesTable table, + ) : super( + TableManagerState( + db: db, + table: table, + createFilteringComposer: () => + $$WorkoutHistoriesTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => + $$WorkoutHistoriesTableOrderingComposer($db: db, $table: table), + createComputedFieldComposer: () => + $$WorkoutHistoriesTableAnnotationComposer($db: db, $table: table), + updateCompanionCallback: + ({ + Value id = const Value.absent(), + Value createdAt = const Value.absent(), + Value updatedAt = const Value.absent(), + Value deletedAt = const Value.absent(), + Value schemaVersion = const Value.absent(), + Value syncState = const Value.absent(), + Value localRevision = const Value.absent(), + Value originDeviceId = const Value.absent(), + Value futureOwnerProfileId = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + Value remoteRevision = const Value.absent(), + Value sourceWorkoutTemplateId = const Value.absent(), + Value sourceActiveWorkoutSessionId = + const Value.absent(), + Value nameSnapshot = const Value.absent(), + Value startedAt = const Value.absent(), + Value endedAt = const Value.absent(), + Value totalActiveMs = const Value.absent(), + Value completed = const Value.absent(), + Value historySnapshotJson = const Value.absent(), + Value rowid = const Value.absent(), + }) => WorkoutHistoriesCompanion( + id: id, + createdAt: createdAt, + updatedAt: updatedAt, + deletedAt: deletedAt, + schemaVersion: schemaVersion, + syncState: syncState, + localRevision: localRevision, + originDeviceId: originDeviceId, + futureOwnerProfileId: futureOwnerProfileId, + lastSyncedAt: lastSyncedAt, + remoteRevision: remoteRevision, + sourceWorkoutTemplateId: sourceWorkoutTemplateId, + sourceActiveWorkoutSessionId: sourceActiveWorkoutSessionId, + nameSnapshot: nameSnapshot, + startedAt: startedAt, + endedAt: endedAt, + totalActiveMs: totalActiveMs, + completed: completed, + historySnapshotJson: historySnapshotJson, + rowid: rowid, + ), + createCompanionCallback: + ({ + required String id, + required DateTime createdAt, + required DateTime updatedAt, + Value deletedAt = const Value.absent(), + Value schemaVersion = const Value.absent(), + required String syncState, + required int localRevision, + required String originDeviceId, + Value futureOwnerProfileId = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + Value remoteRevision = const Value.absent(), + Value sourceWorkoutTemplateId = const Value.absent(), + Value sourceActiveWorkoutSessionId = + const Value.absent(), + required String nameSnapshot, + required DateTime startedAt, + required DateTime endedAt, + required int totalActiveMs, + required bool completed, + required String historySnapshotJson, + Value rowid = const Value.absent(), + }) => WorkoutHistoriesCompanion.insert( + id: id, + createdAt: createdAt, + updatedAt: updatedAt, + deletedAt: deletedAt, + schemaVersion: schemaVersion, + syncState: syncState, + localRevision: localRevision, + originDeviceId: originDeviceId, + futureOwnerProfileId: futureOwnerProfileId, + lastSyncedAt: lastSyncedAt, + remoteRevision: remoteRevision, + sourceWorkoutTemplateId: sourceWorkoutTemplateId, + sourceActiveWorkoutSessionId: sourceActiveWorkoutSessionId, + nameSnapshot: nameSnapshot, + startedAt: startedAt, + endedAt: endedAt, + totalActiveMs: totalActiveMs, + completed: completed, + historySnapshotJson: historySnapshotJson, + rowid: rowid, + ), + withReferenceMapper: (p0) => p0 + .map( + (e) => ( + e.readTable(table), + $$WorkoutHistoriesTableReferences(db, table, e), + ), + ) + .toList(), + prefetchHooksCallback: + ({ + sourceWorkoutTemplateId = false, + sourceActiveWorkoutSessionId = false, + workoutHistorySetResultsRefs = false, + }) { + return PrefetchHooks( + db: db, + explicitlyWatchedTables: [ + if (workoutHistorySetResultsRefs) + db.workoutHistorySetResults, + ], + addJoins: + < + T extends TableManagerState< + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic + > + >(state) { + if (sourceWorkoutTemplateId) { + state = + state.withJoin( + currentTable: table, + currentColumn: + table.sourceWorkoutTemplateId, + referencedTable: + $$WorkoutHistoriesTableReferences + ._sourceWorkoutTemplateIdTable(db), + referencedColumn: + $$WorkoutHistoriesTableReferences + ._sourceWorkoutTemplateIdTable(db) + .id, + ) + as T; + } + if (sourceActiveWorkoutSessionId) { + state = + state.withJoin( + currentTable: table, + currentColumn: + table.sourceActiveWorkoutSessionId, + referencedTable: + $$WorkoutHistoriesTableReferences + ._sourceActiveWorkoutSessionIdTable( + db, + ), + referencedColumn: + $$WorkoutHistoriesTableReferences + ._sourceActiveWorkoutSessionIdTable( + db, + ) + .id, + ) + as T; + } + + return state; + }, + getPrefetchedDataCallback: (items) async { + return [ + if (workoutHistorySetResultsRefs) + await $_getPrefetchedData< + WorkoutHistory, + $WorkoutHistoriesTable, + WorkoutHistorySetResult + >( + currentTable: table, + referencedTable: $$WorkoutHistoriesTableReferences + ._workoutHistorySetResultsRefsTable(db), + managerFromTypedResult: (p0) => + $$WorkoutHistoriesTableReferences( + db, + table, + p0, + ).workoutHistorySetResultsRefs, + referencedItemsForCurrentItem: + (item, referencedItems) => referencedItems.where( + (e) => e.workoutHistoryId == item.id, + ), + typedResults: items, + ), + ]; + }, + ); + }, + ), + ); +} + +typedef $$WorkoutHistoriesTableProcessedTableManager = + ProcessedTableManager< + _$AppDatabase, + $WorkoutHistoriesTable, + WorkoutHistory, + $$WorkoutHistoriesTableFilterComposer, + $$WorkoutHistoriesTableOrderingComposer, + $$WorkoutHistoriesTableAnnotationComposer, + $$WorkoutHistoriesTableCreateCompanionBuilder, + $$WorkoutHistoriesTableUpdateCompanionBuilder, + (WorkoutHistory, $$WorkoutHistoriesTableReferences), + WorkoutHistory, + PrefetchHooks Function({ + bool sourceWorkoutTemplateId, + bool sourceActiveWorkoutSessionId, + bool workoutHistorySetResultsRefs, + }) + >; +typedef $$WorkoutHistorySetResultsTableCreateCompanionBuilder = + WorkoutHistorySetResultsCompanion Function({ + required String id, + required DateTime createdAt, + required DateTime updatedAt, + Value deletedAt, + Value schemaVersion, + required String syncState, + required int localRevision, + required String originDeviceId, + Value futureOwnerProfileId, + Value lastSyncedAt, + Value remoteRevision, + required String workoutHistoryId, + required String programSnapshotId, + required String exerciseSnapshotId, + required int programIndex, + required int exerciseIndex, + required int setIndex, + required String programNameSnapshot, + required String exerciseNameSnapshot, + required bool timeEnabledSnapshot, + required bool repsEnabledSnapshot, + required bool scoreEnabledSnapshot, + Value targetTimeSecondsSnapshot, + Value targetRepsSnapshot, + Value targetScoreSnapshot, + Value actualTimeMs, + Value actualReps, + Value actualScore, + Value scoreLabelSnapshot, + Value scoreUnitSnapshot, + Value startedAt, + Value completedAt, + Value rowid, + }); +typedef $$WorkoutHistorySetResultsTableUpdateCompanionBuilder = + WorkoutHistorySetResultsCompanion Function({ + Value id, + Value createdAt, + Value updatedAt, + Value deletedAt, + Value schemaVersion, + Value syncState, + Value localRevision, + Value originDeviceId, + Value futureOwnerProfileId, + Value lastSyncedAt, + Value remoteRevision, + Value workoutHistoryId, + Value programSnapshotId, + Value exerciseSnapshotId, + Value programIndex, + Value exerciseIndex, + Value setIndex, + Value programNameSnapshot, + Value exerciseNameSnapshot, + Value timeEnabledSnapshot, + Value repsEnabledSnapshot, + Value scoreEnabledSnapshot, + Value targetTimeSecondsSnapshot, + Value targetRepsSnapshot, + Value targetScoreSnapshot, + Value actualTimeMs, + Value actualReps, + Value actualScore, + Value scoreLabelSnapshot, + Value scoreUnitSnapshot, + Value startedAt, + Value completedAt, + Value rowid, + }); + +final class $$WorkoutHistorySetResultsTableReferences + extends + BaseReferences< + _$AppDatabase, + $WorkoutHistorySetResultsTable, + WorkoutHistorySetResult + > { + $$WorkoutHistorySetResultsTableReferences( + super.$_db, + super.$_table, + super.$_typedResult, + ); + + static $WorkoutHistoriesTable _workoutHistoryIdTable(_$AppDatabase db) => + db.workoutHistories.createAlias( + 'workout_history_set_results__workout_history_id__workout_history__id', + ); + + $$WorkoutHistoriesTableProcessedTableManager get workoutHistoryId { + final $_column = $_itemColumn('workout_history_id')!; + + final manager = $$WorkoutHistoriesTableTableManager( + $_db, + $_db.workoutHistories, + ).filter((f) => f.id.sqlEquals($_column)); + final item = $_typedResult.readTableOrNull(_workoutHistoryIdTable($_db)); + if (item == null) return manager; + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: [item]), + ); + } +} + +class $$WorkoutHistorySetResultsTableFilterComposer + extends Composer<_$AppDatabase, $WorkoutHistorySetResultsTable> { + $$WorkoutHistorySetResultsTableFilterComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnFilters get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get createdAt => $composableBuilder( + column: $table.createdAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get updatedAt => $composableBuilder( + column: $table.updatedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get deletedAt => $composableBuilder( + column: $table.deletedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get schemaVersion => $composableBuilder( + column: $table.schemaVersion, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get syncState => $composableBuilder( + column: $table.syncState, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get futureOwnerProfileId => $composableBuilder( + column: $table.futureOwnerProfileId, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get lastSyncedAt => $composableBuilder( + column: $table.lastSyncedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get remoteRevision => $composableBuilder( + column: $table.remoteRevision, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get programSnapshotId => $composableBuilder( + column: $table.programSnapshotId, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get exerciseSnapshotId => $composableBuilder( + column: $table.exerciseSnapshotId, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get programIndex => $composableBuilder( + column: $table.programIndex, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get exerciseIndex => $composableBuilder( + column: $table.exerciseIndex, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get setIndex => $composableBuilder( + column: $table.setIndex, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get programNameSnapshot => $composableBuilder( + column: $table.programNameSnapshot, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get exerciseNameSnapshot => $composableBuilder( + column: $table.exerciseNameSnapshot, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get timeEnabledSnapshot => $composableBuilder( + column: $table.timeEnabledSnapshot, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get repsEnabledSnapshot => $composableBuilder( + column: $table.repsEnabledSnapshot, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get scoreEnabledSnapshot => $composableBuilder( + column: $table.scoreEnabledSnapshot, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get targetTimeSecondsSnapshot => $composableBuilder( + column: $table.targetTimeSecondsSnapshot, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get targetRepsSnapshot => $composableBuilder( + column: $table.targetRepsSnapshot, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get targetScoreSnapshot => $composableBuilder( + column: $table.targetScoreSnapshot, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get actualTimeMs => $composableBuilder( + column: $table.actualTimeMs, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get actualReps => $composableBuilder( + column: $table.actualReps, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get actualScore => $composableBuilder( + column: $table.actualScore, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get scoreLabelSnapshot => $composableBuilder( + column: $table.scoreLabelSnapshot, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get scoreUnitSnapshot => $composableBuilder( + column: $table.scoreUnitSnapshot, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get startedAt => $composableBuilder( + column: $table.startedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get completedAt => $composableBuilder( + column: $table.completedAt, + builder: (column) => ColumnFilters(column), + ); + + $$WorkoutHistoriesTableFilterComposer get workoutHistoryId { + final $$WorkoutHistoriesTableFilterComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.workoutHistoryId, + referencedTable: $db.workoutHistories, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$WorkoutHistoriesTableFilterComposer( + $db: $db, + $table: $db.workoutHistories, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } +} + +class $$WorkoutHistorySetResultsTableOrderingComposer + extends Composer<_$AppDatabase, $WorkoutHistorySetResultsTable> { + $$WorkoutHistorySetResultsTableOrderingComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnOrderings get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get createdAt => $composableBuilder( + column: $table.createdAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get updatedAt => $composableBuilder( + column: $table.updatedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get deletedAt => $composableBuilder( + column: $table.deletedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get schemaVersion => $composableBuilder( + column: $table.schemaVersion, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get syncState => $composableBuilder( + column: $table.syncState, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get futureOwnerProfileId => $composableBuilder( + column: $table.futureOwnerProfileId, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get lastSyncedAt => $composableBuilder( + column: $table.lastSyncedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get remoteRevision => $composableBuilder( + column: $table.remoteRevision, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get programSnapshotId => $composableBuilder( + column: $table.programSnapshotId, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get exerciseSnapshotId => $composableBuilder( + column: $table.exerciseSnapshotId, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get programIndex => $composableBuilder( + column: $table.programIndex, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get exerciseIndex => $composableBuilder( + column: $table.exerciseIndex, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get setIndex => $composableBuilder( + column: $table.setIndex, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get programNameSnapshot => $composableBuilder( + column: $table.programNameSnapshot, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get exerciseNameSnapshot => $composableBuilder( + column: $table.exerciseNameSnapshot, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get timeEnabledSnapshot => $composableBuilder( + column: $table.timeEnabledSnapshot, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get repsEnabledSnapshot => $composableBuilder( + column: $table.repsEnabledSnapshot, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get scoreEnabledSnapshot => $composableBuilder( + column: $table.scoreEnabledSnapshot, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get targetTimeSecondsSnapshot => $composableBuilder( + column: $table.targetTimeSecondsSnapshot, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get targetRepsSnapshot => $composableBuilder( + column: $table.targetRepsSnapshot, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get targetScoreSnapshot => $composableBuilder( + column: $table.targetScoreSnapshot, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get actualTimeMs => $composableBuilder( + column: $table.actualTimeMs, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get actualReps => $composableBuilder( + column: $table.actualReps, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get actualScore => $composableBuilder( + column: $table.actualScore, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get scoreLabelSnapshot => $composableBuilder( + column: $table.scoreLabelSnapshot, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get scoreUnitSnapshot => $composableBuilder( + column: $table.scoreUnitSnapshot, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get startedAt => $composableBuilder( + column: $table.startedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get completedAt => $composableBuilder( + column: $table.completedAt, + builder: (column) => ColumnOrderings(column), + ); + + $$WorkoutHistoriesTableOrderingComposer get workoutHistoryId { + final $$WorkoutHistoriesTableOrderingComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.workoutHistoryId, + referencedTable: $db.workoutHistories, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$WorkoutHistoriesTableOrderingComposer( + $db: $db, + $table: $db.workoutHistories, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } +} + +class $$WorkoutHistorySetResultsTableAnnotationComposer + extends Composer<_$AppDatabase, $WorkoutHistorySetResultsTable> { + $$WorkoutHistorySetResultsTableAnnotationComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + GeneratedColumn get id => + $composableBuilder(column: $table.id, builder: (column) => column); + + GeneratedColumn get createdAt => + $composableBuilder(column: $table.createdAt, builder: (column) => column); + + GeneratedColumn get updatedAt => + $composableBuilder(column: $table.updatedAt, builder: (column) => column); + + GeneratedColumn get deletedAt => + $composableBuilder(column: $table.deletedAt, builder: (column) => column); + + GeneratedColumn get schemaVersion => $composableBuilder( + column: $table.schemaVersion, + builder: (column) => column, + ); + + GeneratedColumn get syncState => + $composableBuilder(column: $table.syncState, builder: (column) => column); + + GeneratedColumn get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => column, + ); + + GeneratedColumn get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => column, + ); + + GeneratedColumn get futureOwnerProfileId => $composableBuilder( + column: $table.futureOwnerProfileId, + builder: (column) => column, + ); + + GeneratedColumn get lastSyncedAt => $composableBuilder( + column: $table.lastSyncedAt, + builder: (column) => column, + ); + + GeneratedColumn get remoteRevision => $composableBuilder( + column: $table.remoteRevision, + builder: (column) => column, + ); + + GeneratedColumn get programSnapshotId => $composableBuilder( + column: $table.programSnapshotId, + builder: (column) => column, + ); + + GeneratedColumn get exerciseSnapshotId => $composableBuilder( + column: $table.exerciseSnapshotId, + builder: (column) => column, + ); + + GeneratedColumn get programIndex => $composableBuilder( + column: $table.programIndex, + builder: (column) => column, + ); + + GeneratedColumn get exerciseIndex => $composableBuilder( + column: $table.exerciseIndex, + builder: (column) => column, + ); + + GeneratedColumn get setIndex => + $composableBuilder(column: $table.setIndex, builder: (column) => column); + + GeneratedColumn get programNameSnapshot => $composableBuilder( + column: $table.programNameSnapshot, + builder: (column) => column, + ); + + GeneratedColumn get exerciseNameSnapshot => $composableBuilder( + column: $table.exerciseNameSnapshot, + builder: (column) => column, + ); + + GeneratedColumn get timeEnabledSnapshot => $composableBuilder( + column: $table.timeEnabledSnapshot, + builder: (column) => column, + ); + + GeneratedColumn get repsEnabledSnapshot => $composableBuilder( + column: $table.repsEnabledSnapshot, + builder: (column) => column, + ); + + GeneratedColumn get scoreEnabledSnapshot => $composableBuilder( + column: $table.scoreEnabledSnapshot, + builder: (column) => column, + ); + + GeneratedColumn get targetTimeSecondsSnapshot => $composableBuilder( + column: $table.targetTimeSecondsSnapshot, + builder: (column) => column, + ); + + GeneratedColumn get targetRepsSnapshot => $composableBuilder( + column: $table.targetRepsSnapshot, + builder: (column) => column, + ); + + GeneratedColumn get targetScoreSnapshot => $composableBuilder( + column: $table.targetScoreSnapshot, + builder: (column) => column, + ); + + GeneratedColumn get actualTimeMs => $composableBuilder( + column: $table.actualTimeMs, + builder: (column) => column, + ); + + GeneratedColumn get actualReps => $composableBuilder( + column: $table.actualReps, + builder: (column) => column, + ); + + GeneratedColumn get actualScore => $composableBuilder( + column: $table.actualScore, + builder: (column) => column, + ); + + GeneratedColumn get scoreLabelSnapshot => $composableBuilder( + column: $table.scoreLabelSnapshot, + builder: (column) => column, + ); + + GeneratedColumn get scoreUnitSnapshot => $composableBuilder( + column: $table.scoreUnitSnapshot, + builder: (column) => column, + ); + + GeneratedColumn get startedAt => + $composableBuilder(column: $table.startedAt, builder: (column) => column); + + GeneratedColumn get completedAt => $composableBuilder( + column: $table.completedAt, + builder: (column) => column, + ); + + $$WorkoutHistoriesTableAnnotationComposer get workoutHistoryId { + final $$WorkoutHistoriesTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.workoutHistoryId, + referencedTable: $db.workoutHistories, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$WorkoutHistoriesTableAnnotationComposer( + $db: $db, + $table: $db.workoutHistories, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } +} + +class $$WorkoutHistorySetResultsTableTableManager + extends + RootTableManager< + _$AppDatabase, + $WorkoutHistorySetResultsTable, + WorkoutHistorySetResult, + $$WorkoutHistorySetResultsTableFilterComposer, + $$WorkoutHistorySetResultsTableOrderingComposer, + $$WorkoutHistorySetResultsTableAnnotationComposer, + $$WorkoutHistorySetResultsTableCreateCompanionBuilder, + $$WorkoutHistorySetResultsTableUpdateCompanionBuilder, + (WorkoutHistorySetResult, $$WorkoutHistorySetResultsTableReferences), + WorkoutHistorySetResult, + PrefetchHooks Function({bool workoutHistoryId}) + > { + $$WorkoutHistorySetResultsTableTableManager( + _$AppDatabase db, + $WorkoutHistorySetResultsTable table, + ) : super( + TableManagerState( + db: db, + table: table, + createFilteringComposer: () => + $$WorkoutHistorySetResultsTableFilterComposer( + $db: db, + $table: table, + ), + createOrderingComposer: () => + $$WorkoutHistorySetResultsTableOrderingComposer( + $db: db, + $table: table, + ), + createComputedFieldComposer: () => + $$WorkoutHistorySetResultsTableAnnotationComposer( + $db: db, + $table: table, + ), + updateCompanionCallback: + ({ + Value id = const Value.absent(), + Value createdAt = const Value.absent(), + Value updatedAt = const Value.absent(), + Value deletedAt = const Value.absent(), + Value schemaVersion = const Value.absent(), + Value syncState = const Value.absent(), + Value localRevision = const Value.absent(), + Value originDeviceId = const Value.absent(), + Value futureOwnerProfileId = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + Value remoteRevision = const Value.absent(), + Value workoutHistoryId = const Value.absent(), + Value programSnapshotId = const Value.absent(), + Value exerciseSnapshotId = const Value.absent(), + Value programIndex = const Value.absent(), + Value exerciseIndex = const Value.absent(), + Value setIndex = const Value.absent(), + Value programNameSnapshot = const Value.absent(), + Value exerciseNameSnapshot = const Value.absent(), + Value timeEnabledSnapshot = const Value.absent(), + Value repsEnabledSnapshot = const Value.absent(), + Value scoreEnabledSnapshot = const Value.absent(), + Value targetTimeSecondsSnapshot = const Value.absent(), + Value targetRepsSnapshot = const Value.absent(), + Value targetScoreSnapshot = const Value.absent(), + Value actualTimeMs = const Value.absent(), + Value actualReps = const Value.absent(), + Value actualScore = const Value.absent(), + Value scoreLabelSnapshot = const Value.absent(), + Value scoreUnitSnapshot = const Value.absent(), + Value startedAt = const Value.absent(), + Value completedAt = const Value.absent(), + Value rowid = const Value.absent(), + }) => WorkoutHistorySetResultsCompanion( + id: id, + createdAt: createdAt, + updatedAt: updatedAt, + deletedAt: deletedAt, + schemaVersion: schemaVersion, + syncState: syncState, + localRevision: localRevision, + originDeviceId: originDeviceId, + futureOwnerProfileId: futureOwnerProfileId, + lastSyncedAt: lastSyncedAt, + remoteRevision: remoteRevision, + workoutHistoryId: workoutHistoryId, + programSnapshotId: programSnapshotId, + exerciseSnapshotId: exerciseSnapshotId, + programIndex: programIndex, + exerciseIndex: exerciseIndex, + setIndex: setIndex, + programNameSnapshot: programNameSnapshot, + exerciseNameSnapshot: exerciseNameSnapshot, + timeEnabledSnapshot: timeEnabledSnapshot, + repsEnabledSnapshot: repsEnabledSnapshot, + scoreEnabledSnapshot: scoreEnabledSnapshot, + targetTimeSecondsSnapshot: targetTimeSecondsSnapshot, + targetRepsSnapshot: targetRepsSnapshot, + targetScoreSnapshot: targetScoreSnapshot, + actualTimeMs: actualTimeMs, + actualReps: actualReps, + actualScore: actualScore, + scoreLabelSnapshot: scoreLabelSnapshot, + scoreUnitSnapshot: scoreUnitSnapshot, + startedAt: startedAt, + completedAt: completedAt, + rowid: rowid, + ), + createCompanionCallback: + ({ + required String id, + required DateTime createdAt, + required DateTime updatedAt, + Value deletedAt = const Value.absent(), + Value schemaVersion = const Value.absent(), + required String syncState, + required int localRevision, + required String originDeviceId, + Value futureOwnerProfileId = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + Value remoteRevision = const Value.absent(), + required String workoutHistoryId, + required String programSnapshotId, + required String exerciseSnapshotId, + required int programIndex, + required int exerciseIndex, + required int setIndex, + required String programNameSnapshot, + required String exerciseNameSnapshot, + required bool timeEnabledSnapshot, + required bool repsEnabledSnapshot, + required bool scoreEnabledSnapshot, + Value targetTimeSecondsSnapshot = const Value.absent(), + Value targetRepsSnapshot = const Value.absent(), + Value targetScoreSnapshot = const Value.absent(), + Value actualTimeMs = const Value.absent(), + Value actualReps = const Value.absent(), + Value actualScore = const Value.absent(), + Value scoreLabelSnapshot = const Value.absent(), + Value scoreUnitSnapshot = const Value.absent(), + Value startedAt = const Value.absent(), + Value completedAt = const Value.absent(), + Value rowid = const Value.absent(), + }) => WorkoutHistorySetResultsCompanion.insert( + id: id, + createdAt: createdAt, + updatedAt: updatedAt, + deletedAt: deletedAt, + schemaVersion: schemaVersion, + syncState: syncState, + localRevision: localRevision, + originDeviceId: originDeviceId, + futureOwnerProfileId: futureOwnerProfileId, + lastSyncedAt: lastSyncedAt, + remoteRevision: remoteRevision, + workoutHistoryId: workoutHistoryId, + programSnapshotId: programSnapshotId, + exerciseSnapshotId: exerciseSnapshotId, + programIndex: programIndex, + exerciseIndex: exerciseIndex, + setIndex: setIndex, + programNameSnapshot: programNameSnapshot, + exerciseNameSnapshot: exerciseNameSnapshot, + timeEnabledSnapshot: timeEnabledSnapshot, + repsEnabledSnapshot: repsEnabledSnapshot, + scoreEnabledSnapshot: scoreEnabledSnapshot, + targetTimeSecondsSnapshot: targetTimeSecondsSnapshot, + targetRepsSnapshot: targetRepsSnapshot, + targetScoreSnapshot: targetScoreSnapshot, + actualTimeMs: actualTimeMs, + actualReps: actualReps, + actualScore: actualScore, + scoreLabelSnapshot: scoreLabelSnapshot, + scoreUnitSnapshot: scoreUnitSnapshot, + startedAt: startedAt, + completedAt: completedAt, + rowid: rowid, + ), + withReferenceMapper: (p0) => p0 + .map( + (e) => ( + e.readTable(table), + $$WorkoutHistorySetResultsTableReferences(db, table, e), + ), + ) + .toList(), + prefetchHooksCallback: ({workoutHistoryId = false}) { + return PrefetchHooks( + db: db, + explicitlyWatchedTables: [], + addJoins: + < + T extends TableManagerState< + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic + > + >(state) { + if (workoutHistoryId) { + state = + state.withJoin( + currentTable: table, + currentColumn: table.workoutHistoryId, + referencedTable: + $$WorkoutHistorySetResultsTableReferences + ._workoutHistoryIdTable(db), + referencedColumn: + $$WorkoutHistorySetResultsTableReferences + ._workoutHistoryIdTable(db) + .id, + ) + as T; + } + + return state; + }, + getPrefetchedDataCallback: (items) async { + return []; + }, + ); + }, + ), + ); +} + +typedef $$WorkoutHistorySetResultsTableProcessedTableManager = + ProcessedTableManager< + _$AppDatabase, + $WorkoutHistorySetResultsTable, + WorkoutHistorySetResult, + $$WorkoutHistorySetResultsTableFilterComposer, + $$WorkoutHistorySetResultsTableOrderingComposer, + $$WorkoutHistorySetResultsTableAnnotationComposer, + $$WorkoutHistorySetResultsTableCreateCompanionBuilder, + $$WorkoutHistorySetResultsTableUpdateCompanionBuilder, + (WorkoutHistorySetResult, $$WorkoutHistorySetResultsTableReferences), + WorkoutHistorySetResult, + PrefetchHooks Function({bool workoutHistoryId}) + >; +typedef $$WorkoutTemplateProgramsTableCreateCompanionBuilder = + WorkoutTemplateProgramsCompanion Function({ + required String id, + required DateTime createdAt, + required DateTime updatedAt, + Value deletedAt, + Value schemaVersion, + required String syncState, + required int localRevision, + required String originDeviceId, + Value futureOwnerProfileId, + Value lastSyncedAt, + Value remoteRevision, + required String workoutTemplateId, + Value sourceProgramId, + required int position, + required String programNameSnapshot, + required int defaultRestSecondsSnapshot, + required String programSnapshotJson, + Value rowid, + }); +typedef $$WorkoutTemplateProgramsTableUpdateCompanionBuilder = + WorkoutTemplateProgramsCompanion Function({ + Value id, + Value createdAt, + Value updatedAt, + Value deletedAt, + Value schemaVersion, + Value syncState, + Value localRevision, + Value originDeviceId, + Value futureOwnerProfileId, + Value lastSyncedAt, + Value remoteRevision, + Value workoutTemplateId, + Value sourceProgramId, + Value position, + Value programNameSnapshot, + Value defaultRestSecondsSnapshot, + Value programSnapshotJson, + Value rowid, + }); + +final class $$WorkoutTemplateProgramsTableReferences + extends + BaseReferences< + _$AppDatabase, + $WorkoutTemplateProgramsTable, + WorkoutTemplateProgram + > { + $$WorkoutTemplateProgramsTableReferences( + super.$_db, + super.$_table, + super.$_typedResult, + ); + + static $WorkoutTemplatesTable _workoutTemplateIdTable(_$AppDatabase db) => + db.workoutTemplates.createAlias( + 'workout_template_programs__workout_template_id__workout_templates__id', + ); + + $$WorkoutTemplatesTableProcessedTableManager get workoutTemplateId { + final $_column = $_itemColumn('workout_template_id')!; + + final manager = $$WorkoutTemplatesTableTableManager( + $_db, + $_db.workoutTemplates, + ).filter((f) => f.id.sqlEquals($_column)); + final item = $_typedResult.readTableOrNull(_workoutTemplateIdTable($_db)); + if (item == null) return manager; + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: [item]), + ); + } + + static $ProgramsTable _sourceProgramIdTable(_$AppDatabase db) => + db.programs.createAlias( + 'workout_template_programs__source_program_id__programs__id', + ); + + $$ProgramsTableProcessedTableManager? get sourceProgramId { + final $_column = $_itemColumn('source_program_id'); + if ($_column == null) return null; + final manager = $$ProgramsTableTableManager( + $_db, + $_db.programs, + ).filter((f) => f.id.sqlEquals($_column)); + final item = $_typedResult.readTableOrNull(_sourceProgramIdTable($_db)); + if (item == null) return manager; + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: [item]), + ); + } + + static MultiTypedResultKey< + $WorkoutTemplateExerciseOverridesTable, + List + > + _workoutTemplateExerciseOverridesRefsTable( + _$AppDatabase db, + ) => MultiTypedResultKey.fromTable( + db.workoutTemplateExerciseOverrides, + aliasName: + 'workout_template_programs__id__workout_template_exercise_overrides__workout_template_program_id', + ); + + $$WorkoutTemplateExerciseOverridesTableProcessedTableManager + get workoutTemplateExerciseOverridesRefs { + final manager = + $$WorkoutTemplateExerciseOverridesTableTableManager( + $_db, + $_db.workoutTemplateExerciseOverrides, + ).filter( + (f) => f.workoutTemplateProgramId.id.sqlEquals( + $_itemColumn('id')!, + ), + ); + + final cache = $_typedResult.readTableOrNull( + _workoutTemplateExerciseOverridesRefsTable($_db), + ); + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: cache), + ); + } +} + +class $$WorkoutTemplateProgramsTableFilterComposer + extends Composer<_$AppDatabase, $WorkoutTemplateProgramsTable> { + $$WorkoutTemplateProgramsTableFilterComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnFilters get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get createdAt => $composableBuilder( + column: $table.createdAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get updatedAt => $composableBuilder( + column: $table.updatedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get deletedAt => $composableBuilder( + column: $table.deletedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get schemaVersion => $composableBuilder( + column: $table.schemaVersion, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get syncState => $composableBuilder( + column: $table.syncState, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get futureOwnerProfileId => $composableBuilder( + column: $table.futureOwnerProfileId, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get lastSyncedAt => $composableBuilder( + column: $table.lastSyncedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get remoteRevision => $composableBuilder( + column: $table.remoteRevision, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get position => $composableBuilder( + column: $table.position, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get programNameSnapshot => $composableBuilder( + column: $table.programNameSnapshot, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get defaultRestSecondsSnapshot => $composableBuilder( + column: $table.defaultRestSecondsSnapshot, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get programSnapshotJson => $composableBuilder( + column: $table.programSnapshotJson, + builder: (column) => ColumnFilters(column), + ); + + $$WorkoutTemplatesTableFilterComposer get workoutTemplateId { + final $$WorkoutTemplatesTableFilterComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.workoutTemplateId, + referencedTable: $db.workoutTemplates, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$WorkoutTemplatesTableFilterComposer( + $db: $db, + $table: $db.workoutTemplates, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } + + $$ProgramsTableFilterComposer get sourceProgramId { + final $$ProgramsTableFilterComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.sourceProgramId, + referencedTable: $db.programs, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ProgramsTableFilterComposer( + $db: $db, + $table: $db.programs, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } + + Expression workoutTemplateExerciseOverridesRefs( + Expression Function( + $$WorkoutTemplateExerciseOverridesTableFilterComposer f, + ) + f, + ) { + final $$WorkoutTemplateExerciseOverridesTableFilterComposer composer = + $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.workoutTemplateExerciseOverrides, + getReferencedColumn: (t) => t.workoutTemplateProgramId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$WorkoutTemplateExerciseOverridesTableFilterComposer( + $db: $db, + $table: $db.workoutTemplateExerciseOverrides, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } +} + +class $$WorkoutTemplateProgramsTableOrderingComposer + extends Composer<_$AppDatabase, $WorkoutTemplateProgramsTable> { + $$WorkoutTemplateProgramsTableOrderingComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnOrderings get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get createdAt => $composableBuilder( + column: $table.createdAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get updatedAt => $composableBuilder( + column: $table.updatedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get deletedAt => $composableBuilder( + column: $table.deletedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get schemaVersion => $composableBuilder( + column: $table.schemaVersion, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get syncState => $composableBuilder( + column: $table.syncState, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get futureOwnerProfileId => $composableBuilder( + column: $table.futureOwnerProfileId, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get lastSyncedAt => $composableBuilder( + column: $table.lastSyncedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get remoteRevision => $composableBuilder( + column: $table.remoteRevision, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get position => $composableBuilder( + column: $table.position, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get programNameSnapshot => $composableBuilder( + column: $table.programNameSnapshot, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get defaultRestSecondsSnapshot => $composableBuilder( + column: $table.defaultRestSecondsSnapshot, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get programSnapshotJson => $composableBuilder( + column: $table.programSnapshotJson, + builder: (column) => ColumnOrderings(column), + ); + + $$WorkoutTemplatesTableOrderingComposer get workoutTemplateId { + final $$WorkoutTemplatesTableOrderingComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.workoutTemplateId, + referencedTable: $db.workoutTemplates, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$WorkoutTemplatesTableOrderingComposer( + $db: $db, + $table: $db.workoutTemplates, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } + + $$ProgramsTableOrderingComposer get sourceProgramId { + final $$ProgramsTableOrderingComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.sourceProgramId, + referencedTable: $db.programs, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ProgramsTableOrderingComposer( + $db: $db, + $table: $db.programs, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } +} + +class $$WorkoutTemplateProgramsTableAnnotationComposer + extends Composer<_$AppDatabase, $WorkoutTemplateProgramsTable> { + $$WorkoutTemplateProgramsTableAnnotationComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + GeneratedColumn get id => + $composableBuilder(column: $table.id, builder: (column) => column); + + GeneratedColumn get createdAt => + $composableBuilder(column: $table.createdAt, builder: (column) => column); + + GeneratedColumn get updatedAt => + $composableBuilder(column: $table.updatedAt, builder: (column) => column); + + GeneratedColumn get deletedAt => + $composableBuilder(column: $table.deletedAt, builder: (column) => column); + + GeneratedColumn get schemaVersion => $composableBuilder( + column: $table.schemaVersion, + builder: (column) => column, + ); + + GeneratedColumn get syncState => + $composableBuilder(column: $table.syncState, builder: (column) => column); + + GeneratedColumn get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => column, + ); + + GeneratedColumn get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => column, + ); + + GeneratedColumn get futureOwnerProfileId => $composableBuilder( + column: $table.futureOwnerProfileId, + builder: (column) => column, + ); + + GeneratedColumn get lastSyncedAt => $composableBuilder( + column: $table.lastSyncedAt, + builder: (column) => column, + ); + + GeneratedColumn get remoteRevision => $composableBuilder( + column: $table.remoteRevision, + builder: (column) => column, + ); + + GeneratedColumn get position => + $composableBuilder(column: $table.position, builder: (column) => column); + + GeneratedColumn get programNameSnapshot => $composableBuilder( + column: $table.programNameSnapshot, + builder: (column) => column, + ); + + GeneratedColumn get defaultRestSecondsSnapshot => $composableBuilder( + column: $table.defaultRestSecondsSnapshot, + builder: (column) => column, + ); + + GeneratedColumn get programSnapshotJson => $composableBuilder( + column: $table.programSnapshotJson, + builder: (column) => column, + ); + + $$WorkoutTemplatesTableAnnotationComposer get workoutTemplateId { + final $$WorkoutTemplatesTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.workoutTemplateId, + referencedTable: $db.workoutTemplates, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$WorkoutTemplatesTableAnnotationComposer( + $db: $db, + $table: $db.workoutTemplates, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } + + $$ProgramsTableAnnotationComposer get sourceProgramId { + final $$ProgramsTableAnnotationComposer composer = $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.sourceProgramId, + referencedTable: $db.programs, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$ProgramsTableAnnotationComposer( + $db: $db, + $table: $db.programs, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } + + Expression workoutTemplateExerciseOverridesRefs( + Expression Function( + $$WorkoutTemplateExerciseOverridesTableAnnotationComposer a, + ) + f, + ) { + final $$WorkoutTemplateExerciseOverridesTableAnnotationComposer composer = + $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.id, + referencedTable: $db.workoutTemplateExerciseOverrides, + getReferencedColumn: (t) => t.workoutTemplateProgramId, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$WorkoutTemplateExerciseOverridesTableAnnotationComposer( + $db: $db, + $table: $db.workoutTemplateExerciseOverrides, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return f(composer); + } +} + +class $$WorkoutTemplateProgramsTableTableManager + extends + RootTableManager< + _$AppDatabase, + $WorkoutTemplateProgramsTable, + WorkoutTemplateProgram, + $$WorkoutTemplateProgramsTableFilterComposer, + $$WorkoutTemplateProgramsTableOrderingComposer, + $$WorkoutTemplateProgramsTableAnnotationComposer, + $$WorkoutTemplateProgramsTableCreateCompanionBuilder, + $$WorkoutTemplateProgramsTableUpdateCompanionBuilder, + (WorkoutTemplateProgram, $$WorkoutTemplateProgramsTableReferences), + WorkoutTemplateProgram, + PrefetchHooks Function({ + bool workoutTemplateId, + bool sourceProgramId, + bool workoutTemplateExerciseOverridesRefs, + }) + > { + $$WorkoutTemplateProgramsTableTableManager( + _$AppDatabase db, + $WorkoutTemplateProgramsTable table, + ) : super( + TableManagerState( + db: db, + table: table, + createFilteringComposer: () => + $$WorkoutTemplateProgramsTableFilterComposer( + $db: db, + $table: table, + ), + createOrderingComposer: () => + $$WorkoutTemplateProgramsTableOrderingComposer( + $db: db, + $table: table, + ), + createComputedFieldComposer: () => + $$WorkoutTemplateProgramsTableAnnotationComposer( + $db: db, + $table: table, + ), + updateCompanionCallback: + ({ + Value id = const Value.absent(), + Value createdAt = const Value.absent(), + Value updatedAt = const Value.absent(), + Value deletedAt = const Value.absent(), + Value schemaVersion = const Value.absent(), + Value syncState = const Value.absent(), + Value localRevision = const Value.absent(), + Value originDeviceId = const Value.absent(), + Value futureOwnerProfileId = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + Value remoteRevision = const Value.absent(), + Value workoutTemplateId = const Value.absent(), + Value sourceProgramId = const Value.absent(), + Value position = const Value.absent(), + Value programNameSnapshot = const Value.absent(), + Value defaultRestSecondsSnapshot = const Value.absent(), + Value programSnapshotJson = const Value.absent(), + Value rowid = const Value.absent(), + }) => WorkoutTemplateProgramsCompanion( + id: id, + createdAt: createdAt, + updatedAt: updatedAt, + deletedAt: deletedAt, + schemaVersion: schemaVersion, + syncState: syncState, + localRevision: localRevision, + originDeviceId: originDeviceId, + futureOwnerProfileId: futureOwnerProfileId, + lastSyncedAt: lastSyncedAt, + remoteRevision: remoteRevision, + workoutTemplateId: workoutTemplateId, + sourceProgramId: sourceProgramId, + position: position, + programNameSnapshot: programNameSnapshot, + defaultRestSecondsSnapshot: defaultRestSecondsSnapshot, + programSnapshotJson: programSnapshotJson, + rowid: rowid, + ), + createCompanionCallback: + ({ + required String id, + required DateTime createdAt, + required DateTime updatedAt, + Value deletedAt = const Value.absent(), + Value schemaVersion = const Value.absent(), + required String syncState, + required int localRevision, + required String originDeviceId, + Value futureOwnerProfileId = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + Value remoteRevision = const Value.absent(), + required String workoutTemplateId, + Value sourceProgramId = const Value.absent(), + required int position, + required String programNameSnapshot, + required int defaultRestSecondsSnapshot, + required String programSnapshotJson, + Value rowid = const Value.absent(), + }) => WorkoutTemplateProgramsCompanion.insert( + id: id, + createdAt: createdAt, + updatedAt: updatedAt, + deletedAt: deletedAt, + schemaVersion: schemaVersion, + syncState: syncState, + localRevision: localRevision, + originDeviceId: originDeviceId, + futureOwnerProfileId: futureOwnerProfileId, + lastSyncedAt: lastSyncedAt, + remoteRevision: remoteRevision, + workoutTemplateId: workoutTemplateId, + sourceProgramId: sourceProgramId, + position: position, + programNameSnapshot: programNameSnapshot, + defaultRestSecondsSnapshot: defaultRestSecondsSnapshot, + programSnapshotJson: programSnapshotJson, + rowid: rowid, + ), + withReferenceMapper: (p0) => p0 + .map( + (e) => ( + e.readTable(table), + $$WorkoutTemplateProgramsTableReferences(db, table, e), + ), + ) + .toList(), + prefetchHooksCallback: + ({ + workoutTemplateId = false, + sourceProgramId = false, + workoutTemplateExerciseOverridesRefs = false, + }) { + return PrefetchHooks( + db: db, + explicitlyWatchedTables: [ + if (workoutTemplateExerciseOverridesRefs) + db.workoutTemplateExerciseOverrides, + ], + addJoins: + < + T extends TableManagerState< + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic + > + >(state) { + if (workoutTemplateId) { + state = + state.withJoin( + currentTable: table, + currentColumn: table.workoutTemplateId, + referencedTable: + $$WorkoutTemplateProgramsTableReferences + ._workoutTemplateIdTable(db), + referencedColumn: + $$WorkoutTemplateProgramsTableReferences + ._workoutTemplateIdTable(db) + .id, + ) + as T; + } + if (sourceProgramId) { + state = + state.withJoin( + currentTable: table, + currentColumn: table.sourceProgramId, + referencedTable: + $$WorkoutTemplateProgramsTableReferences + ._sourceProgramIdTable(db), + referencedColumn: + $$WorkoutTemplateProgramsTableReferences + ._sourceProgramIdTable(db) + .id, + ) + as T; + } + + return state; + }, + getPrefetchedDataCallback: (items) async { + return [ + if (workoutTemplateExerciseOverridesRefs) + await $_getPrefetchedData< + WorkoutTemplateProgram, + $WorkoutTemplateProgramsTable, + WorkoutTemplateExerciseOverride + >( + currentTable: table, + referencedTable: + $$WorkoutTemplateProgramsTableReferences + ._workoutTemplateExerciseOverridesRefsTable( + db, + ), + managerFromTypedResult: (p0) => + $$WorkoutTemplateProgramsTableReferences( + db, + table, + p0, + ).workoutTemplateExerciseOverridesRefs, + referencedItemsForCurrentItem: + (item, referencedItems) => referencedItems.where( + (e) => e.workoutTemplateProgramId == item.id, + ), + typedResults: items, + ), + ]; + }, + ); + }, + ), + ); +} + +typedef $$WorkoutTemplateProgramsTableProcessedTableManager = + ProcessedTableManager< + _$AppDatabase, + $WorkoutTemplateProgramsTable, + WorkoutTemplateProgram, + $$WorkoutTemplateProgramsTableFilterComposer, + $$WorkoutTemplateProgramsTableOrderingComposer, + $$WorkoutTemplateProgramsTableAnnotationComposer, + $$WorkoutTemplateProgramsTableCreateCompanionBuilder, + $$WorkoutTemplateProgramsTableUpdateCompanionBuilder, + (WorkoutTemplateProgram, $$WorkoutTemplateProgramsTableReferences), + WorkoutTemplateProgram, + PrefetchHooks Function({ + bool workoutTemplateId, + bool sourceProgramId, + bool workoutTemplateExerciseOverridesRefs, + }) + >; +typedef $$WorkoutTemplateExerciseOverridesTableCreateCompanionBuilder = + WorkoutTemplateExerciseOverridesCompanion Function({ + required String id, + required DateTime createdAt, + required DateTime updatedAt, + Value deletedAt, + Value schemaVersion, + required String syncState, + required int localRevision, + required String originDeviceId, + Value futureOwnerProfileId, + Value lastSyncedAt, + Value remoteRevision, + required String workoutTemplateProgramId, + required String snapshotProgramExerciseId, + Value setsCountOverride, + Value targetTimeSecondsOverride, + Value targetRepsOverride, + Value targetScoreOverride, + Value rowid, + }); +typedef $$WorkoutTemplateExerciseOverridesTableUpdateCompanionBuilder = + WorkoutTemplateExerciseOverridesCompanion Function({ + Value id, + Value createdAt, + Value updatedAt, + Value deletedAt, + Value schemaVersion, + Value syncState, + Value localRevision, + Value originDeviceId, + Value futureOwnerProfileId, + Value lastSyncedAt, + Value remoteRevision, + Value workoutTemplateProgramId, + Value snapshotProgramExerciseId, + Value setsCountOverride, + Value targetTimeSecondsOverride, + Value targetRepsOverride, + Value targetScoreOverride, + Value rowid, + }); + +final class $$WorkoutTemplateExerciseOverridesTableReferences + extends + BaseReferences< + _$AppDatabase, + $WorkoutTemplateExerciseOverridesTable, + WorkoutTemplateExerciseOverride + > { + $$WorkoutTemplateExerciseOverridesTableReferences( + super.$_db, + super.$_table, + super.$_typedResult, + ); + + static $WorkoutTemplateProgramsTable _workoutTemplateProgramIdTable( + _$AppDatabase db, + ) => db.workoutTemplatePrograms.createAlias( + 'workout_template_exercise_overrides__workout_template_program_id__workout_template_programs__id', + ); + + $$WorkoutTemplateProgramsTableProcessedTableManager + get workoutTemplateProgramId { + final $_column = $_itemColumn('workout_template_program_id')!; + + final manager = $$WorkoutTemplateProgramsTableTableManager( + $_db, + $_db.workoutTemplatePrograms, + ).filter((f) => f.id.sqlEquals($_column)); + final item = $_typedResult.readTableOrNull( + _workoutTemplateProgramIdTable($_db), + ); + if (item == null) return manager; + return ProcessedTableManager( + manager.$state.copyWith(prefetchedData: [item]), + ); + } +} + +class $$WorkoutTemplateExerciseOverridesTableFilterComposer + extends Composer<_$AppDatabase, $WorkoutTemplateExerciseOverridesTable> { + $$WorkoutTemplateExerciseOverridesTableFilterComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnFilters get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get createdAt => $composableBuilder( + column: $table.createdAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get updatedAt => $composableBuilder( + column: $table.updatedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get deletedAt => $composableBuilder( + column: $table.deletedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get schemaVersion => $composableBuilder( + column: $table.schemaVersion, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get syncState => $composableBuilder( + column: $table.syncState, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get futureOwnerProfileId => $composableBuilder( + column: $table.futureOwnerProfileId, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get lastSyncedAt => $composableBuilder( + column: $table.lastSyncedAt, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get remoteRevision => $composableBuilder( + column: $table.remoteRevision, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get snapshotProgramExerciseId => $composableBuilder( + column: $table.snapshotProgramExerciseId, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get setsCountOverride => $composableBuilder( + column: $table.setsCountOverride, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get targetTimeSecondsOverride => $composableBuilder( + column: $table.targetTimeSecondsOverride, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get targetRepsOverride => $composableBuilder( + column: $table.targetRepsOverride, + builder: (column) => ColumnFilters(column), + ); + + ColumnFilters get targetScoreOverride => $composableBuilder( + column: $table.targetScoreOverride, + builder: (column) => ColumnFilters(column), + ); + + $$WorkoutTemplateProgramsTableFilterComposer get workoutTemplateProgramId { + final $$WorkoutTemplateProgramsTableFilterComposer composer = + $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.workoutTemplateProgramId, + referencedTable: $db.workoutTemplatePrograms, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$WorkoutTemplateProgramsTableFilterComposer( + $db: $db, + $table: $db.workoutTemplatePrograms, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } +} + +class $$WorkoutTemplateExerciseOverridesTableOrderingComposer + extends Composer<_$AppDatabase, $WorkoutTemplateExerciseOverridesTable> { + $$WorkoutTemplateExerciseOverridesTableOrderingComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnOrderings get id => $composableBuilder( + column: $table.id, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get createdAt => $composableBuilder( + column: $table.createdAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get updatedAt => $composableBuilder( + column: $table.updatedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get deletedAt => $composableBuilder( + column: $table.deletedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get schemaVersion => $composableBuilder( + column: $table.schemaVersion, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get syncState => $composableBuilder( + column: $table.syncState, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get futureOwnerProfileId => $composableBuilder( + column: $table.futureOwnerProfileId, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get lastSyncedAt => $composableBuilder( + column: $table.lastSyncedAt, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get remoteRevision => $composableBuilder( + column: $table.remoteRevision, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get snapshotProgramExerciseId => $composableBuilder( + column: $table.snapshotProgramExerciseId, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get setsCountOverride => $composableBuilder( + column: $table.setsCountOverride, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get targetTimeSecondsOverride => $composableBuilder( + column: $table.targetTimeSecondsOverride, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get targetRepsOverride => $composableBuilder( + column: $table.targetRepsOverride, + builder: (column) => ColumnOrderings(column), + ); + + ColumnOrderings get targetScoreOverride => $composableBuilder( + column: $table.targetScoreOverride, + builder: (column) => ColumnOrderings(column), + ); + + $$WorkoutTemplateProgramsTableOrderingComposer get workoutTemplateProgramId { + final $$WorkoutTemplateProgramsTableOrderingComposer composer = + $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.workoutTemplateProgramId, + referencedTable: $db.workoutTemplatePrograms, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$WorkoutTemplateProgramsTableOrderingComposer( + $db: $db, + $table: $db.workoutTemplatePrograms, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } +} + +class $$WorkoutTemplateExerciseOverridesTableAnnotationComposer + extends Composer<_$AppDatabase, $WorkoutTemplateExerciseOverridesTable> { + $$WorkoutTemplateExerciseOverridesTableAnnotationComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + GeneratedColumn get id => + $composableBuilder(column: $table.id, builder: (column) => column); + + GeneratedColumn get createdAt => + $composableBuilder(column: $table.createdAt, builder: (column) => column); + + GeneratedColumn get updatedAt => + $composableBuilder(column: $table.updatedAt, builder: (column) => column); + + GeneratedColumn get deletedAt => + $composableBuilder(column: $table.deletedAt, builder: (column) => column); + + GeneratedColumn get schemaVersion => $composableBuilder( + column: $table.schemaVersion, + builder: (column) => column, + ); + + GeneratedColumn get syncState => + $composableBuilder(column: $table.syncState, builder: (column) => column); + + GeneratedColumn get localRevision => $composableBuilder( + column: $table.localRevision, + builder: (column) => column, + ); + + GeneratedColumn get originDeviceId => $composableBuilder( + column: $table.originDeviceId, + builder: (column) => column, + ); + + GeneratedColumn get futureOwnerProfileId => $composableBuilder( + column: $table.futureOwnerProfileId, + builder: (column) => column, + ); + + GeneratedColumn get lastSyncedAt => $composableBuilder( + column: $table.lastSyncedAt, + builder: (column) => column, + ); + + GeneratedColumn get remoteRevision => $composableBuilder( + column: $table.remoteRevision, + builder: (column) => column, + ); + + GeneratedColumn get snapshotProgramExerciseId => $composableBuilder( + column: $table.snapshotProgramExerciseId, + builder: (column) => column, + ); + + GeneratedColumn get setsCountOverride => $composableBuilder( + column: $table.setsCountOverride, + builder: (column) => column, + ); + + GeneratedColumn get targetTimeSecondsOverride => $composableBuilder( + column: $table.targetTimeSecondsOverride, + builder: (column) => column, + ); + + GeneratedColumn get targetRepsOverride => $composableBuilder( + column: $table.targetRepsOverride, + builder: (column) => column, + ); + + GeneratedColumn get targetScoreOverride => $composableBuilder( + column: $table.targetScoreOverride, + builder: (column) => column, + ); + + $$WorkoutTemplateProgramsTableAnnotationComposer + get workoutTemplateProgramId { + final $$WorkoutTemplateProgramsTableAnnotationComposer composer = + $composerBuilder( + composer: this, + getCurrentColumn: (t) => t.workoutTemplateProgramId, + referencedTable: $db.workoutTemplatePrograms, + getReferencedColumn: (t) => t.id, + builder: + ( + joinBuilder, { + $addJoinBuilderToRootComposer, + $removeJoinBuilderFromRootComposer, + }) => $$WorkoutTemplateProgramsTableAnnotationComposer( + $db: $db, + $table: $db.workoutTemplatePrograms, + $addJoinBuilderToRootComposer: $addJoinBuilderToRootComposer, + joinBuilder: joinBuilder, + $removeJoinBuilderFromRootComposer: + $removeJoinBuilderFromRootComposer, + ), + ); + return composer; + } +} + +class $$WorkoutTemplateExerciseOverridesTableTableManager + extends + RootTableManager< + _$AppDatabase, + $WorkoutTemplateExerciseOverridesTable, + WorkoutTemplateExerciseOverride, + $$WorkoutTemplateExerciseOverridesTableFilterComposer, + $$WorkoutTemplateExerciseOverridesTableOrderingComposer, + $$WorkoutTemplateExerciseOverridesTableAnnotationComposer, + $$WorkoutTemplateExerciseOverridesTableCreateCompanionBuilder, + $$WorkoutTemplateExerciseOverridesTableUpdateCompanionBuilder, + ( + WorkoutTemplateExerciseOverride, + $$WorkoutTemplateExerciseOverridesTableReferences, + ), + WorkoutTemplateExerciseOverride, + PrefetchHooks Function({bool workoutTemplateProgramId}) + > { + $$WorkoutTemplateExerciseOverridesTableTableManager( + _$AppDatabase db, + $WorkoutTemplateExerciseOverridesTable table, + ) : super( + TableManagerState( + db: db, + table: table, + createFilteringComposer: () => + $$WorkoutTemplateExerciseOverridesTableFilterComposer( + $db: db, + $table: table, + ), + createOrderingComposer: () => + $$WorkoutTemplateExerciseOverridesTableOrderingComposer( + $db: db, + $table: table, + ), + createComputedFieldComposer: () => + $$WorkoutTemplateExerciseOverridesTableAnnotationComposer( + $db: db, + $table: table, + ), + updateCompanionCallback: + ({ + Value id = const Value.absent(), + Value createdAt = const Value.absent(), + Value updatedAt = const Value.absent(), + Value deletedAt = const Value.absent(), + Value schemaVersion = const Value.absent(), + Value syncState = const Value.absent(), + Value localRevision = const Value.absent(), + Value originDeviceId = const Value.absent(), + Value futureOwnerProfileId = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + Value remoteRevision = const Value.absent(), + Value workoutTemplateProgramId = const Value.absent(), + Value snapshotProgramExerciseId = const Value.absent(), + Value setsCountOverride = const Value.absent(), + Value targetTimeSecondsOverride = const Value.absent(), + Value targetRepsOverride = const Value.absent(), + Value targetScoreOverride = const Value.absent(), + Value rowid = const Value.absent(), + }) => WorkoutTemplateExerciseOverridesCompanion( + id: id, + createdAt: createdAt, + updatedAt: updatedAt, + deletedAt: deletedAt, + schemaVersion: schemaVersion, + syncState: syncState, + localRevision: localRevision, + originDeviceId: originDeviceId, + futureOwnerProfileId: futureOwnerProfileId, + lastSyncedAt: lastSyncedAt, + remoteRevision: remoteRevision, + workoutTemplateProgramId: workoutTemplateProgramId, + snapshotProgramExerciseId: snapshotProgramExerciseId, + setsCountOverride: setsCountOverride, + targetTimeSecondsOverride: targetTimeSecondsOverride, + targetRepsOverride: targetRepsOverride, + targetScoreOverride: targetScoreOverride, + rowid: rowid, + ), + createCompanionCallback: + ({ + required String id, + required DateTime createdAt, + required DateTime updatedAt, + Value deletedAt = const Value.absent(), + Value schemaVersion = const Value.absent(), + required String syncState, + required int localRevision, + required String originDeviceId, + Value futureOwnerProfileId = const Value.absent(), + Value lastSyncedAt = const Value.absent(), + Value remoteRevision = const Value.absent(), + required String workoutTemplateProgramId, + required String snapshotProgramExerciseId, + Value setsCountOverride = const Value.absent(), + Value targetTimeSecondsOverride = const Value.absent(), + Value targetRepsOverride = const Value.absent(), + Value targetScoreOverride = const Value.absent(), + Value rowid = const Value.absent(), + }) => WorkoutTemplateExerciseOverridesCompanion.insert( + id: id, + createdAt: createdAt, + updatedAt: updatedAt, + deletedAt: deletedAt, + schemaVersion: schemaVersion, + syncState: syncState, + localRevision: localRevision, + originDeviceId: originDeviceId, + futureOwnerProfileId: futureOwnerProfileId, + lastSyncedAt: lastSyncedAt, + remoteRevision: remoteRevision, + workoutTemplateProgramId: workoutTemplateProgramId, + snapshotProgramExerciseId: snapshotProgramExerciseId, + setsCountOverride: setsCountOverride, + targetTimeSecondsOverride: targetTimeSecondsOverride, + targetRepsOverride: targetRepsOverride, + targetScoreOverride: targetScoreOverride, + rowid: rowid, + ), + withReferenceMapper: (p0) => p0 + .map( + (e) => ( + e.readTable(table), + $$WorkoutTemplateExerciseOverridesTableReferences( + db, + table, + e, + ), + ), + ) + .toList(), + prefetchHooksCallback: ({workoutTemplateProgramId = false}) { + return PrefetchHooks( + db: db, + explicitlyWatchedTables: [], + addJoins: + < + T extends TableManagerState< + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic, + dynamic + > + >(state) { + if (workoutTemplateProgramId) { + state = + state.withJoin( + currentTable: table, + currentColumn: table.workoutTemplateProgramId, + referencedTable: + $$WorkoutTemplateExerciseOverridesTableReferences + ._workoutTemplateProgramIdTable(db), + referencedColumn: + $$WorkoutTemplateExerciseOverridesTableReferences + ._workoutTemplateProgramIdTable(db) + .id, + ) + as T; + } + + return state; + }, + getPrefetchedDataCallback: (items) async { + return []; + }, + ); + }, + ), + ); +} + +typedef $$WorkoutTemplateExerciseOverridesTableProcessedTableManager = + ProcessedTableManager< + _$AppDatabase, + $WorkoutTemplateExerciseOverridesTable, + WorkoutTemplateExerciseOverride, + $$WorkoutTemplateExerciseOverridesTableFilterComposer, + $$WorkoutTemplateExerciseOverridesTableOrderingComposer, + $$WorkoutTemplateExerciseOverridesTableAnnotationComposer, + $$WorkoutTemplateExerciseOverridesTableCreateCompanionBuilder, + $$WorkoutTemplateExerciseOverridesTableUpdateCompanionBuilder, + ( + WorkoutTemplateExerciseOverride, + $$WorkoutTemplateExerciseOverridesTableReferences, + ), + WorkoutTemplateExerciseOverride, + PrefetchHooks Function({bool workoutTemplateProgramId}) + >; + +class $AppDatabaseManager { + final _$AppDatabase _db; + $AppDatabaseManager(this._db); + $$WorkoutTemplatesTableTableManager get workoutTemplates => + $$WorkoutTemplatesTableTableManager(_db, _db.workoutTemplates); + $$ActiveWorkoutSessionsTableTableManager get activeWorkoutSessions => + $$ActiveWorkoutSessionsTableTableManager(_db, _db.activeWorkoutSessions); + $$ActiveRestStatesTableTableManager get activeRestStates => + $$ActiveRestStatesTableTableManager(_db, _db.activeRestStates); + $$ActiveSetResultsTableTableManager get activeSetResults => + $$ActiveSetResultsTableTableManager(_db, _db.activeSetResults); + $$ChangeLogEntriesTableTableManager get changeLogEntries => + $$ChangeLogEntriesTableTableManager(_db, _db.changeLogEntries); + $$MediaAssetsTableTableManager get mediaAssets => + $$MediaAssetsTableTableManager(_db, _db.mediaAssets); + $$ExercisesTableTableManager get exercises => + $$ExercisesTableTableManager(_db, _db.exercises); + $$ProgramsTableTableManager get programs => + $$ProgramsTableTableManager(_db, _db.programs); + $$ProgramExercisesTableTableManager get programExercises => + $$ProgramExercisesTableTableManager(_db, _db.programExercises); + $$WorkoutHistoriesTableTableManager get workoutHistories => + $$WorkoutHistoriesTableTableManager(_db, _db.workoutHistories); + $$WorkoutHistorySetResultsTableTableManager get workoutHistorySetResults => + $$WorkoutHistorySetResultsTableTableManager( + _db, + _db.workoutHistorySetResults, + ); + $$WorkoutTemplateProgramsTableTableManager get workoutTemplatePrograms => + $$WorkoutTemplateProgramsTableTableManager( + _db, + _db.workoutTemplatePrograms, + ); + $$WorkoutTemplateExerciseOverridesTableTableManager + get workoutTemplateExerciseOverrides => + $$WorkoutTemplateExerciseOverridesTableTableManager( + _db, + _db.workoutTemplateExerciseOverrides, + ); +} diff --git a/lib/infrastructure/local/drift_repositories.dart b/lib/infrastructure/local/drift_repositories.dart new file mode 100644 index 0000000..627dd6b --- /dev/null +++ b/lib/infrastructure/local/drift_repositories.dart @@ -0,0 +1,1145 @@ +import 'package:drift/drift.dart'; + +import '../../application/application.dart'; +import '../../domain/domain.dart' as domain; +import 'app_database.dart' as db; + +final class DriftExerciseRepository implements ExerciseRepository { + const DriftExerciseRepository(this.database); + + final db.AppDatabase database; + + @override + Future findById(String id) async { + final row = await (database.select( + database.exercises, + )..where((table) => table.id.equals(id))).getSingleOrNull(); + return row == null ? null : _exerciseFromRow(row); + } + + @override + Future> listActive() async { + final rows = + await (database.select(database.exercises) + ..where( + (table) => table.deletedAt.isNull() & table.archivedAt.isNull(), + ) + ..orderBy([(table) => OrderingTerm.asc(table.name)])) + .get(); + return rows.map(_exerciseFromRow).toList(); + } + + @override + Future isReferencedByProgram(String id) async { + final row = + await (database.select(database.programExercises) + ..where( + (table) => + table.deletedAt.isNull() & + table.sourceExerciseId.equals(id), + ) + ..limit(1)) + .getSingleOrNull(); + return row != null; + } + + @override + Future save(domain.Exercise exercise) async { + await database + .into(database.exercises) + .insertOnConflictUpdate(_exerciseCompanion(exercise)); + } +} + +final class DriftMediaAssetRepository implements MediaAssetRepository { + const DriftMediaAssetRepository(this.database); + + final db.AppDatabase database; + + @override + Future findById(String id) async { + final row = await (database.select( + database.mediaAssets, + )..where((table) => table.id.equals(id))).getSingleOrNull(); + return row == null ? null : _mediaAssetFromRow(row); + } + + @override + Future> listActive() async { + final rows = await (database.select( + database.mediaAssets, + )..where((table) => table.deletedAt.isNull())).get(); + return rows.map(_mediaAssetFromRow).toList(); + } + + @override + Future save(domain.MediaAsset mediaAsset) async { + await database + .into(database.mediaAssets) + .insertOnConflictUpdate(_mediaAssetCompanion(mediaAsset)); + } +} + +final class DriftProgramRepository implements ProgramRepository { + const DriftProgramRepository(this.database); + + final db.AppDatabase database; + + @override + Future findById(String id) async { + final query = database.select(database.programs) + ..where((table) => table.id.equals(id) & table.deletedAt.isNull()); + final row = await query.getSingleOrNull(); + if (row == null) { + return null; + } + final exercises = + await (database.select(database.programExercises) + ..where( + (table) => + table.programId.equals(id) & table.deletedAt.isNull(), + ) + ..orderBy([(table) => OrderingTerm.asc(table.position)])) + .get(); + return _programFromRow( + row, + exercises.map(_programExerciseFromRow).toList(), + ); + } + + @override + Future> listActive() async { + final rows = + await (database.select(database.programs) + ..where((table) => table.deletedAt.isNull()) + ..orderBy([(table) => OrderingTerm.asc(table.name)])) + .get(); + final programs = []; + for (final row in rows) { + final exercises = + await (database.select(database.programExercises) + ..where( + (table) => + table.programId.equals(row.id) & table.deletedAt.isNull(), + ) + ..orderBy([(table) => OrderingTerm.asc(table.position)])) + .get(); + programs.add( + _programFromRow(row, exercises.map(_programExerciseFromRow).toList()), + ); + } + return programs; + } + + @override + Future save(domain.Program program) async { + await database + .into(database.programs) + .insertOnConflictUpdate(_programCompanion(program)); + for (final exercise in program.exercises) { + await saveExercise(exercise); + } + } + + @override + Future saveExercise(domain.ProgramExercise exercise) async { + await database + .into(database.programExercises) + .insertOnConflictUpdate(_programExerciseCompanion(exercise)); + } + + @override + Future replaceExercises( + domain.Program program, + DateTime deletedAt, + ) async { + await database.transaction(() async { + await save(program); + final activeIds = program.exercises + .map((exercise) => exercise.metadata.id) + .toSet(); + final update = database.update(database.programExercises); + if (activeIds.isEmpty) { + update.where( + (table) => + table.programId.equals(program.metadata.id) & + table.deletedAt.isNull(), + ); + } else { + update.where( + (table) => + table.programId.equals(program.metadata.id) & + table.deletedAt.isNull() & + table.id.isNotIn(activeIds), + ); + } + await update.write( + db.ProgramExercisesCompanion( + deletedAt: Value(deletedAt), + updatedAt: Value(deletedAt), + ), + ); + }); + } +} + +final class DriftWorkoutTemplateRepository + implements WorkoutTemplateRepository { + const DriftWorkoutTemplateRepository(this.database); + + final db.AppDatabase database; + + @override + Future findById(String id) async { + final row = + await (database.select( + database.workoutTemplates, + )..where((table) => table.id.equals(id) & table.deletedAt.isNull())) + .getSingleOrNull(); + if (row == null) { + return null; + } + final programs = + await (database.select(database.workoutTemplatePrograms) + ..where( + (table) => + table.workoutTemplateId.equals(id) & + table.deletedAt.isNull(), + ) + ..orderBy([(table) => OrderingTerm.asc(table.position)])) + .get(); + final programIds = programs.map((program) => program.id).toSet(); + final overrides = programIds.isEmpty + ? [] + : await (database.select(database.workoutTemplateExerciseOverrides) + ..where( + (table) => + table.workoutTemplateProgramId.isIn(programIds) & + table.deletedAt.isNull(), + )) + .get(); + return _workoutTemplateFromRow( + row, + programs.map(_workoutTemplateProgramFromRow).toList(), + overrides.map(_workoutTemplateExerciseOverrideFromRow).toList(), + ); + } + + @override + Future> listActive() async { + final rows = + await (database.select(database.workoutTemplates) + ..where((table) => table.deletedAt.isNull()) + ..orderBy([(table) => OrderingTerm.asc(table.name)])) + .get(); + final templates = []; + for (final row in rows) { + final template = await findById(row.id); + if (template != null) { + templates.add(template); + } + } + return templates; + } + + @override + Future save(domain.WorkoutTemplate template) async { + await database + .into(database.workoutTemplates) + .insertOnConflictUpdate(_workoutTemplateCompanion(template)); + for (final program in template.programs) { + await saveProgram(program); + } + for (final override in template.overrides) { + await saveOverride(override); + } + } + + @override + Future saveProgram(domain.WorkoutTemplateProgram program) async { + await database + .into(database.workoutTemplatePrograms) + .insertOnConflictUpdate(_workoutTemplateProgramCompanion(program)); + } + + @override + Future saveOverride( + domain.WorkoutTemplateExerciseOverride override, + ) async { + await database + .into(database.workoutTemplateExerciseOverrides) + .insertOnConflictUpdate( + _workoutTemplateExerciseOverrideCompanion(override), + ); + } + + @override + Future replaceComposition( + domain.WorkoutTemplate template, + DateTime deletedAt, + ) async { + await database.transaction(() async { + final previousPrograms = + await (database.select(database.workoutTemplatePrograms)..where( + (table) => + table.workoutTemplateId.equals(template.metadata.id) & + table.deletedAt.isNull(), + )) + .get(); + final previousProgramIds = previousPrograms + .map((program) => program.id) + .toSet(); + await save(template); + final activeProgramIds = template.programs + .map((program) => program.metadata.id) + .toSet(); + final programUpdate = database.update(database.workoutTemplatePrograms); + if (activeProgramIds.isEmpty) { + programUpdate.where( + (table) => + table.workoutTemplateId.equals(template.metadata.id) & + table.deletedAt.isNull(), + ); + } else { + programUpdate.where( + (table) => + table.workoutTemplateId.equals(template.metadata.id) & + table.deletedAt.isNull() & + table.id.isNotIn(activeProgramIds), + ); + } + await programUpdate.write( + db.WorkoutTemplateProgramsCompanion( + deletedAt: Value(deletedAt), + updatedAt: Value(deletedAt), + ), + ); + + final activeOverrideIds = template.overrides + .map((override) => override.metadata.id) + .toSet(); + final relevantProgramIds = {...previousProgramIds, ...activeProgramIds}; + if (relevantProgramIds.isEmpty) { + return; + } + final overrideUpdate = database.update( + database.workoutTemplateExerciseOverrides, + ); + if (activeOverrideIds.isEmpty) { + overrideUpdate.where( + (table) => + table.workoutTemplateProgramId.isIn(relevantProgramIds) & + table.deletedAt.isNull(), + ); + } else { + overrideUpdate.where( + (table) => + table.workoutTemplateProgramId.isIn(relevantProgramIds) & + table.deletedAt.isNull() & + table.id.isNotIn(activeOverrideIds), + ); + } + await overrideUpdate.write( + db.WorkoutTemplateExerciseOverridesCompanion( + deletedAt: Value(deletedAt), + updatedAt: Value(deletedAt), + ), + ); + }); + } +} + +final class DriftActiveSessionRepository implements ActiveSessionRepository { + const DriftActiveSessionRepository(this.database); + + final db.AppDatabase database; + + @override + Future findById(String id) async { + final row = await (database.select( + database.activeWorkoutSessions, + )..where((table) => table.id.equals(id))).getSingleOrNull(); + return row == null ? null : _activeWorkoutSessionFromRow(row); + } + + @override + Future findOpen() async { + final row = + await (database.select(database.activeWorkoutSessions) + ..where( + (table) => + table.deletedAt.isNull() & + table.status.isIn(['running', 'paused', 'savedExit']), + ) + ..orderBy([(table) => OrderingTerm.desc(table.updatedAt)]) + ..limit(1)) + .getSingleOrNull(); + return row == null ? null : _activeWorkoutSessionFromRow(row); + } + + @override + Future save(domain.ActiveWorkoutSession session) async { + await database + .into(database.activeWorkoutSessions) + .insertOnConflictUpdate(_activeWorkoutSessionCompanion(session)); + } + + @override + Future saveSetResult(domain.ActiveSetResult result) async { + await database + .into(database.activeSetResults) + .insertOnConflictUpdate(_activeSetResultCompanion(result)); + } + + @override + Future saveRestState(domain.ActiveRestState restState) async { + await database + .into(database.activeRestStates) + .insertOnConflictUpdate(_activeRestStateCompanion(restState)); + } + + @override + Future> listSetResults(String sessionId) async { + final rows = + await (database.select(database.activeSetResults) + ..where((table) => table.activeWorkoutSessionId.equals(sessionId)) + ..orderBy([ + (table) => OrderingTerm.asc(table.programIndex), + (table) => OrderingTerm.asc(table.exerciseIndex), + (table) => OrderingTerm.asc(table.setIndex), + ])) + .get(); + return rows.map(_activeSetResultFromRow).toList(); + } + + @override + Future> listRestStates(String sessionId) async { + final rows = + await (database.select(database.activeRestStates) + ..where((table) => table.activeWorkoutSessionId.equals(sessionId)) + ..orderBy([(table) => OrderingTerm.asc(table.startedAt)])) + .get(); + return rows.map(_activeRestStateFromRow).toList(); + } +} + +final class DriftWorkoutHistoryRepository implements WorkoutHistoryRepository { + const DriftWorkoutHistoryRepository(this.database); + + final db.AppDatabase database; + + @override + Future findById(String id) async { + final row = + await (database.select( + database.workoutHistories, + )..where((table) => table.id.equals(id) & table.deletedAt.isNull())) + .getSingleOrNull(); + if (row == null) { + return null; + } + final results = + await (database.select(database.workoutHistorySetResults) + ..where( + (table) => + table.workoutHistoryId.equals(id) & + table.deletedAt.isNull(), + ) + ..orderBy([ + (table) => OrderingTerm.asc(table.programIndex), + (table) => OrderingTerm.asc(table.exerciseIndex), + (table) => OrderingTerm.asc(table.setIndex), + ])) + .get(); + return _workoutHistoryFromRow( + row, + results.map(_workoutHistorySetResultFromRow).toList(), + ); + } + + @override + Future> listActive() async { + final rows = + await (database.select(database.workoutHistories) + ..where((table) => table.deletedAt.isNull()) + ..orderBy([(table) => OrderingTerm.desc(table.startedAt)])) + .get(); + final histories = []; + for (final row in rows) { + final history = await findById(row.id); + if (history != null) { + histories.add(history); + } + } + return histories; + } + + @override + Future save(domain.WorkoutHistory history) async { + await database + .into(database.workoutHistories) + .insertOnConflictUpdate(_workoutHistoryCompanion(history)); + for (final result in history.results) { + await saveSetResult(result); + } + } + + @override + Future saveSetResult(domain.WorkoutHistorySetResult result) async { + await database + .into(database.workoutHistorySetResults) + .insertOnConflictUpdate(_workoutHistorySetResultCompanion(result)); + } + + @override + Future delete(String id, DateTime deletedAt) async { + await database.transaction(() async { + await (database.update( + database.workoutHistories, + )..where((table) => table.id.equals(id))).write( + db.WorkoutHistoriesCompanion( + deletedAt: Value(deletedAt), + updatedAt: Value(deletedAt), + ), + ); + await (database.update( + database.workoutHistorySetResults, + )..where((table) => table.workoutHistoryId.equals(id))).write( + db.WorkoutHistorySetResultsCompanion( + deletedAt: Value(deletedAt), + updatedAt: Value(deletedAt), + ), + ); + }); + } +} + +domain.EntityMetadata _metadataFromRow(dynamic row) { + return domain.EntityMetadata( + id: row.id as String, + createdAt: row.createdAt as DateTime, + updatedAt: row.updatedAt as DateTime, + deletedAt: row.deletedAt as DateTime?, + schemaVersion: row.schemaVersion as int, + syncState: _syncStateFromDb(row.syncState as String), + localRevision: row.localRevision as int, + originDeviceId: row.originDeviceId as String, + futureOwnerProfileId: row.futureOwnerProfileId as String?, + lastSyncedAt: row.lastSyncedAt as DateTime?, + remoteRevision: row.remoteRevision as String?, + ); +} + +List _metadataValues(domain.EntityMetadata metadata) => [ + Value(metadata.id), + Value(metadata.createdAt), + Value(metadata.updatedAt), + Value(metadata.deletedAt), + Value(metadata.schemaVersion), + Value(_syncStateToDb(metadata.syncState)), + Value(metadata.localRevision), + Value(metadata.originDeviceId), + Value(metadata.futureOwnerProfileId), + Value(metadata.lastSyncedAt), + Value(metadata.remoteRevision), +]; + +db.ExercisesCompanion _exerciseCompanion(domain.Exercise exercise) { + final values = _metadataValues(exercise.metadata); + return db.ExercisesCompanion( + id: values[0] as Value, + createdAt: values[1] as Value, + updatedAt: values[2] as Value, + deletedAt: values[3] as Value, + schemaVersion: values[4] as Value, + syncState: values[5] as Value, + localRevision: values[6] as Value, + originDeviceId: values[7] as Value, + futureOwnerProfileId: values[8] as Value, + lastSyncedAt: values[9] as Value, + remoteRevision: values[10] as Value, + name: Value(exercise.name), + description: Value(exercise.description), + imageMediaId: Value(exercise.imageMediaId), + videoMediaId: Value(exercise.videoMediaId), + hasTimeMeasure: Value(exercise.hasTimeMeasure), + hasRepsMeasure: Value(exercise.hasRepsMeasure), + hasScoreMeasure: Value(exercise.hasScoreMeasure), + scoreLabel: Value(exercise.scoreLabel), + scoreUnit: Value(exercise.scoreUnit), + archivedAt: Value(exercise.archivedAt), + ); +} + +domain.Exercise _exerciseFromRow(db.Exercise row) { + return domain.Exercise( + metadata: _metadataFromRow(row), + name: row.name, + description: row.description, + imageMediaId: row.imageMediaId, + videoMediaId: row.videoMediaId, + hasTimeMeasure: row.hasTimeMeasure, + hasRepsMeasure: row.hasRepsMeasure, + hasScoreMeasure: row.hasScoreMeasure, + scoreLabel: row.scoreLabel, + scoreUnit: row.scoreUnit, + archivedAt: row.archivedAt, + ); +} + +db.MediaAssetsCompanion _mediaAssetCompanion(domain.MediaAsset asset) { + final values = _metadataValues(asset.metadata); + return db.MediaAssetsCompanion( + id: values[0] as Value, + createdAt: values[1] as Value, + updatedAt: values[2] as Value, + deletedAt: values[3] as Value, + schemaVersion: values[4] as Value, + syncState: values[5] as Value, + localRevision: values[6] as Value, + originDeviceId: values[7] as Value, + futureOwnerProfileId: values[8] as Value, + lastSyncedAt: values[9] as Value, + remoteRevision: values[10] as Value, + kind: Value(_mediaKindToDb(asset.kind)), + localUri: Value(asset.localUri), + mimeType: Value(asset.mimeType), + sizeBytes: Value(asset.sizeBytes), + width: Value(asset.width), + height: Value(asset.height), + durationMs: Value(asset.durationMs), + checksum: Value(asset.checksum), + remoteUri: Value(asset.remoteUri), + thumbnailLocalUri: Value(asset.thumbnailLocalUri), + ); +} + +domain.MediaAsset _mediaAssetFromRow(db.MediaAsset row) { + return domain.MediaAsset( + metadata: _metadataFromRow(row), + kind: _mediaKindFromDb(row.kind), + localUri: row.localUri, + mimeType: row.mimeType, + sizeBytes: row.sizeBytes, + width: row.width, + height: row.height, + durationMs: row.durationMs, + checksum: row.checksum, + remoteUri: row.remoteUri, + thumbnailLocalUri: row.thumbnailLocalUri, + ); +} + +db.ProgramsCompanion _programCompanion(domain.Program program) { + final values = _metadataValues(program.metadata); + return db.ProgramsCompanion( + id: values[0] as Value, + createdAt: values[1] as Value, + updatedAt: values[2] as Value, + deletedAt: values[3] as Value, + schemaVersion: values[4] as Value, + syncState: values[5] as Value, + localRevision: values[6] as Value, + originDeviceId: values[7] as Value, + futureOwnerProfileId: values[8] as Value, + lastSyncedAt: values[9] as Value, + remoteRevision: values[10] as Value, + name: Value(program.name), + defaultRestSeconds: Value(program.defaultRestSeconds), + ); +} + +domain.Program _programFromRow( + db.Program row, + List exercises, +) { + return domain.Program( + metadata: _metadataFromRow(row), + name: row.name, + defaultRestSeconds: row.defaultRestSeconds, + exercises: exercises, + ); +} + +db.ProgramExercisesCompanion _programExerciseCompanion( + domain.ProgramExercise exercise, +) { + final values = _metadataValues(exercise.metadata); + return db.ProgramExercisesCompanion( + id: values[0] as Value, + createdAt: values[1] as Value, + updatedAt: values[2] as Value, + deletedAt: values[3] as Value, + schemaVersion: values[4] as Value, + syncState: values[5] as Value, + localRevision: values[6] as Value, + originDeviceId: values[7] as Value, + futureOwnerProfileId: values[8] as Value, + lastSyncedAt: values[9] as Value, + remoteRevision: values[10] as Value, + programId: Value(exercise.programId), + sourceExerciseId: Value(exercise.sourceExerciseId), + position: Value(exercise.position), + exerciseNameSnapshot: Value(exercise.exerciseNameSnapshot), + exerciseDescriptionSnapshot: Value(exercise.exerciseDescriptionSnapshot), + exerciseImageMediaIdSnapshot: Value(exercise.exerciseImageMediaIdSnapshot), + exerciseVideoMediaIdSnapshot: Value(exercise.exerciseVideoMediaIdSnapshot), + exerciseArchivedSnapshot: Value(exercise.exerciseArchivedSnapshot), + availableTimeSnapshot: Value(exercise.availableTimeSnapshot), + availableRepsSnapshot: Value(exercise.availableRepsSnapshot), + availableScoreSnapshot: Value(exercise.availableScoreSnapshot), + scoreLabelSnapshot: Value(exercise.scoreLabelSnapshot), + scoreUnitSnapshot: Value(exercise.scoreUnitSnapshot), + setsCount: Value(exercise.setsCount), + timeEnabled: Value(exercise.timeEnabled), + repsEnabled: Value(exercise.repsEnabled), + scoreEnabled: Value(exercise.scoreEnabled), + targetTimeSeconds: Value(exercise.targetTimeSeconds), + targetReps: Value(exercise.targetReps), + targetScore: Value(exercise.targetScore), + restSecondsOverride: Value(exercise.restSecondsOverride), + ); +} + +domain.ProgramExercise _programExerciseFromRow(db.ProgramExercise row) { + return domain.ProgramExercise( + metadata: _metadataFromRow(row), + programId: row.programId, + sourceExerciseId: row.sourceExerciseId, + position: row.position, + exerciseNameSnapshot: row.exerciseNameSnapshot, + exerciseDescriptionSnapshot: row.exerciseDescriptionSnapshot, + exerciseImageMediaIdSnapshot: row.exerciseImageMediaIdSnapshot, + exerciseVideoMediaIdSnapshot: row.exerciseVideoMediaIdSnapshot, + exerciseArchivedSnapshot: row.exerciseArchivedSnapshot, + availableTimeSnapshot: row.availableTimeSnapshot, + availableRepsSnapshot: row.availableRepsSnapshot, + availableScoreSnapshot: row.availableScoreSnapshot, + scoreLabelSnapshot: row.scoreLabelSnapshot, + scoreUnitSnapshot: row.scoreUnitSnapshot, + setsCount: row.setsCount, + timeEnabled: row.timeEnabled, + repsEnabled: row.repsEnabled, + scoreEnabled: row.scoreEnabled, + targetTimeSeconds: row.targetTimeSeconds, + targetReps: row.targetReps, + targetScore: row.targetScore, + restSecondsOverride: row.restSecondsOverride, + ); +} + +db.WorkoutTemplatesCompanion _workoutTemplateCompanion( + domain.WorkoutTemplate template, +) { + final values = _metadataValues(template.metadata); + return db.WorkoutTemplatesCompanion( + id: values[0] as Value, + createdAt: values[1] as Value, + updatedAt: values[2] as Value, + deletedAt: values[3] as Value, + schemaVersion: values[4] as Value, + syncState: values[5] as Value, + localRevision: values[6] as Value, + originDeviceId: values[7] as Value, + futureOwnerProfileId: values[8] as Value, + lastSyncedAt: values[9] as Value, + remoteRevision: values[10] as Value, + name: Value(template.name), + lastStartedAt: Value(template.lastStartedAt), + ); +} + +domain.WorkoutTemplate _workoutTemplateFromRow( + db.WorkoutTemplate row, + List programs, + List overrides, +) { + return domain.WorkoutTemplate( + metadata: _metadataFromRow(row), + name: row.name, + lastStartedAt: row.lastStartedAt, + programs: programs, + overrides: overrides, + ); +} + +db.WorkoutTemplateProgramsCompanion _workoutTemplateProgramCompanion( + domain.WorkoutTemplateProgram program, +) { + final values = _metadataValues(program.metadata); + return db.WorkoutTemplateProgramsCompanion( + id: values[0] as Value, + createdAt: values[1] as Value, + updatedAt: values[2] as Value, + deletedAt: values[3] as Value, + schemaVersion: values[4] as Value, + syncState: values[5] as Value, + localRevision: values[6] as Value, + originDeviceId: values[7] as Value, + futureOwnerProfileId: values[8] as Value, + lastSyncedAt: values[9] as Value, + remoteRevision: values[10] as Value, + workoutTemplateId: Value(program.workoutTemplateId), + sourceProgramId: Value(program.sourceProgramId), + position: Value(program.position), + programNameSnapshot: Value(program.programNameSnapshot), + defaultRestSecondsSnapshot: Value(program.defaultRestSecondsSnapshot), + programSnapshotJson: Value(program.programSnapshotJson), + ); +} + +domain.WorkoutTemplateProgram _workoutTemplateProgramFromRow( + db.WorkoutTemplateProgram row, +) { + return domain.WorkoutTemplateProgram( + metadata: _metadataFromRow(row), + workoutTemplateId: row.workoutTemplateId, + sourceProgramId: row.sourceProgramId, + position: row.position, + programNameSnapshot: row.programNameSnapshot, + defaultRestSecondsSnapshot: row.defaultRestSecondsSnapshot, + programSnapshotJson: row.programSnapshotJson, + ); +} + +db.WorkoutTemplateExerciseOverridesCompanion +_workoutTemplateExerciseOverrideCompanion( + domain.WorkoutTemplateExerciseOverride override, +) { + final values = _metadataValues(override.metadata); + return db.WorkoutTemplateExerciseOverridesCompanion( + id: values[0] as Value, + createdAt: values[1] as Value, + updatedAt: values[2] as Value, + deletedAt: values[3] as Value, + schemaVersion: values[4] as Value, + syncState: values[5] as Value, + localRevision: values[6] as Value, + originDeviceId: values[7] as Value, + futureOwnerProfileId: values[8] as Value, + lastSyncedAt: values[9] as Value, + remoteRevision: values[10] as Value, + workoutTemplateProgramId: Value(override.workoutTemplateProgramId), + snapshotProgramExerciseId: Value(override.snapshotProgramExerciseId), + setsCountOverride: Value(override.setsCountOverride), + targetTimeSecondsOverride: Value(override.targetTimeSecondsOverride), + targetRepsOverride: Value(override.targetRepsOverride), + targetScoreOverride: Value(override.targetScoreOverride), + ); +} + +domain.WorkoutTemplateExerciseOverride _workoutTemplateExerciseOverrideFromRow( + db.WorkoutTemplateExerciseOverride row, +) { + return domain.WorkoutTemplateExerciseOverride( + metadata: _metadataFromRow(row), + workoutTemplateProgramId: row.workoutTemplateProgramId, + snapshotProgramExerciseId: row.snapshotProgramExerciseId, + setsCountOverride: row.setsCountOverride, + targetTimeSecondsOverride: row.targetTimeSecondsOverride, + targetRepsOverride: row.targetRepsOverride, + targetScoreOverride: row.targetScoreOverride, + ); +} + +db.ActiveWorkoutSessionsCompanion _activeWorkoutSessionCompanion( + domain.ActiveWorkoutSession session, +) { + final values = _metadataValues(session.metadata); + return db.ActiveWorkoutSessionsCompanion( + id: values[0] as Value, + createdAt: values[1] as Value, + updatedAt: values[2] as Value, + deletedAt: values[3] as Value, + schemaVersion: values[4] as Value, + syncState: values[5] as Value, + localRevision: values[6] as Value, + originDeviceId: values[7] as Value, + futureOwnerProfileId: values[8] as Value, + lastSyncedAt: values[9] as Value, + remoteRevision: values[10] as Value, + sourceWorkoutTemplateId: Value(session.sourceWorkoutTemplateId), + status: Value(_activeStatusToDb(session.status)), + startedAt: Value(session.startedAt), + pausedAt: Value(session.pausedAt), + endedAt: Value(session.endedAt), + lastPersistedAt: Value(session.lastPersistedAt), + elapsedActiveMs: Value(session.elapsedActiveMs), + currentProgramIndex: Value(session.currentProgramIndex), + currentExerciseIndex: Value(session.currentExerciseIndex), + currentSetIndex: Value(session.currentSetIndex), + resolvedTemplateSnapshotJson: Value(session.resolvedTemplateSnapshotJson), + ); +} + +domain.ActiveWorkoutSession _activeWorkoutSessionFromRow( + db.ActiveWorkoutSession row, +) { + return domain.ActiveWorkoutSession( + metadata: _metadataFromRow(row), + sourceWorkoutTemplateId: row.sourceWorkoutTemplateId, + status: _activeStatusFromDb(row.status), + startedAt: row.startedAt, + pausedAt: row.pausedAt, + endedAt: row.endedAt, + lastPersistedAt: row.lastPersistedAt, + elapsedActiveMs: row.elapsedActiveMs, + currentProgramIndex: row.currentProgramIndex, + currentExerciseIndex: row.currentExerciseIndex, + currentSetIndex: row.currentSetIndex, + resolvedTemplateSnapshotJson: row.resolvedTemplateSnapshotJson, + ); +} + +db.ActiveSetResultsCompanion _activeSetResultCompanion( + domain.ActiveSetResult result, +) { + final values = _metadataValues(result.metadata); + return db.ActiveSetResultsCompanion( + id: values[0] as Value, + createdAt: values[1] as Value, + updatedAt: values[2] as Value, + deletedAt: values[3] as Value, + schemaVersion: values[4] as Value, + syncState: values[5] as Value, + localRevision: values[6] as Value, + originDeviceId: values[7] as Value, + futureOwnerProfileId: values[8] as Value, + lastSyncedAt: values[9] as Value, + remoteRevision: values[10] as Value, + activeWorkoutSessionId: Value(result.activeWorkoutSessionId), + programSnapshotId: Value(result.programSnapshotId), + exerciseSnapshotId: Value(result.exerciseSnapshotId), + programIndex: Value(result.programIndex), + exerciseIndex: Value(result.exerciseIndex), + setIndex: Value(result.setIndex), + startedAt: Value(result.startedAt), + completedAt: Value(result.completedAt), + actualTimeMs: Value(result.actualTimeMs), + actualReps: Value(result.actualReps), + actualScore: Value(result.actualScore), + scoreLabelSnapshot: Value(result.scoreLabelSnapshot), + scoreUnitSnapshot: Value(result.scoreUnitSnapshot), + note: Value(result.note), + ); +} + +domain.ActiveSetResult _activeSetResultFromRow(db.ActiveSetResult row) { + return domain.ActiveSetResult( + metadata: _metadataFromRow(row), + activeWorkoutSessionId: row.activeWorkoutSessionId, + programSnapshotId: row.programSnapshotId, + exerciseSnapshotId: row.exerciseSnapshotId, + programIndex: row.programIndex, + exerciseIndex: row.exerciseIndex, + setIndex: row.setIndex, + startedAt: row.startedAt, + completedAt: row.completedAt, + actualTimeMs: row.actualTimeMs, + actualReps: row.actualReps, + actualScore: row.actualScore, + scoreLabelSnapshot: row.scoreLabelSnapshot, + scoreUnitSnapshot: row.scoreUnitSnapshot, + note: row.note, + ); +} + +db.ActiveRestStatesCompanion _activeRestStateCompanion( + domain.ActiveRestState restState, +) { + final values = _metadataValues(restState.metadata); + return db.ActiveRestStatesCompanion( + id: values[0] as Value, + createdAt: values[1] as Value, + updatedAt: values[2] as Value, + deletedAt: values[3] as Value, + schemaVersion: values[4] as Value, + syncState: values[5] as Value, + localRevision: values[6] as Value, + originDeviceId: values[7] as Value, + futureOwnerProfileId: values[8] as Value, + lastSyncedAt: values[9] as Value, + remoteRevision: values[10] as Value, + activeWorkoutSessionId: Value(restState.activeWorkoutSessionId), + afterProgramIndex: Value(restState.afterProgramIndex), + afterExerciseIndex: Value(restState.afterExerciseIndex), + afterSetIndex: Value(restState.afterSetIndex), + plannedRestSeconds: Value(restState.plannedRestSeconds), + adjustedRestSeconds: Value(restState.adjustedRestSeconds), + startedAt: Value(restState.startedAt), + endedAt: Value(restState.endedAt), + skippedAt: Value(restState.skippedAt), + ); +} + +domain.ActiveRestState _activeRestStateFromRow(db.ActiveRestState row) { + return domain.ActiveRestState( + metadata: _metadataFromRow(row), + activeWorkoutSessionId: row.activeWorkoutSessionId, + afterProgramIndex: row.afterProgramIndex, + afterExerciseIndex: row.afterExerciseIndex, + afterSetIndex: row.afterSetIndex, + plannedRestSeconds: row.plannedRestSeconds, + adjustedRestSeconds: row.adjustedRestSeconds, + startedAt: row.startedAt, + endedAt: row.endedAt, + skippedAt: row.skippedAt, + ); +} + +db.WorkoutHistoriesCompanion _workoutHistoryCompanion( + domain.WorkoutHistory history, +) { + final values = _metadataValues(history.metadata); + return db.WorkoutHistoriesCompanion( + id: values[0] as Value, + createdAt: values[1] as Value, + updatedAt: values[2] as Value, + deletedAt: values[3] as Value, + schemaVersion: values[4] as Value, + syncState: values[5] as Value, + localRevision: values[6] as Value, + originDeviceId: values[7] as Value, + futureOwnerProfileId: values[8] as Value, + lastSyncedAt: values[9] as Value, + remoteRevision: values[10] as Value, + sourceWorkoutTemplateId: Value(history.sourceWorkoutTemplateId), + sourceActiveWorkoutSessionId: Value(history.sourceActiveWorkoutSessionId), + nameSnapshot: Value(history.nameSnapshot), + startedAt: Value(history.startedAt), + endedAt: Value(history.endedAt), + totalActiveMs: Value(history.totalActiveMs), + completed: Value(history.completed), + historySnapshotJson: Value(history.historySnapshotJson), + ); +} + +db.WorkoutHistorySetResultsCompanion _workoutHistorySetResultCompanion( + domain.WorkoutHistorySetResult result, +) { + final values = _metadataValues(result.metadata); + return db.WorkoutHistorySetResultsCompanion( + id: values[0] as Value, + createdAt: values[1] as Value, + updatedAt: values[2] as Value, + deletedAt: values[3] as Value, + schemaVersion: values[4] as Value, + syncState: values[5] as Value, + localRevision: values[6] as Value, + originDeviceId: values[7] as Value, + futureOwnerProfileId: values[8] as Value, + lastSyncedAt: values[9] as Value, + remoteRevision: values[10] as Value, + workoutHistoryId: Value(result.workoutHistoryId), + programSnapshotId: Value(result.programSnapshotId), + exerciseSnapshotId: Value(result.exerciseSnapshotId), + programIndex: Value(result.programIndex), + exerciseIndex: Value(result.exerciseIndex), + setIndex: Value(result.setIndex), + programNameSnapshot: Value(result.programNameSnapshot), + exerciseNameSnapshot: Value(result.exerciseNameSnapshot), + timeEnabledSnapshot: Value(result.timeEnabledSnapshot), + repsEnabledSnapshot: Value(result.repsEnabledSnapshot), + scoreEnabledSnapshot: Value(result.scoreEnabledSnapshot), + targetTimeSecondsSnapshot: Value(result.targetTimeSecondsSnapshot), + targetRepsSnapshot: Value(result.targetRepsSnapshot), + targetScoreSnapshot: Value(result.targetScoreSnapshot), + actualTimeMs: Value(result.actualTimeMs), + actualReps: Value(result.actualReps), + actualScore: Value(result.actualScore), + scoreLabelSnapshot: Value(result.scoreLabelSnapshot), + scoreUnitSnapshot: Value(result.scoreUnitSnapshot), + startedAt: Value(result.startedAt), + completedAt: Value(result.completedAt), + ); +} + +domain.WorkoutHistory _workoutHistoryFromRow( + db.WorkoutHistory row, + List results, +) { + return domain.WorkoutHistory( + metadata: _metadataFromRow(row), + sourceWorkoutTemplateId: row.sourceWorkoutTemplateId, + sourceActiveWorkoutSessionId: row.sourceActiveWorkoutSessionId, + nameSnapshot: row.nameSnapshot, + startedAt: row.startedAt, + endedAt: row.endedAt, + totalActiveMs: row.totalActiveMs, + completed: row.completed, + historySnapshotJson: row.historySnapshotJson, + results: results, + ); +} + +domain.WorkoutHistorySetResult _workoutHistorySetResultFromRow( + db.WorkoutHistorySetResult row, +) { + return domain.WorkoutHistorySetResult( + metadata: _metadataFromRow(row), + workoutHistoryId: row.workoutHistoryId, + programSnapshotId: row.programSnapshotId, + exerciseSnapshotId: row.exerciseSnapshotId, + programIndex: row.programIndex, + exerciseIndex: row.exerciseIndex, + setIndex: row.setIndex, + programNameSnapshot: row.programNameSnapshot, + exerciseNameSnapshot: row.exerciseNameSnapshot, + timeEnabledSnapshot: row.timeEnabledSnapshot, + repsEnabledSnapshot: row.repsEnabledSnapshot, + scoreEnabledSnapshot: row.scoreEnabledSnapshot, + targetTimeSecondsSnapshot: row.targetTimeSecondsSnapshot, + targetRepsSnapshot: row.targetRepsSnapshot, + targetScoreSnapshot: row.targetScoreSnapshot, + actualTimeMs: row.actualTimeMs, + actualReps: row.actualReps, + actualScore: row.actualScore, + scoreLabelSnapshot: row.scoreLabelSnapshot, + scoreUnitSnapshot: row.scoreUnitSnapshot, + startedAt: row.startedAt, + completedAt: row.completedAt, + ); +} + +String _syncStateToDb(domain.SyncState state) => switch (state) { + domain.SyncState.localOnly => 'localOnly', + domain.SyncState.dirty => 'dirty', + domain.SyncState.synced => 'synced', + domain.SyncState.deleted => 'deleted', +}; + +domain.SyncState _syncStateFromDb(String value) => switch (value) { + 'localOnly' => domain.SyncState.localOnly, + 'dirty' => domain.SyncState.dirty, + 'synced' => domain.SyncState.synced, + 'deleted' => domain.SyncState.deleted, + _ => throw domain.DomainException('Unknown sync state: $value'), +}; + +String _activeStatusToDb(domain.ActiveWorkoutStatus status) => switch (status) { + domain.ActiveWorkoutStatus.running => 'running', + domain.ActiveWorkoutStatus.paused => 'paused', + domain.ActiveWorkoutStatus.savedExit => 'savedExit', + domain.ActiveWorkoutStatus.completed => 'completed', + domain.ActiveWorkoutStatus.abandoned => 'abandoned', +}; + +String _mediaKindToDb(domain.MediaKind kind) => switch (kind) { + domain.MediaKind.image => 'image', + domain.MediaKind.video => 'video', +}; + +domain.MediaKind _mediaKindFromDb(String value) => switch (value) { + 'image' => domain.MediaKind.image, + 'video' => domain.MediaKind.video, + _ => throw domain.DomainException('Unknown media kind: $value'), +}; + +domain.ActiveWorkoutStatus _activeStatusFromDb(String value) => switch (value) { + 'running' => domain.ActiveWorkoutStatus.running, + 'paused' => domain.ActiveWorkoutStatus.paused, + 'savedExit' => domain.ActiveWorkoutStatus.savedExit, + 'completed' => domain.ActiveWorkoutStatus.completed, + 'abandoned' => domain.ActiveWorkoutStatus.abandoned, + _ => throw domain.DomainException('Unknown active workout status: $value'), +}; diff --git a/lib/infrastructure/local/local.dart b/lib/infrastructure/local/local.dart new file mode 100644 index 0000000..6094f78 --- /dev/null +++ b/lib/infrastructure/local/local.dart @@ -0,0 +1,4 @@ +export 'app_database.dart'; +export 'drift_repositories.dart'; +export 'local_id.dart'; +export 'local_media_storage.dart'; diff --git a/lib/infrastructure/local/local_id.dart b/lib/infrastructure/local/local_id.dart new file mode 100644 index 0000000..26242d7 --- /dev/null +++ b/lib/infrastructure/local/local_id.dart @@ -0,0 +1,33 @@ +import 'dart:math'; + +import '../../application/ports.dart'; + +const _crockfordBase32 = '0123456789ABCDEFGHJKMNPQRSTVWXYZ'; + +final class LocalIdGenerator implements IdGenerator { + LocalIdGenerator({Random? random}) : _random = random ?? Random.secure(); + + final Random _random; + + @override + String newId() => newUlid(); + + String newUlid({DateTime? now}) { + final timestamp = (now ?? DateTime.now().toUtc()).millisecondsSinceEpoch; + final buffer = StringBuffer(); + + var remainingTimestamp = timestamp; + final timestampChars = List.filled(10, '0'); + for (var index = 9; index >= 0; index--) { + timestampChars[index] = _crockfordBase32[remainingTimestamp & 0x1F]; + remainingTimestamp >>= 5; + } + buffer.writeAll(timestampChars); + + for (var index = 0; index < 16; index++) { + buffer.write(_crockfordBase32[_random.nextInt(32)]); + } + + return buffer.toString(); + } +} diff --git a/lib/infrastructure/local/local_media_storage.dart b/lib/infrastructure/local/local_media_storage.dart new file mode 100644 index 0000000..f515175 --- /dev/null +++ b/lib/infrastructure/local/local_media_storage.dart @@ -0,0 +1,167 @@ +import 'dart:io'; +import 'dart:typed_data'; + +import 'package:path/path.dart' as p; +import 'package:path_provider/path_provider.dart'; + +import '../../application/application.dart'; +import '../../domain/domain.dart'; + +final class PathProviderLocalMediaStorage implements LocalMediaStorage { + const PathProviderLocalMediaStorage(); + + static const _mediaDirectoryName = 'gametime_media'; + + @override + Future importFile({ + required String sourcePath, + required MediaKind kind, + required String stableFileName, + }) async { + final source = File(sourcePath); + if (!await source.exists()) { + throw DomainException('Media source file not found: $sourcePath'); + } + + final extension = p.extension(source.path).toLowerCase(); + final targetDirectory = await _kindDirectory(kind); + await targetDirectory.create(recursive: true); + + final target = File( + p.join(targetDirectory.path, '$stableFileName$extension'), + ); + await source.copy(target.path); + + final bytes = await target.length(); + final dimensions = kind == MediaKind.image + ? await _tryReadImageDimensions(target) + : null; + + return StoredMediaFile( + localUri: target.uri.toString(), + mimeType: _mimeTypeForExtension(extension, kind), + sizeBytes: bytes, + width: dimensions?.width, + height: dimensions?.height, + durationMs: null, + ); + } + + @override + Future> listManagedLocalUris() async { + final root = await _rootDirectory(); + if (!await root.exists()) { + return const {}; + } + final files = await root + .list(recursive: true) + .where((entity) => entity is File) + .cast() + .toList(); + return files.map((file) => file.uri.toString()).toSet(); + } + + @override + Future deleteByLocalUri(String localUri) async { + final file = File.fromUri(Uri.parse(localUri)); + final root = await _rootDirectory(); + final filePath = p.normalize(file.absolute.path); + final rootPath = p.normalize(root.absolute.path); + if (!p.isWithin(rootPath, filePath) && filePath != rootPath) { + throw DomainException( + 'Refusing to delete unmanaged media file: $localUri', + ); + } + if (await file.exists()) { + await file.delete(); + } + } + + Future _kindDirectory(MediaKind kind) async { + final root = await _rootDirectory(); + final child = switch (kind) { + MediaKind.image => 'images', + MediaKind.video => 'videos', + }; + return Directory(p.join(root.path, child)); + } + + Future _rootDirectory() async { + final documents = await getApplicationDocumentsDirectory(); + return Directory(p.join(documents.path, _mediaDirectoryName)); + } +} + +final class _ImageDimensions { + const _ImageDimensions(this.width, this.height); + + final int width; + final int height; +} + +Future<_ImageDimensions?> _tryReadImageDimensions(File file) async { + final bytes = await file.openRead(0, 32).fold( + BytesBuilder(copy: false), + (builder, chunk) { + builder.add(chunk); + return builder; + }, + ); + final data = bytes.toBytes(); + return _readPngDimensions(data) ?? await _readJpegDimensions(file); +} + +_ImageDimensions? _readPngDimensions(Uint8List data) { + const signature = [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]; + if (data.length < 24) { + return null; + } + for (var index = 0; index < signature.length; index++) { + if (data[index] != signature[index]) { + return null; + } + } + final view = ByteData.sublistView(data); + return _ImageDimensions(view.getUint32(16), view.getUint32(20)); +} + +Future<_ImageDimensions?> _readJpegDimensions(File file) async { + final data = await file.readAsBytes(); + if (data.length < 4 || data[0] != 0xFF || data[1] != 0xD8) { + return null; + } + var offset = 2; + while (offset + 9 < data.length) { + if (data[offset] != 0xFF) { + return null; + } + final marker = data[offset + 1]; + final length = (data[offset + 2] << 8) + data[offset + 3]; + if (length < 2 || offset + 2 + length > data.length) { + return null; + } + if ((marker >= 0xC0 && marker <= 0xC3) || + (marker >= 0xC5 && marker <= 0xC7) || + (marker >= 0xC9 && marker <= 0xCB) || + (marker >= 0xCD && marker <= 0xCF)) { + final height = (data[offset + 5] << 8) + data[offset + 6]; + final width = (data[offset + 7] << 8) + data[offset + 8]; + return _ImageDimensions(width, height); + } + offset += 2 + length; + } + return null; +} + +String? _mimeTypeForExtension(String extension, MediaKind kind) { + return switch (extension) { + '.jpg' || '.jpeg' => 'image/jpeg', + '.png' => 'image/png', + '.gif' => 'image/gif', + '.webp' => 'image/webp', + '.mp4' => 'video/mp4', + '.mov' => 'video/quicktime', + '.webm' => 'video/webm', + _ => kind == MediaKind.image ? 'image/*' : 'video/*', + }; +} diff --git a/lib/infrastructure/local/tables.dart b/lib/infrastructure/local/tables.dart new file mode 100644 index 0000000..7c8b78e --- /dev/null +++ b/lib/infrastructure/local/tables.dart @@ -0,0 +1,381 @@ +import 'package:drift/drift.dart'; + +abstract class SyncableTable extends Table { + TextColumn get id => text()(); + DateTimeColumn get createdAt => dateTime()(); + DateTimeColumn get updatedAt => dateTime()(); + DateTimeColumn get deletedAt => dateTime().nullable()(); + IntColumn get schemaVersion => integer().withDefault(const Constant(1))(); + TextColumn get syncState => text().customConstraint( + "NOT NULL CHECK (sync_state IN ('localOnly', 'dirty', 'synced', " + "'deleted'))", + )(); + IntColumn get localRevision => + integer().customConstraint('NOT NULL CHECK (local_revision >= 0)')(); + TextColumn get originDeviceId => text().withLength(min: 1)(); + TextColumn get futureOwnerProfileId => text().nullable()(); + DateTimeColumn get lastSyncedAt => dateTime().nullable()(); + TextColumn get remoteRevision => text().nullable()(); + + @override + Set get primaryKey => {id}; + + @override + List get customConstraints => const []; +} + +class MediaAssets extends SyncableTable { + @override + String get tableName => 'media_assets'; + + TextColumn get kind => text()(); + TextColumn get localUri => text().withLength(min: 1)(); + TextColumn get mimeType => text().nullable()(); + IntColumn get sizeBytes => integer().nullable()(); + IntColumn get width => integer().nullable()(); + IntColumn get height => integer().nullable()(); + IntColumn get durationMs => integer().nullable()(); + TextColumn get checksum => text().nullable()(); + TextColumn get remoteUri => text().nullable()(); + TextColumn get thumbnailLocalUri => text().nullable()(); + + @override + List get customConstraints => [ + "CHECK (kind IN ('image', 'video'))", + 'CHECK (size_bytes IS NULL OR size_bytes >= 0)', + 'CHECK (width IS NULL OR width > 0)', + 'CHECK (height IS NULL OR height > 0)', + 'CHECK (duration_ms IS NULL OR duration_ms >= 0)', + ]; +} + +class Exercises extends SyncableTable { + @override + String get tableName => 'exercises'; + + TextColumn get name => text().withLength(min: 1)(); + TextColumn get description => text().nullable()(); + @ReferenceName('exerciseImageReferences') + TextColumn get imageMediaId => + text().nullable().references(MediaAssets, #id)(); + + @ReferenceName('exerciseVideoReferences') + TextColumn get videoMediaId => + text().nullable().references(MediaAssets, #id)(); + BoolColumn get hasTimeMeasure => boolean()(); + BoolColumn get hasRepsMeasure => boolean()(); + BoolColumn get hasScoreMeasure => boolean()(); + TextColumn get scoreLabel => text().nullable()(); + TextColumn get scoreUnit => text().nullable()(); + DateTimeColumn get archivedAt => dateTime().nullable()(); + + @override + List get customConstraints => [ + 'CHECK (has_time_measure OR has_reps_measure OR has_score_measure)', + 'CHECK (NOT has_score_measure OR (score_label IS NOT NULL ' + 'AND length(trim(score_label)) > 0 AND score_unit IS NOT NULL ' + 'AND length(trim(score_unit)) > 0))', + ]; +} + +class Programs extends SyncableTable { + @override + String get tableName => 'programs'; + + TextColumn get name => text().withLength(min: 1)(); + IntColumn get defaultRestSeconds => integer()(); + + @override + List get customConstraints => ['CHECK (default_rest_seconds >= 0)']; +} + +class ProgramExercises extends SyncableTable { + @override + String get tableName => 'program_exercises'; + + TextColumn get programId => text().references(Programs, #id)(); + TextColumn get sourceExerciseId => + text().nullable().references(Exercises, #id)(); + IntColumn get position => integer()(); + TextColumn get exerciseNameSnapshot => text().withLength(min: 1)(); + TextColumn get exerciseDescriptionSnapshot => text().nullable()(); + @ReferenceName('programExerciseImageSnapshotReferences') + TextColumn get exerciseImageMediaIdSnapshot => + text().nullable().references(MediaAssets, #id)(); + + @ReferenceName('programExerciseVideoSnapshotReferences') + TextColumn get exerciseVideoMediaIdSnapshot => + text().nullable().references(MediaAssets, #id)(); + BoolColumn get exerciseArchivedSnapshot => + boolean().withDefault(const Constant(false))(); + BoolColumn get availableTimeSnapshot => boolean()(); + BoolColumn get availableRepsSnapshot => boolean()(); + BoolColumn get availableScoreSnapshot => boolean()(); + TextColumn get scoreLabelSnapshot => text().nullable()(); + TextColumn get scoreUnitSnapshot => text().nullable()(); + IntColumn get setsCount => integer()(); + BoolColumn get timeEnabled => boolean()(); + BoolColumn get repsEnabled => boolean()(); + BoolColumn get scoreEnabled => boolean()(); + IntColumn get targetTimeSeconds => integer().nullable()(); + IntColumn get targetReps => integer().nullable()(); + RealColumn get targetScore => real().nullable()(); + IntColumn get restSecondsOverride => integer().nullable()(); + + @override + List get customConstraints => [ + 'UNIQUE (program_id, position)', + 'CHECK (position >= 0)', + 'CHECK (sets_count > 0)', + 'CHECK (time_enabled OR reps_enabled OR score_enabled)', + 'CHECK (NOT time_enabled OR available_time_snapshot)', + 'CHECK (NOT reps_enabled OR available_reps_snapshot)', + 'CHECK (NOT score_enabled OR available_score_snapshot)', + 'CHECK (target_time_seconds IS NULL OR target_time_seconds > 0)', + 'CHECK (target_reps IS NULL OR target_reps > 0)', + 'CHECK (target_score IS NULL OR target_score >= 0)', + 'CHECK (rest_seconds_override IS NULL OR rest_seconds_override >= 0)', + 'CHECK (target_time_seconds IS NULL OR time_enabled)', + 'CHECK (target_reps IS NULL OR reps_enabled)', + 'CHECK (target_score IS NULL OR score_enabled)', + 'CHECK (NOT available_score_snapshot OR (score_label_snapshot ' + 'IS NOT NULL AND length(trim(score_label_snapshot)) > 0 ' + 'AND score_unit_snapshot IS NOT NULL ' + 'AND length(trim(score_unit_snapshot)) > 0))', + ]; +} + +class WorkoutTemplates extends SyncableTable { + @override + String get tableName => 'workout_templates'; + + TextColumn get name => text().withLength(min: 1)(); + DateTimeColumn get lastStartedAt => dateTime().nullable()(); +} + +class WorkoutTemplatePrograms extends SyncableTable { + @override + String get tableName => 'workout_template_programs'; + + TextColumn get workoutTemplateId => + text().references(WorkoutTemplates, #id)(); + TextColumn get sourceProgramId => + text().nullable().references(Programs, #id)(); + IntColumn get position => integer()(); + TextColumn get programNameSnapshot => text().withLength(min: 1)(); + IntColumn get defaultRestSecondsSnapshot => integer()(); + TextColumn get programSnapshotJson => text().withLength(min: 1)(); + + @override + List get customConstraints => [ + 'UNIQUE (workout_template_id, position)', + 'CHECK (position >= 0)', + 'CHECK (default_rest_seconds_snapshot >= 0)', + ]; +} + +class WorkoutTemplateExerciseOverrides extends SyncableTable { + @override + String get tableName => 'workout_template_exercise_overrides'; + + TextColumn get workoutTemplateProgramId => + text().references(WorkoutTemplatePrograms, #id)(); + TextColumn get snapshotProgramExerciseId => text().withLength(min: 1)(); + IntColumn get setsCountOverride => integer().nullable()(); + IntColumn get targetTimeSecondsOverride => integer().nullable()(); + IntColumn get targetRepsOverride => integer().nullable()(); + RealColumn get targetScoreOverride => real().nullable()(); + + @override + List get customConstraints => [ + 'UNIQUE (workout_template_program_id, snapshot_program_exercise_id)', + 'CHECK (sets_count_override IS NULL OR sets_count_override > 0)', + 'CHECK (target_time_seconds_override IS NULL OR ' + 'target_time_seconds_override > 0)', + 'CHECK (target_reps_override IS NULL OR target_reps_override > 0)', + 'CHECK (target_score_override IS NULL OR target_score_override >= 0)', + ]; +} + +class ActiveWorkoutSessions extends SyncableTable { + @override + String get tableName => 'active_workout_sessions'; + + TextColumn get sourceWorkoutTemplateId => + text().nullable().references(WorkoutTemplates, #id)(); + TextColumn get status => text()(); + DateTimeColumn get startedAt => dateTime()(); + DateTimeColumn get pausedAt => dateTime().nullable()(); + DateTimeColumn get endedAt => dateTime().nullable()(); + DateTimeColumn get lastPersistedAt => dateTime()(); + IntColumn get elapsedActiveMs => integer()(); + IntColumn get currentProgramIndex => integer()(); + IntColumn get currentExerciseIndex => integer()(); + IntColumn get currentSetIndex => integer()(); + TextColumn get resolvedTemplateSnapshotJson => text().withLength(min: 1)(); + + @override + List get customConstraints => [ + "CHECK (status IN ('running', 'paused', 'savedExit', 'completed', " + "'abandoned'))", + 'CHECK (elapsed_active_ms >= 0)', + 'CHECK (current_program_index >= 0)', + 'CHECK (current_exercise_index >= 0)', + 'CHECK (current_set_index >= 0)', + ]; +} + +class ActiveSetResults extends SyncableTable { + @override + String get tableName => 'active_set_results'; + + TextColumn get activeWorkoutSessionId => + text().references(ActiveWorkoutSessions, #id)(); + TextColumn get programSnapshotId => text().withLength(min: 1)(); + TextColumn get exerciseSnapshotId => text().withLength(min: 1)(); + IntColumn get programIndex => integer()(); + IntColumn get exerciseIndex => integer()(); + IntColumn get setIndex => integer()(); + DateTimeColumn get startedAt => dateTime().nullable()(); + DateTimeColumn get completedAt => dateTime().nullable()(); + IntColumn get actualTimeMs => integer().nullable()(); + IntColumn get actualReps => integer().nullable()(); + RealColumn get actualScore => real().nullable()(); + TextColumn get scoreLabelSnapshot => text().nullable()(); + TextColumn get scoreUnitSnapshot => text().nullable()(); + TextColumn get note => text().nullable()(); + + @override + List get customConstraints => [ + 'UNIQUE (active_workout_session_id, program_index, exercise_index, ' + 'set_index)', + 'CHECK (program_index >= 0)', + 'CHECK (exercise_index >= 0)', + 'CHECK (set_index >= 0)', + 'CHECK (actual_time_ms IS NULL OR actual_time_ms >= 0)', + 'CHECK (actual_reps IS NULL OR actual_reps >= 0)', + 'CHECK (actual_score IS NULL OR actual_score >= 0)', + 'CHECK (actual_score IS NULL OR (score_label_snapshot IS NOT NULL ' + 'AND length(trim(score_label_snapshot)) > 0 ' + 'AND score_unit_snapshot IS NOT NULL ' + 'AND length(trim(score_unit_snapshot)) > 0))', + ]; +} + +class ActiveRestStates extends SyncableTable { + @override + String get tableName => 'active_rest_states'; + + TextColumn get activeWorkoutSessionId => + text().references(ActiveWorkoutSessions, #id)(); + IntColumn get afterProgramIndex => integer()(); + IntColumn get afterExerciseIndex => integer()(); + IntColumn get afterSetIndex => integer()(); + IntColumn get plannedRestSeconds => integer()(); + IntColumn get adjustedRestSeconds => integer()(); + DateTimeColumn get startedAt => dateTime()(); + DateTimeColumn get endedAt => dateTime().nullable()(); + DateTimeColumn get skippedAt => dateTime().nullable()(); + + @override + List get customConstraints => [ + 'CHECK (after_program_index >= 0)', + 'CHECK (after_exercise_index >= 0)', + 'CHECK (after_set_index >= 0)', + 'CHECK (planned_rest_seconds >= 0)', + 'CHECK (adjusted_rest_seconds >= 0)', + 'CHECK (ended_at IS NULL OR skipped_at IS NULL)', + ]; +} + +class WorkoutHistories extends SyncableTable { + @override + String get tableName => 'workout_history'; + + TextColumn get sourceWorkoutTemplateId => + text().nullable().references(WorkoutTemplates, #id)(); + TextColumn get sourceActiveWorkoutSessionId => + text().nullable().references(ActiveWorkoutSessions, #id)(); + TextColumn get nameSnapshot => text().withLength(min: 1)(); + DateTimeColumn get startedAt => dateTime()(); + DateTimeColumn get endedAt => dateTime()(); + IntColumn get totalActiveMs => integer()(); + BoolColumn get completed => boolean()(); + TextColumn get historySnapshotJson => text().withLength(min: 1)(); + + @override + List get customConstraints => ['CHECK (total_active_ms >= 0)']; +} + +class WorkoutHistorySetResults extends SyncableTable { + @override + String get tableName => 'workout_history_set_results'; + + TextColumn get workoutHistoryId => text().references(WorkoutHistories, #id)(); + TextColumn get programSnapshotId => text().withLength(min: 1)(); + TextColumn get exerciseSnapshotId => text().withLength(min: 1)(); + IntColumn get programIndex => integer()(); + IntColumn get exerciseIndex => integer()(); + IntColumn get setIndex => integer()(); + TextColumn get programNameSnapshot => text().withLength(min: 1)(); + TextColumn get exerciseNameSnapshot => text().withLength(min: 1)(); + BoolColumn get timeEnabledSnapshot => boolean()(); + BoolColumn get repsEnabledSnapshot => boolean()(); + BoolColumn get scoreEnabledSnapshot => boolean()(); + IntColumn get targetTimeSecondsSnapshot => integer().nullable()(); + IntColumn get targetRepsSnapshot => integer().nullable()(); + RealColumn get targetScoreSnapshot => real().nullable()(); + IntColumn get actualTimeMs => integer().nullable()(); + IntColumn get actualReps => integer().nullable()(); + RealColumn get actualScore => real().nullable()(); + TextColumn get scoreLabelSnapshot => text().nullable()(); + TextColumn get scoreUnitSnapshot => text().nullable()(); + DateTimeColumn get startedAt => dateTime().nullable()(); + DateTimeColumn get completedAt => dateTime().nullable()(); + + @override + List get customConstraints => [ + 'UNIQUE (workout_history_id, program_index, exercise_index, ' + 'set_index)', + 'CHECK (program_index >= 0)', + 'CHECK (exercise_index >= 0)', + 'CHECK (set_index >= 0)', + 'CHECK (time_enabled_snapshot OR reps_enabled_snapshot OR ' + 'score_enabled_snapshot)', + 'CHECK (target_time_seconds_snapshot IS NULL OR ' + 'target_time_seconds_snapshot > 0)', + 'CHECK (target_reps_snapshot IS NULL OR target_reps_snapshot > 0)', + 'CHECK (target_score_snapshot IS NULL OR target_score_snapshot >= 0)', + 'CHECK (actual_time_ms IS NULL OR actual_time_ms >= 0)', + 'CHECK (actual_reps IS NULL OR actual_reps >= 0)', + 'CHECK (actual_score IS NULL OR actual_score >= 0)', + 'CHECK (actual_score IS NULL OR (score_label_snapshot IS NOT NULL ' + 'AND length(trim(score_label_snapshot)) > 0 ' + 'AND score_unit_snapshot IS NOT NULL ' + 'AND length(trim(score_unit_snapshot)) > 0))', + ]; +} + +class ChangeLogEntries extends Table { + @override + String get tableName => 'change_log'; + + TextColumn get id => text()(); + TextColumn get entityType => text().withLength(min: 1)(); + TextColumn get entityId => text().withLength(min: 1)(); + TextColumn get operation => text()(); + TextColumn get payloadHash => text().nullable()(); + IntColumn get localRevision => integer()(); + TextColumn get originDeviceId => text().withLength(min: 1)(); + DateTimeColumn get createdAt => dateTime()(); + DateTimeColumn get syncedAt => dateTime().nullable()(); + + @override + Set get primaryKey => {id}; + + @override + List get customConstraints => const [ + "CHECK (operation IN ('insert', 'update', 'softDelete', 'restore'))", + 'CHECK (local_revision >= 0)', + ]; +} diff --git a/lib/main.dart b/lib/main.dart new file mode 100644 index 0000000..a6c3086 --- /dev/null +++ b/lib/main.dart @@ -0,0 +1,12 @@ +import 'package:flutter/material.dart'; + +import 'application/app_bootstrap.dart'; +import 'presentation/game_time_app.dart'; + +Future main() async { + WidgetsFlutterBinding.ensureInitialized(); + + final bootstrap = await AppBootstrap.create(); + + runApp(GameTimeApp(bootstrap: bootstrap)); +} diff --git a/lib/presentation/exercise_library_screen.dart b/lib/presentation/exercise_library_screen.dart new file mode 100644 index 0000000..46a0433 --- /dev/null +++ b/lib/presentation/exercise_library_screen.dart @@ -0,0 +1,732 @@ +import 'package:flutter/material.dart'; + +import '../application/application.dart'; +import '../domain/domain.dart'; + +final class ExerciseLibraryScreen extends StatefulWidget { + const ExerciseLibraryScreen({ + required this.exerciseUseCases, + required this.mediaUseCases, + super.key, + }); + + final ExerciseUseCases exerciseUseCases; + final MediaUseCases mediaUseCases; + + @override + State createState() => _ExerciseLibraryScreenState(); +} + +final class _ExerciseLibraryScreenState extends State { + final _searchController = TextEditingController(); + var _selectedMeasures = {}; + late Future> _exercises; + + @override + void initState() { + super.initState(); + _exercises = widget.exerciseUseCases.listActive(); + _searchController.addListener(() => setState(() {})); + } + + @override + void dispose() { + _searchController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: const Text('Exercices')), + floatingActionButton: FloatingActionButton.extended( + onPressed: () => _openForm(), + icon: const Icon(Icons.add), + label: const Text('Créer'), + ), + body: FutureBuilder>( + future: _exercises, + builder: (context, snapshot) { + if (snapshot.connectionState != ConnectionState.done) { + return const Center(child: CircularProgressIndicator()); + } + if (snapshot.hasError) { + return _CenteredMessage( + title: 'Impossible de charger les exercices', + actionLabel: 'Réessayer', + onAction: _reload, + ); + } + + final exercises = snapshot.data ?? const []; + final filtered = _filter(exercises); + return RefreshIndicator( + onRefresh: () { + _reload(); + return Future.value(); + }, + child: CustomScrollView( + slivers: [ + SliverToBoxAdapter( + child: Padding( + padding: const EdgeInsets.fromLTRB(16, 12, 16, 8), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + TextField( + controller: _searchController, + decoration: const InputDecoration( + labelText: 'Rechercher', + prefixIcon: Icon(Icons.search), + border: OutlineInputBorder(), + ), + ), + const SizedBox(height: 12), + Wrap( + spacing: 8, + runSpacing: 8, + children: WorkoutMeasure.values.map((measure) { + return FilterChip( + label: Text(measure.label), + selected: _selectedMeasures.contains(measure), + onSelected: (selected) { + setState(() { + if (selected) { + _selectedMeasures = { + ..._selectedMeasures, + measure, + }; + } else { + _selectedMeasures = {..._selectedMeasures} + ..remove(measure); + } + }); + }, + ); + }).toList(), + ), + ], + ), + ), + ), + if (exercises.isEmpty) + SliverFillRemaining( + hasScrollBody: false, + child: _CenteredMessage( + title: 'Aucun exercice pour le moment', + message: + 'Crée ton premier exercice pour composer tes programmes.', + actionLabel: 'Créer un exercice', + onAction: () => _openForm(), + ), + ) + else if (filtered.isEmpty) + const SliverFillRemaining( + hasScrollBody: false, + child: _CenteredMessage( + title: 'Aucun exercice ne correspond', + message: + 'Modifie la recherche ou les filtres de mesures.', + ), + ) + else + SliverList( + delegate: SliverChildBuilderDelegate((context, index) { + if (index.isOdd) { + return const Divider(height: 1, indent: 72); + } + final exercise = filtered[index ~/ 2]; + return ExerciseListTile( + exercise: exercise, + onTap: () => _openForm(exercise: exercise), + ); + }, childCount: filtered.length * 2 - 1), + ), + ], + ), + ); + }, + ), + ); + } + + List _filter(List exercises) { + final query = _searchController.text.trim().toLowerCase(); + return exercises.where((exercise) { + final matchesQuery = + query.isEmpty || + exercise.name.toLowerCase().contains(query) || + (exercise.description?.toLowerCase().contains(query) ?? false); + final matchesMeasures = + _selectedMeasures.isEmpty || + _selectedMeasures.every(exercise.availableMeasures.contains); + return matchesQuery && matchesMeasures; + }).toList(); + } + + void _reload() { + setState(() { + _exercises = widget.exerciseUseCases.listActive(); + }); + } + + Future _openForm({Exercise? exercise}) async { + final changed = await Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => ExerciseFormScreen( + exerciseUseCases: widget.exerciseUseCases, + mediaUseCases: widget.mediaUseCases, + exercise: exercise, + ), + ), + ); + if (changed == true) { + if (!mounted) return; + _reload(); + } + } +} + +final class ExerciseListTile extends StatelessWidget { + const ExerciseListTile({required this.exercise, this.onTap, super.key}); + + final Exercise exercise; + final VoidCallback? onTap; + + @override + Widget build(BuildContext context) { + final description = exercise.description?.trim(); + final hasMedia = + exercise.imageMediaId != null || exercise.videoMediaId != null; + return ListTile( + onTap: onTap, + leading: CircleAvatar( + child: Icon( + hasMedia ? Icons.perm_media_outlined : Icons.fitness_center, + ), + ), + title: Text(exercise.name), + subtitle: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (description != null && description.isNotEmpty) + Padding( + padding: const EdgeInsets.only(top: 2, bottom: 6), + child: Text( + description, + maxLines: 2, + overflow: TextOverflow.ellipsis, + ), + ) + else + const SizedBox(height: 6), + Wrap( + spacing: 6, + runSpacing: 6, + children: [ + ...exercise.availableMeasures.map( + (measure) => MeasureBadge( + measure: measure, + scoreUnit: exercise.scoreUnit, + ), + ), + if (hasMedia) + const Tooltip( + message: 'Média associé', + child: Icon(Icons.image_outlined, size: 18), + ), + ], + ), + ], + ), + trailing: const Icon(Icons.chevron_right), + ); + } +} + +final class ExerciseFormScreen extends StatefulWidget { + const ExerciseFormScreen({ + required this.exerciseUseCases, + required this.mediaUseCases, + this.exercise, + super.key, + }); + + final ExerciseUseCases exerciseUseCases; + final MediaUseCases mediaUseCases; + final Exercise? exercise; + + @override + State createState() => _ExerciseFormScreenState(); +} + +final class _ExerciseFormScreenState extends State { + final _formKey = GlobalKey(); + late final TextEditingController _nameController; + late final TextEditingController _descriptionController; + late final TextEditingController _scoreLabelController; + late final TextEditingController _scoreUnitController; + final _imagePathController = TextEditingController(); + final _videoPathController = TextEditingController(); + String? _imageMediaId; + String? _videoMediaId; + var _hasTime = true; + var _hasReps = false; + var _hasScore = false; + var _saving = false; + var _importingImage = false; + var _importingVideo = false; + String? _measureError; + String? _warning; + + bool get _isEditing => widget.exercise != null; + + @override + void initState() { + super.initState(); + final exercise = widget.exercise; + _nameController = TextEditingController(text: exercise?.name); + _descriptionController = TextEditingController(text: exercise?.description); + _scoreLabelController = TextEditingController(text: exercise?.scoreLabel); + _scoreUnitController = TextEditingController(text: exercise?.scoreUnit); + _imageMediaId = exercise?.imageMediaId; + _videoMediaId = exercise?.videoMediaId; + _hasTime = exercise?.hasTimeMeasure ?? true; + _hasReps = exercise?.hasRepsMeasure ?? false; + _hasScore = exercise?.hasScoreMeasure ?? false; + } + + @override + void dispose() { + _nameController.dispose(); + _descriptionController.dispose(); + _scoreLabelController.dispose(); + _scoreUnitController.dispose(); + _imagePathController.dispose(); + _videoPathController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text(_isEditing ? 'Modifier l’exercice' : 'Créer un exercice'), + ), + body: Form( + key: _formKey, + child: ListView( + padding: const EdgeInsets.all(16), + children: [ + TextFormField( + controller: _nameController, + decoration: const InputDecoration( + labelText: 'Nom', + border: OutlineInputBorder(), + ), + textInputAction: TextInputAction.next, + validator: (value) => value == null || value.trim().isEmpty + ? 'Le nom est obligatoire.' + : null, + ), + const SizedBox(height: 12), + TextFormField( + controller: _descriptionController, + decoration: const InputDecoration( + labelText: 'Description', + border: OutlineInputBorder(), + ), + minLines: 2, + maxLines: 4, + ), + const SizedBox(height: 24), + Text( + 'Média optionnel', + style: Theme.of(context).textTheme.titleMedium, + ), + const SizedBox(height: 8), + _MediaImportField( + controller: _imagePathController, + label: 'Chemin de l’image', + imported: _imageMediaId != null, + importing: _importingImage, + onImport: () => _importMedia(MediaKind.image), + ), + const SizedBox(height: 8), + _MediaImportField( + controller: _videoPathController, + label: 'Chemin de la vidéo', + imported: _videoMediaId != null, + importing: _importingVideo, + onImport: () => _importMedia(MediaKind.video), + ), + const SizedBox(height: 24), + Text( + 'Mesures disponibles', + style: Theme.of(context).textTheme.titleMedium, + ), + const SizedBox(height: 8), + _MeasureSwitch( + title: 'Temps', + subtitle: 'Chronométrer la durée d’une série.', + value: _hasTime, + onChanged: (value) => _setMeasure(() => _hasTime = value), + ), + _MeasureSwitch( + title: 'Répétitions', + subtitle: 'Compter le nombre de mouvements réalisés.', + value: _hasReps, + onChanged: (value) => _setMeasure(() => _hasReps = value), + ), + _MeasureSwitch( + title: 'Score', + subtitle: 'Saisir une valeur libre avec son unité.', + value: _hasScore, + onChanged: (value) => _setMeasure(() => _hasScore = value), + ), + if (_measureError != null) + Padding( + padding: const EdgeInsets.only(top: 8), + child: Text( + _measureError!, + style: TextStyle(color: Theme.of(context).colorScheme.error), + ), + ), + if (_hasScore) ...[ + const SizedBox(height: 12), + TextFormField( + controller: _scoreLabelController, + decoration: const InputDecoration( + labelText: 'Score à saisir', + border: OutlineInputBorder(), + ), + validator: (value) { + if (!_hasScore) return null; + return value == null || value.trim().isEmpty + ? 'Le libellé du score est obligatoire.' + : null; + }, + ), + const SizedBox(height: 12), + TextFormField( + controller: _scoreUnitController, + decoration: const InputDecoration( + labelText: 'Unité', + border: OutlineInputBorder(), + ), + validator: (value) { + if (!_hasScore) return null; + return value == null || value.trim().isEmpty + ? 'L’unité du score est obligatoire.' + : null; + }, + ), + ], + if (_warning != null) ...[ + const SizedBox(height: 16), + MaterialBanner( + content: Text(_warning!), + leading: const Icon(Icons.info_outline), + actions: [ + TextButton( + onPressed: () => setState(() => _warning = null), + child: const Text('OK'), + ), + ], + ), + ], + const SizedBox(height: 24), + FilledButton.icon( + onPressed: _saving ? null : _save, + icon: _saving + ? const SizedBox.square( + dimension: 18, + child: CircularProgressIndicator(strokeWidth: 2), + ) + : const Icon(Icons.check), + label: const Text('Enregistrer'), + ), + ], + ), + ), + ); + } + + void _setMeasure(VoidCallback update) { + setState(() { + update(); + _measureError = null; + _warning = null; + }); + } + + Future _importMedia(MediaKind kind) async { + final controller = kind == MediaKind.image + ? _imagePathController + : _videoPathController; + final sourcePath = controller.text.trim(); + if (sourcePath.isEmpty) { + _showSnackBar('Indique un chemin de fichier à importer.'); + return; + } + setState(() { + if (kind == MediaKind.image) { + _importingImage = true; + } else { + _importingVideo = true; + } + }); + try { + final asset = await widget.mediaUseCases.importMedia( + sourcePath: sourcePath, + kind: kind, + ); + if (!mounted) return; + setState(() { + if (kind == MediaKind.image) { + _imageMediaId = asset.metadata.id; + } else { + _videoMediaId = asset.metadata.id; + } + }); + _showSnackBar( + kind == MediaKind.image ? 'Image importée.' : 'Vidéo importée.', + ); + } on Exception catch (error) { + _showSnackBar(error.toString()); + } finally { + if (mounted) { + setState(() { + _importingImage = false; + _importingVideo = false; + }); + } + } + } + + Future _save() async { + final hasMeasure = _hasTime || _hasReps || _hasScore; + setState(() { + _measureError = hasMeasure + ? null + : 'Active au moins une mesure pour enregistrer.'; + }); + if (!_formKey.currentState!.validate() || !hasMeasure) { + return; + } + + final exercise = widget.exercise; + if (exercise != null && + _measuresChanged(exercise) && + _warning == null && + await widget.exerciseUseCases.isUsedInPrograms(exercise.metadata.id)) { + if (!mounted) return; + setState(() { + _warning = + 'Cet exercice est déjà utilisé dans un programme. ' + 'Les programmes existants restent inchangés.'; + }); + return; + } + + setState(() => _saving = true); + try { + if (exercise == null) { + await widget.exerciseUseCases.create( + name: _nameController.text.trim(), + description: _optionalText(_descriptionController), + imageMediaId: _imageMediaId, + videoMediaId: _videoMediaId, + hasTimeMeasure: _hasTime, + hasRepsMeasure: _hasReps, + hasScoreMeasure: _hasScore, + scoreLabel: _hasScore ? _scoreLabelController.text.trim() : null, + scoreUnit: _hasScore ? _scoreUnitController.text.trim() : null, + ); + } else { + await widget.exerciseUseCases.update( + id: exercise.metadata.id, + name: _nameController.text.trim(), + description: _optionalText(_descriptionController), + imageMediaId: _imageMediaId, + videoMediaId: _videoMediaId, + hasTimeMeasure: _hasTime, + hasRepsMeasure: _hasReps, + hasScoreMeasure: _hasScore, + scoreLabel: _hasScore ? _scoreLabelController.text.trim() : null, + scoreUnit: _hasScore ? _scoreUnitController.text.trim() : null, + ); + } + if (mounted) { + Navigator.of(context).pop(true); + } + } on Exception catch (error) { + _showSnackBar(error.toString()); + } finally { + if (mounted) { + setState(() => _saving = false); + } + } + } + + bool _measuresChanged(Exercise exercise) { + return exercise.hasTimeMeasure != _hasTime || + exercise.hasRepsMeasure != _hasReps || + exercise.hasScoreMeasure != _hasScore; + } + + String? _optionalText(TextEditingController controller) { + final text = controller.text.trim(); + return text.isEmpty ? null : text; + } + + void _showSnackBar(String message) { + if (!mounted) return; + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text(message))); + } +} + +final class MeasureBadge extends StatelessWidget { + const MeasureBadge({required this.measure, this.scoreUnit, super.key}); + + final WorkoutMeasure measure; + final String? scoreUnit; + + @override + Widget build(BuildContext context) { + final unit = scoreUnit?.trim(); + final label = + measure == WorkoutMeasure.score && unit != null && unit.isNotEmpty + ? '${measure.label} ($unit)' + : measure.label; + return Semantics( + label: label, + child: Chip(visualDensity: VisualDensity.compact, label: Text(label)), + ); + } +} + +final class _MeasureSwitch extends StatelessWidget { + const _MeasureSwitch({ + required this.title, + required this.subtitle, + required this.value, + required this.onChanged, + }); + + final String title; + final String subtitle; + final bool value; + final ValueChanged onChanged; + + @override + Widget build(BuildContext context) { + return SwitchListTile( + contentPadding: EdgeInsets.zero, + title: Text(title), + subtitle: Text(subtitle), + value: value, + onChanged: onChanged, + ); + } +} + +final class _MediaImportField extends StatelessWidget { + const _MediaImportField({ + required this.controller, + required this.label, + required this.imported, + required this.importing, + required this.onImport, + }); + + final TextEditingController controller; + final String label; + final bool imported; + final bool importing; + final VoidCallback onImport; + + @override + Widget build(BuildContext context) { + return TextField( + controller: controller, + decoration: InputDecoration( + labelText: label, + border: const OutlineInputBorder(), + suffixIcon: Row( + mainAxisSize: MainAxisSize.min, + children: [ + if (imported) + const Tooltip( + message: 'Média importé', + child: Icon(Icons.check_circle_outline), + ), + IconButton( + tooltip: 'Importer', + onPressed: importing ? null : onImport, + icon: importing + ? const SizedBox.square( + dimension: 18, + child: CircularProgressIndicator(strokeWidth: 2), + ) + : const Icon(Icons.upload_file), + ), + ], + ), + ), + ); + } +} + +final class _CenteredMessage extends StatelessWidget { + const _CenteredMessage({ + required this.title, + this.message, + this.actionLabel, + this.onAction, + }); + + final String title; + final String? message; + final String? actionLabel; + final VoidCallback? onAction; + + @override + Widget build(BuildContext context) { + return Center( + child: Padding( + padding: const EdgeInsets.all(24), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + title, + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.titleMedium, + ), + if (message != null) ...[ + const SizedBox(height: 8), + Text(message!, textAlign: TextAlign.center), + ], + if (actionLabel != null && onAction != null) ...[ + const SizedBox(height: 16), + FilledButton(onPressed: onAction, child: Text(actionLabel!)), + ], + ], + ), + ), + ); + } +} + +extension on WorkoutMeasure { + String get label { + return switch (this) { + WorkoutMeasure.time => 'Temps', + WorkoutMeasure.reps => 'Répétitions', + WorkoutMeasure.score => 'Score', + }; + } +} diff --git a/lib/presentation/game_time_app.dart b/lib/presentation/game_time_app.dart new file mode 100644 index 0000000..379a2b4 --- /dev/null +++ b/lib/presentation/game_time_app.dart @@ -0,0 +1,22 @@ +import 'package:flutter/material.dart'; + +import '../application/app_bootstrap.dart'; +import 'home_screen.dart'; + +final class GameTimeApp extends StatelessWidget { + const GameTimeApp({required this.bootstrap, super.key}); + + final AppBootstrap bootstrap; + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'GameTime', + theme: ThemeData( + colorScheme: ColorScheme.fromSeed(seedColor: const Color(0xFF0E7C66)), + useMaterial3: true, + ), + home: HomeScreen(bootstrap: bootstrap), + ); + } +} diff --git a/lib/presentation/history_screen.dart b/lib/presentation/history_screen.dart new file mode 100644 index 0000000..9b29925 --- /dev/null +++ b/lib/presentation/history_screen.dart @@ -0,0 +1,430 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; + +import '../application/application.dart'; +import '../domain/domain.dart'; +import 'workout_execution_screen.dart'; + +final class HistoryListScreen extends StatefulWidget { + const HistoryListScreen({ + required this.historyUseCases, + required this.workoutTemplateUseCases, + required this.activeUseCases, + required this.closeUseCase, + super.key, + }); + + final WorkoutHistoryUseCases historyUseCases; + final WorkoutTemplateUseCases workoutTemplateUseCases; + final ActiveWorkoutSessionUseCases activeUseCases; + final CloseWorkoutSessionUseCase closeUseCase; + + @override + State createState() => _HistoryListScreenState(); +} + +final class _HistoryListScreenState extends State { + late Future> _histories; + + @override + void initState() { + super.initState(); + _histories = widget.historyUseCases.listActive(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: const Text('Historique')), + body: FutureBuilder>( + future: _histories, + builder: (context, snapshot) { + if (snapshot.connectionState != ConnectionState.done) { + return const Center(child: CircularProgressIndicator()); + } + final histories = snapshot.data ?? const []; + if (histories.isEmpty) { + return const _CenteredMessage( + title: 'Aucune séance terminée', + message: 'Les séances terminées apparaîtront ici.', + ); + } + final groups = groupHistoriesByPeriod(histories, DateTime.now()); + return ListView( + children: [ + for (final group in groups.entries) ...[ + Padding( + padding: const EdgeInsets.fromLTRB(16, 20, 16, 8), + child: Text( + group.key, + style: Theme.of(context).textTheme.titleMedium, + ), + ), + for (final history in group.value) + ListTile( + title: Text(history.nameSnapshot), + subtitle: Text( + '${_formatDateTime(history.startedAt)} · ' + '${_formatDurationMs(history.totalActiveMs)} · ' + '${_historySummary(history)}', + ), + trailing: const Icon(Icons.chevron_right), + onTap: () => _openDetail(history), + ), + ], + ], + ); + }, + ), + ); + } + + Future _openDetail(WorkoutHistory history) async { + final deleted = await Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => HistoryDetailScreen( + history: history, + historyUseCases: widget.historyUseCases, + workoutTemplateUseCases: widget.workoutTemplateUseCases, + activeUseCases: widget.activeUseCases, + closeUseCase: widget.closeUseCase, + ), + ), + ); + if (deleted == true) { + setState(() { + _histories = widget.historyUseCases.listActive(); + }); + } + } +} + +final class HistoryDetailScreen extends StatelessWidget { + const HistoryDetailScreen({ + required this.history, + required this.historyUseCases, + required this.workoutTemplateUseCases, + required this.activeUseCases, + required this.closeUseCase, + super.key, + }); + + final WorkoutHistory history; + final WorkoutHistoryUseCases historyUseCases; + final WorkoutTemplateUseCases workoutTemplateUseCases; + final ActiveWorkoutSessionUseCases activeUseCases; + final CloseWorkoutSessionUseCase closeUseCase; + + @override + Widget build(BuildContext context) { + final detail = HistoryDetailData.fromHistory(history); + return Scaffold( + appBar: AppBar(title: Text(history.nameSnapshot)), + body: ListView( + padding: const EdgeInsets.all(16), + children: [ + Text(_formatDateTime(history.startedAt)), + const SizedBox(height: 4), + Text('Durée : ${_formatDurationMs(history.totalActiveMs)}'), + const SizedBox(height: 16), + for (final program in detail.programs) ...[ + Text(program.name, style: Theme.of(context).textTheme.titleMedium), + const SizedBox(height: 8), + for (final exercise in program.exercises) ...[ + Text( + exercise.name, + style: Theme.of(context).textTheme.titleSmall, + ), + for (final set in exercise.sets) + ListTile( + dense: true, + title: Text('Série ${set.setIndex + 1}'), + subtitle: Text(set.summary), + ), + ], + const SizedBox(height: 12), + ], + const SizedBox(height: 16), + FilledButton( + onPressed: () => _restart(context), + child: const Text('Relancer cette séance'), + ), + const SizedBox(height: 8), + OutlinedButton( + onPressed: () => _confirmDelete(context), + child: const Text("Supprimer de l'historique"), + ), + ], + ), + ); + } + + Future _restart(BuildContext context) async { + ActiveWorkoutSession session; + final sourceId = history.sourceWorkoutTemplateId; + if (sourceId != null && + await workoutTemplateUseCases.findById(sourceId) != null) { + session = await activeUseCases.startFromTemplate(sourceId); + } else { + if (context.mounted) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text( + "La séance originale n'existe plus. Une copie va être utilisée.", + ), + ), + ); + } + session = await activeUseCases.startFromHistory(history); + } + if (!context.mounted) return; + await Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => WorkoutExecutionScreen( + initialSession: session, + activeUseCases: activeUseCases, + closeUseCase: closeUseCase, + historyUseCases: historyUseCases, + workoutTemplateUseCases: workoutTemplateUseCases, + ), + ), + ); + } + + Future _confirmDelete(BuildContext context) async { + final confirmed = await showDialog( + context: context, + builder: (context) => AlertDialog( + title: const Text("Supprimer de l'historique ?"), + content: const Text('Cette action est définitive.'), + actions: [ + TextButton( + onPressed: () => Navigator.of(context).pop(false), + child: const Text('Annuler'), + ), + FilledButton( + onPressed: () => Navigator.of(context).pop(true), + child: const Text('Supprimer'), + ), + ], + ), + ); + if (confirmed != true) return; + await historyUseCases.delete(history.metadata.id); + if (!context.mounted) return; + Navigator.of(context).pop(true); + } +} + +final class HistoryDetailData { + const HistoryDetailData({required this.programs}); + + factory HistoryDetailData.fromHistory(WorkoutHistory history) { + final snapshot = + jsonDecode(history.historySnapshotJson) as Map; + final resolved = + jsonDecode(snapshot['resolvedTemplateSnapshotJson'] as String) + as Map; + final rawResults = history.results.isNotEmpty + ? history.results.map(_resultFromDomain).toList() + : (snapshot['results'] as List? ?? const []) + .cast>(); + final programs = []; + final rawPrograms = resolved['programs'] as List? ?? const []; + for ( + var programIndex = 0; + programIndex < rawPrograms.length; + programIndex++ + ) { + final rawProgram = rawPrograms[programIndex] as Map; + final programSnapshot = + jsonDecode(rawProgram['programSnapshotJson'] as String) + as Map; + final exercises = []; + final rawExercises = + programSnapshot['exercises'] as List? ?? const []; + for ( + var exerciseIndex = 0; + exerciseIndex < rawExercises.length; + exerciseIndex++ + ) { + final rawExercise = rawExercises[exerciseIndex] as Map; + final exerciseResults = rawResults.where((result) { + return result['programIndex'] == programIndex && + result['exerciseIndex'] == exerciseIndex; + }).toList(); + exercises.add( + HistoryExerciseDetail( + name: rawExercise['exerciseNameSnapshot'] as String, + sets: [ + for (final result in exerciseResults) + HistorySetDetail.fromSnapshot(rawExercise, result), + ], + ), + ); + } + programs.add( + HistoryProgramDetail( + name: rawProgram['programNameSnapshot'] as String, + exercises: exercises, + ), + ); + } + return HistoryDetailData(programs: programs); + } + + final List programs; +} + +final class HistoryProgramDetail { + const HistoryProgramDetail({required this.name, required this.exercises}); + + final String name; + final List exercises; +} + +final class HistoryExerciseDetail { + const HistoryExerciseDetail({required this.name, required this.sets}); + + final String name; + final List sets; +} + +final class HistorySetDetail { + const HistorySetDetail({required this.setIndex, required this.summary}); + + factory HistorySetDetail.fromSnapshot( + Map exercise, + Map result, + ) { + final parts = []; + if (exercise['timeEnabled'] == true && result['actualTimeMs'] != null) { + parts.add('Temps ${_formatDurationMs(result['actualTimeMs'] as int)}'); + } + if (exercise['repsEnabled'] == true && result['actualReps'] != null) { + parts.add('${result['actualReps']} répétitions'); + } + if (exercise['scoreEnabled'] == true && result['actualScore'] != null) { + final unit = exercise['scoreUnitSnapshot'] as String?; + final value = _formatScoreValue(result['actualScore'] as num); + parts.add(unit == null ? 'Score $value' : 'Score $value $unit'); + } + return HistorySetDetail( + setIndex: result['setIndex'] as int, + summary: parts.isEmpty ? 'Aucune mesure saisie' : parts.join(' · '), + ); + } + + final int setIndex; + final String summary; +} + +Map> groupHistoriesByPeriod( + List histories, + DateTime now, +) { + final today = DateTime(now.year, now.month, now.day); + final weekStart = today.subtract(Duration(days: today.weekday - 1)); + final groups = >{ + "Aujourd'hui": [], + 'Cette semaine': [], + 'Plus ancien': [], + }; + for (final history in histories) { + final startedDay = DateTime( + history.startedAt.year, + history.startedAt.month, + history.startedAt.day, + ); + if (startedDay == today) { + groups["Aujourd'hui"]!.add(history); + } else if (startedDay.isAfter(weekStart) || startedDay == weekStart) { + groups['Cette semaine']!.add(history); + } else { + groups['Plus ancien']!.add(history); + } + } + groups.removeWhere((key, value) => value.isEmpty); + return groups; +} + +Map _resultFromDomain(WorkoutHistorySetResult result) { + return { + 'programIndex': result.programIndex, + 'exerciseIndex': result.exerciseIndex, + 'setIndex': result.setIndex, + 'actualTimeMs': result.actualTimeMs, + 'actualReps': result.actualReps, + 'actualScore': result.actualScore, + }; +} + +String _historySummary(WorkoutHistory history) { + final snapshot = + jsonDecode(history.historySnapshotJson) as Map; + final rawResults = history.results.isNotEmpty + ? history.results.map(_resultFromDomain).toList() + : (snapshot['results'] as List? ?? const []) + .cast>(); + final scoreCount = rawResults + .where((result) => result['actualScore'] != null) + .length; + return '${rawResults.length} séries · $scoreCount score${scoreCount > 1 ? 's' : ''}'; +} + +String _formatScoreValue(num value) { + if (value is int || value == value.roundToDouble()) { + return value.round().toString(); + } + return value.toString(); +} + +String _formatDateTime(DateTime value) { + final day = value.day.toString().padLeft(2, '0'); + final month = value.month.toString().padLeft(2, '0'); + final hour = value.hour.toString().padLeft(2, '0'); + final minute = value.minute.toString().padLeft(2, '0'); + return '$day/$month/${value.year} $hour:$minute'; +} + +String _formatDurationMs(int milliseconds) { + final duration = Duration(milliseconds: milliseconds); + final minutes = duration.inMinutes.remainder(60).toString().padLeft(2, '0'); + final seconds = duration.inSeconds.remainder(60).toString().padLeft(2, '0'); + final hours = duration.inHours; + if (hours > 0) { + return '$hours:$minutes:$seconds'; + } + return '$minutes:$seconds'; +} + +final class _CenteredMessage extends StatelessWidget { + const _CenteredMessage({required this.title, this.message}); + + final String title; + final String? message; + + @override + Widget build(BuildContext context) { + return Center( + child: Padding( + padding: const EdgeInsets.all(24), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + title, + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.titleMedium, + ), + if (message != null) ...[ + const SizedBox(height: 8), + Text(message!, textAlign: TextAlign.center), + ], + ], + ), + ), + ); + } +} diff --git a/lib/presentation/home_screen.dart b/lib/presentation/home_screen.dart new file mode 100644 index 0000000..36b4d0a --- /dev/null +++ b/lib/presentation/home_screen.dart @@ -0,0 +1,144 @@ +import 'package:flutter/material.dart'; + +import '../application/app_bootstrap.dart'; +import '../domain/domain.dart'; +import 'exercise_library_screen.dart'; +import 'history_screen.dart'; +import 'program_screen.dart'; +import 'workout_execution_screen.dart'; +import 'workout_template_screen.dart'; + +final class HomeScreen extends StatefulWidget { + const HomeScreen({required this.bootstrap, super.key}); + + final AppBootstrap bootstrap; + + @override + State createState() => _HomeScreenState(); +} + +final class _HomeScreenState extends State { + late Future _openSession; + + @override + void initState() { + super.initState(); + _openSession = widget.bootstrap.activeWorkoutSessionUseCases.findOpen(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: const Text('GameTime')), + body: ListView( + children: [ + FutureBuilder( + future: _openSession, + builder: (context, snapshot) { + final session = snapshot.data; + if (session == null) { + return const SizedBox.shrink(); + } + final plan = WorkoutExecutionPlan.fromSession(session); + final position = ExecutionPosition( + programIndex: session.currentProgramIndex, + exerciseIndex: session.currentExerciseIndex, + setIndex: session.currentSetIndex, + ); + final exercise = plan.exerciseAt(position); + return MaterialBanner( + content: Text( + 'Séance en cours — Reprendre · ${exercise.name}, ' + 'série ${position.setIndex + 1}/${exercise.setsCount}', + ), + actions: [ + TextButton( + onPressed: () => _resume(session), + child: const Text('Reprendre'), + ), + ], + ); + }, + ), + ListTile( + leading: const Icon(Icons.fitness_center), + title: const Text('Exercices'), + trailing: const Icon(Icons.chevron_right), + onTap: () => Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => ExerciseLibraryScreen( + exerciseUseCases: widget.bootstrap.exerciseUseCases, + mediaUseCases: widget.bootstrap.mediaUseCases, + ), + ), + ), + ), + ListTile( + leading: const Icon(Icons.list_alt), + title: const Text('Programmes'), + trailing: const Icon(Icons.chevron_right), + onTap: () => Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => ProgramListScreen( + programUseCases: widget.bootstrap.programUseCases, + exerciseUseCases: widget.bootstrap.exerciseUseCases, + ), + ), + ), + ), + ListTile( + leading: const Icon(Icons.event_note), + title: const Text('Séances'), + trailing: const Icon(Icons.chevron_right), + onTap: () => Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => WorkoutTemplateListScreen( + workoutTemplateUseCases: + widget.bootstrap.workoutTemplateUseCases, + programUseCases: widget.bootstrap.programUseCases, + activeUseCases: widget.bootstrap.activeWorkoutSessionUseCases, + closeUseCase: widget.bootstrap.closeWorkoutSessionUseCase, + historyUseCases: widget.bootstrap.workoutHistoryUseCases, + ), + ), + ), + ), + ListTile( + leading: const Icon(Icons.history), + title: const Text('Historique'), + trailing: const Icon(Icons.chevron_right), + onTap: () => Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => HistoryListScreen( + historyUseCases: widget.bootstrap.workoutHistoryUseCases, + workoutTemplateUseCases: + widget.bootstrap.workoutTemplateUseCases, + activeUseCases: widget.bootstrap.activeWorkoutSessionUseCases, + closeUseCase: widget.bootstrap.closeWorkoutSessionUseCase, + ), + ), + ), + ), + ], + ), + ); + } + + Future _resume(ActiveWorkoutSession session) async { + await Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => WorkoutExecutionScreen( + initialSession: session, + activeUseCases: widget.bootstrap.activeWorkoutSessionUseCases, + closeUseCase: widget.bootstrap.closeWorkoutSessionUseCase, + historyUseCases: widget.bootstrap.workoutHistoryUseCases, + workoutTemplateUseCases: widget.bootstrap.workoutTemplateUseCases, + ), + ), + ); + if (!mounted) return; + setState(() { + _openSession = widget.bootstrap.activeWorkoutSessionUseCases.findOpen(); + }); + } +} diff --git a/lib/presentation/presentation.dart b/lib/presentation/presentation.dart new file mode 100644 index 0000000..056e35d --- /dev/null +++ b/lib/presentation/presentation.dart @@ -0,0 +1,7 @@ +export 'game_time_app.dart'; +export 'exercise_library_screen.dart'; +export 'history_screen.dart'; +export 'home_screen.dart'; +export 'program_screen.dart'; +export 'workout_execution_screen.dart'; +export 'workout_template_screen.dart'; diff --git a/lib/presentation/program_screen.dart b/lib/presentation/program_screen.dart new file mode 100644 index 0000000..a3b16c7 --- /dev/null +++ b/lib/presentation/program_screen.dart @@ -0,0 +1,772 @@ +import 'package:flutter/material.dart'; + +import '../application/application.dart'; +import '../domain/domain.dart'; +import 'exercise_library_screen.dart'; + +final class ProgramListScreen extends StatefulWidget { + const ProgramListScreen({ + required this.programUseCases, + required this.exerciseUseCases, + super.key, + }); + + final ProgramUseCases programUseCases; + final ExerciseUseCases exerciseUseCases; + + @override + State createState() => _ProgramListScreenState(); +} + +final class _ProgramListScreenState extends State { + late Future> _programs; + + @override + void initState() { + super.initState(); + _programs = widget.programUseCases.listActive(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: const Text('Programmes')), + floatingActionButton: FloatingActionButton.extended( + onPressed: () => _openForm(), + icon: const Icon(Icons.add), + label: const Text('Créer'), + ), + body: FutureBuilder>( + future: _programs, + builder: (context, snapshot) { + if (snapshot.connectionState != ConnectionState.done) { + return const Center(child: CircularProgressIndicator()); + } + if (snapshot.hasError) { + return _CenteredMessage( + title: 'Impossible de charger les programmes', + actionLabel: 'Réessayer', + onAction: _reload, + ); + } + final programs = snapshot.data ?? const []; + if (programs.isEmpty) { + return _CenteredMessage( + title: 'Aucun programme pour le moment', + message: + 'Crée un programme pour organiser tes exercices en séries.', + actionLabel: 'Créer un programme', + onAction: () => _openForm(), + ); + } + return ListView.separated( + itemCount: programs.length, + separatorBuilder: (context, index) => const Divider(height: 1), + itemBuilder: (context, index) { + final program = programs[index]; + return ListTile( + title: Text(program.name), + subtitle: Text(_programSummary(program)), + trailing: const Icon(Icons.chevron_right), + onTap: () => _openForm(program: program), + ); + }, + ); + }, + ), + ); + } + + void _reload() { + setState(() { + _programs = widget.programUseCases.listActive(); + }); + } + + Future _openForm({Program? program}) async { + final changed = await Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => ProgramFormScreen( + programUseCases: widget.programUseCases, + exerciseUseCases: widget.exerciseUseCases, + program: program, + ), + ), + ); + if (changed == true) { + if (!mounted) return; + _reload(); + } + } +} + +final class ProgramFormScreen extends StatefulWidget { + const ProgramFormScreen({ + required this.programUseCases, + required this.exerciseUseCases, + this.program, + super.key, + }); + + final ProgramUseCases programUseCases; + final ExerciseUseCases exerciseUseCases; + final Program? program; + + @override + State createState() => _ProgramFormScreenState(); +} + +final class _ProgramFormScreenState extends State { + final _formKey = GlobalKey(); + late final TextEditingController _nameController; + late final TextEditingController _defaultRestController; + late final List<_ProgramExerciseDraft> _exercises; + var _saving = false; + + bool get _isEditing => widget.program != null; + + int get _defaultRestSeconds { + return int.tryParse(_defaultRestController.text.trim()) ?? 0; + } + + @override + void initState() { + super.initState(); + final program = widget.program; + _nameController = TextEditingController(text: program?.name); + _defaultRestController = TextEditingController( + text: '${program?.defaultRestSeconds ?? 60}', + ); + _exercises = [ + for (final exercise in program?.exercises ?? const []) + _ProgramExerciseDraft.fromProgramExercise(exercise), + ]; + } + + @override + void dispose() { + _nameController.dispose(); + _defaultRestController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text( + _isEditing ? 'Modifier le programme' : 'Créer un programme', + ), + ), + bottomNavigationBar: SafeArea( + minimum: const EdgeInsets.all(16), + child: FilledButton.icon( + onPressed: _saving ? null : _save, + icon: _saving + ? const SizedBox.square( + dimension: 18, + child: CircularProgressIndicator(strokeWidth: 2), + ) + : const Icon(Icons.check), + label: const Text('Enregistrer'), + ), + ), + body: Column( + children: [ + Padding( + padding: const EdgeInsets.all(16), + child: Form( + key: _formKey, + child: Column( + children: [ + TextFormField( + controller: _nameController, + decoration: const InputDecoration( + labelText: 'Nom', + border: OutlineInputBorder(), + ), + validator: (value) => value == null || value.trim().isEmpty + ? 'Le nom est obligatoire.' + : null, + ), + const SizedBox(height: 12), + TextFormField( + controller: _defaultRestController, + decoration: const InputDecoration( + labelText: 'Repos par défaut (s)', + border: OutlineInputBorder(), + ), + keyboardType: TextInputType.number, + validator: _nonNegativeIntValidator, + onChanged: (_) => setState(() {}), + ), + const SizedBox(height: 12), + SizedBox( + width: double.infinity, + child: OutlinedButton.icon( + onPressed: _addExercise, + icon: const Icon(Icons.add), + label: const Text('Ajouter un exercice'), + ), + ), + ], + ), + ), + ), + Expanded( + child: _exercises.isEmpty + ? const _CenteredMessage( + title: 'Aucun exercice ajouté', + message: 'Ajoute un exercice depuis la bibliothèque.', + ) + : ReorderableListView.builder( + buildDefaultDragHandles: false, + padding: const EdgeInsets.fromLTRB(16, 0, 16, 16), + itemCount: _exercises.length, + onReorder: _reorderExercise, + itemBuilder: (context, index) { + final exercise = _exercises[index]; + return _ProgramExerciseCard( + key: ValueKey(exercise.key), + draft: exercise, + defaultRestSeconds: _defaultRestSeconds, + onChanged: () => setState(() {}), + index: index, + ); + }, + ), + ), + ], + ), + ); + } + + Future _addExercise() async { + final exercise = await Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => + ExerciseSelectionScreen(exerciseUseCases: widget.exerciseUseCases), + ), + ); + if (exercise == null) return; + if (!mounted) return; + setState(() { + _exercises.add(_ProgramExerciseDraft.fromExercise(exercise)); + }); + } + + void _reorderExercise(int oldIndex, int newIndex) { + setState(() { + if (newIndex > oldIndex) { + newIndex -= 1; + } + final item = _exercises.removeAt(oldIndex); + _exercises.insert(newIndex, item); + }); + } + + Future _save() async { + if (!_formKey.currentState!.validate()) { + return; + } + setState(() => _saving = true); + try { + await widget.programUseCases.saveConfigured( + id: widget.program?.metadata.id, + name: _nameController.text.trim(), + defaultRestSeconds: _defaultRestSeconds, + exercises: _exercises.map((exercise) => exercise.toConfig()).toList(), + ); + if (mounted) { + Navigator.of(context).pop(true); + } + } on Exception catch (error) { + _showSnackBar(error.toString()); + } finally { + if (mounted) { + setState(() => _saving = false); + } + } + } + + String? _nonNegativeIntValidator(String? value) { + final number = int.tryParse(value?.trim() ?? ''); + if (number == null || number < 0) { + return 'Saisis un nombre positif.'; + } + return null; + } + + void _showSnackBar(String message) { + if (!mounted) return; + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text(message))); + } +} + +final class ExerciseSelectionScreen extends StatefulWidget { + const ExerciseSelectionScreen({required this.exerciseUseCases, super.key}); + + final ExerciseUseCases exerciseUseCases; + + @override + State createState() => + _ExerciseSelectionScreenState(); +} + +final class _ExerciseSelectionScreenState + extends State { + final _searchController = TextEditingController(); + var _selectedMeasures = {}; + late Future> _exercises; + + @override + void initState() { + super.initState(); + _exercises = widget.exerciseUseCases.listActive(); + _searchController.addListener(() => setState(() {})); + } + + @override + void dispose() { + _searchController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: const Text('Ajouter un exercice')), + body: FutureBuilder>( + future: _exercises, + builder: (context, snapshot) { + if (snapshot.connectionState != ConnectionState.done) { + return const Center(child: CircularProgressIndicator()); + } + final exercises = _filter(snapshot.data ?? const []); + return ListView( + children: [ + Padding( + padding: const EdgeInsets.all(16), + child: Column( + children: [ + TextField( + controller: _searchController, + decoration: const InputDecoration( + labelText: 'Rechercher', + prefixIcon: Icon(Icons.search), + border: OutlineInputBorder(), + ), + ), + const SizedBox(height: 12), + Wrap( + spacing: 8, + runSpacing: 8, + children: WorkoutMeasure.values.map((measure) { + return FilterChip( + label: Text(_measureLabel(measure)), + selected: _selectedMeasures.contains(measure), + onSelected: (selected) { + setState(() { + if (selected) { + _selectedMeasures = { + ..._selectedMeasures, + measure, + }; + } else { + _selectedMeasures = {..._selectedMeasures} + ..remove(measure); + } + }); + }, + ); + }).toList(), + ), + ], + ), + ), + if (exercises.isEmpty) + const _CenteredMessage( + title: 'Aucun exercice disponible', + message: 'Crée un exercice dans la bibliothèque.', + ) + else + for (final exercise in exercises) + ExerciseListTile( + exercise: exercise, + onTap: () => Navigator.of(context).pop(exercise), + ), + ], + ); + }, + ), + ); + } + + List _filter(List exercises) { + final query = _searchController.text.trim().toLowerCase(); + return exercises.where((exercise) { + final matchesQuery = + query.isEmpty || + exercise.name.toLowerCase().contains(query) || + (exercise.description?.toLowerCase().contains(query) ?? false); + final matchesMeasures = + _selectedMeasures.isEmpty || + _selectedMeasures.every(exercise.availableMeasures.contains); + return matchesQuery && matchesMeasures; + }).toList(); + } +} + +final class _ProgramExerciseCard extends StatelessWidget { + const _ProgramExerciseCard({ + required this.draft, + required this.defaultRestSeconds, + required this.onChanged, + required this.index, + super.key, + }); + + final _ProgramExerciseDraft draft; + final int defaultRestSeconds; + final VoidCallback onChanged; + final int index; + + @override + Widget build(BuildContext context) { + final scoreUnit = draft.scoreUnitSnapshot; + return Card( + margin: const EdgeInsets.only(bottom: 12), + child: Padding( + padding: const EdgeInsets.all(12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + ReorderableDragStartListener( + index: index, + child: const Padding( + padding: EdgeInsets.only(right: 8), + child: Icon(Icons.drag_handle), + ), + ), + Expanded( + child: Text( + draft.exerciseNameSnapshot, + style: Theme.of(context).textTheme.titleMedium, + ), + ), + if (draft.exerciseArchivedSnapshot) + const Chip(label: Text('Exercice archivé')), + ], + ), + const SizedBox(height: 4), + Text(_exerciseSummary(draft, defaultRestSeconds)), + const SizedBox(height: 12), + TextFormField( + initialValue: '${draft.setsCount}', + decoration: const InputDecoration( + labelText: 'Nombre de séries', + border: OutlineInputBorder(), + ), + keyboardType: TextInputType.number, + onChanged: (value) { + draft.setsCount = int.tryParse(value) ?? draft.setsCount; + onChanged(); + }, + ), + const SizedBox(height: 12), + Text( + 'Mesures à suivre', + style: Theme.of(context).textTheme.titleSmall, + ), + if (draft.availableTimeSnapshot) + CheckboxListTile( + contentPadding: EdgeInsets.zero, + title: const Text('Temps'), + value: draft.enabledMeasures.contains(WorkoutMeasure.time), + onChanged: (value) => _toggle(WorkoutMeasure.time, value), + ), + if (draft.availableRepsSnapshot) + CheckboxListTile( + contentPadding: EdgeInsets.zero, + title: const Text('Répétitions'), + value: draft.enabledMeasures.contains(WorkoutMeasure.reps), + onChanged: (value) => _toggle(WorkoutMeasure.reps, value), + ), + if (draft.availableScoreSnapshot) + CheckboxListTile( + contentPadding: EdgeInsets.zero, + title: Text(scoreUnit == null ? 'Score' : 'Score ($scoreUnit)'), + value: draft.enabledMeasures.contains(WorkoutMeasure.score), + onChanged: (value) => _toggle(WorkoutMeasure.score, value), + ), + if (draft.enabledMeasures.contains(WorkoutMeasure.time)) + _NumberField( + label: 'Cible temps (s)', + initialValue: draft.targetTimeSeconds, + onChanged: (value) => draft.targetTimeSeconds = value?.round(), + ), + if (draft.enabledMeasures.contains(WorkoutMeasure.reps)) + _NumberField( + label: 'Cible répétitions', + initialValue: draft.targetReps, + onChanged: (value) => draft.targetReps = value?.round(), + ), + if (draft.enabledMeasures.contains(WorkoutMeasure.score)) + _NumberField( + label: scoreUnit == null + ? 'Cible score' + : 'Cible score ($scoreUnit)', + initialValue: draft.targetScore, + onChanged: (value) => draft.targetScore = value, + ), + const SizedBox(height: 12), + TextFormField( + initialValue: + '${draft.restSecondsOverride ?? defaultRestSeconds}', + decoration: const InputDecoration( + labelText: 'Repos après chaque série (s)', + helperText: 'Pas de repos après la toute dernière série.', + border: OutlineInputBorder(), + ), + keyboardType: TextInputType.number, + onChanged: (value) { + draft.restSecondsOverride = int.tryParse(value); + onChanged(); + }, + ), + ], + ), + ), + ); + } + + void _toggle(WorkoutMeasure measure, bool? value) { + if (value == true) { + draft.enabledMeasures = {...draft.enabledMeasures, measure}; + } else if (draft.enabledMeasures.length > 1) { + draft.enabledMeasures = {...draft.enabledMeasures}..remove(measure); + } + onChanged(); + } +} + +final class _NumberField extends StatelessWidget { + const _NumberField({ + required this.label, + required this.initialValue, + required this.onChanged, + }); + + final String label; + final num? initialValue; + final ValueChanged onChanged; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.only(top: 8), + child: TextFormField( + initialValue: initialValue?.toString(), + decoration: InputDecoration( + labelText: label, + border: const OutlineInputBorder(), + ), + keyboardType: TextInputType.number, + onChanged: (value) => onChanged(double.tryParse(value)), + ), + ); + } +} + +final class _ProgramExerciseDraft { + _ProgramExerciseDraft({ + required this.key, + this.existingMetadata, + this.sourceExerciseId, + required this.exerciseNameSnapshot, + this.exerciseDescriptionSnapshot, + this.exerciseImageMediaIdSnapshot, + this.exerciseVideoMediaIdSnapshot, + this.exerciseArchivedSnapshot = false, + required this.availableTimeSnapshot, + required this.availableRepsSnapshot, + required this.availableScoreSnapshot, + this.scoreLabelSnapshot, + this.scoreUnitSnapshot, + required this.setsCount, + required this.enabledMeasures, + this.targetTimeSeconds, + this.targetReps, + this.targetScore, + this.restSecondsOverride, + }); + + factory _ProgramExerciseDraft.fromExercise(Exercise exercise) { + return _ProgramExerciseDraft( + key: UniqueKey().toString(), + sourceExerciseId: exercise.metadata.id, + exerciseNameSnapshot: exercise.name, + exerciseDescriptionSnapshot: exercise.description, + exerciseImageMediaIdSnapshot: exercise.imageMediaId, + exerciseVideoMediaIdSnapshot: exercise.videoMediaId, + exerciseArchivedSnapshot: exercise.archivedAt != null, + availableTimeSnapshot: exercise.hasTimeMeasure, + availableRepsSnapshot: exercise.hasRepsMeasure, + availableScoreSnapshot: exercise.hasScoreMeasure, + scoreLabelSnapshot: exercise.scoreLabel, + scoreUnitSnapshot: exercise.scoreUnit, + setsCount: 3, + enabledMeasures: exercise.availableMeasures, + ); + } + + factory _ProgramExerciseDraft.fromProgramExercise(ProgramExercise exercise) { + return _ProgramExerciseDraft( + key: exercise.metadata.id, + existingMetadata: exercise.metadata, + sourceExerciseId: exercise.sourceExerciseId, + exerciseNameSnapshot: exercise.exerciseNameSnapshot, + exerciseDescriptionSnapshot: exercise.exerciseDescriptionSnapshot, + exerciseImageMediaIdSnapshot: exercise.exerciseImageMediaIdSnapshot, + exerciseVideoMediaIdSnapshot: exercise.exerciseVideoMediaIdSnapshot, + exerciseArchivedSnapshot: exercise.exerciseArchivedSnapshot, + availableTimeSnapshot: exercise.availableTimeSnapshot, + availableRepsSnapshot: exercise.availableRepsSnapshot, + availableScoreSnapshot: exercise.availableScoreSnapshot, + scoreLabelSnapshot: exercise.scoreLabelSnapshot, + scoreUnitSnapshot: exercise.scoreUnitSnapshot, + setsCount: exercise.setsCount, + enabledMeasures: { + if (exercise.timeEnabled) WorkoutMeasure.time, + if (exercise.repsEnabled) WorkoutMeasure.reps, + if (exercise.scoreEnabled) WorkoutMeasure.score, + }, + targetTimeSeconds: exercise.targetTimeSeconds, + targetReps: exercise.targetReps, + targetScore: exercise.targetScore, + restSecondsOverride: exercise.restSecondsOverride, + ); + } + + final String key; + final EntityMetadata? existingMetadata; + final String? sourceExerciseId; + final String exerciseNameSnapshot; + final String? exerciseDescriptionSnapshot; + final String? exerciseImageMediaIdSnapshot; + final String? exerciseVideoMediaIdSnapshot; + final bool exerciseArchivedSnapshot; + final bool availableTimeSnapshot; + final bool availableRepsSnapshot; + final bool availableScoreSnapshot; + final String? scoreLabelSnapshot; + final String? scoreUnitSnapshot; + int setsCount; + Set enabledMeasures; + int? targetTimeSeconds; + int? targetReps; + double? targetScore; + int? restSecondsOverride; + + ProgramExerciseConfig toConfig() { + return ProgramExerciseConfig( + existingMetadata: existingMetadata, + sourceExerciseId: sourceExerciseId, + exerciseNameSnapshot: exerciseNameSnapshot, + exerciseDescriptionSnapshot: exerciseDescriptionSnapshot, + exerciseImageMediaIdSnapshot: exerciseImageMediaIdSnapshot, + exerciseVideoMediaIdSnapshot: exerciseVideoMediaIdSnapshot, + exerciseArchivedSnapshot: exerciseArchivedSnapshot, + availableTimeSnapshot: availableTimeSnapshot, + availableRepsSnapshot: availableRepsSnapshot, + availableScoreSnapshot: availableScoreSnapshot, + scoreLabelSnapshot: scoreLabelSnapshot, + scoreUnitSnapshot: scoreUnitSnapshot, + setsCount: setsCount, + enabledMeasures: enabledMeasures, + targetTimeSeconds: targetTimeSeconds, + targetReps: targetReps, + targetScore: targetScore, + restSecondsOverride: restSecondsOverride, + ); + } +} + +String _programSummary(Program program) { + final exerciseCount = program.exercises.length; + final setsCount = program.exercises.fold( + 0, + (total, exercise) => total + exercise.setsCount, + ); + return '$exerciseCount exercice${exerciseCount > 1 ? 's' : ''} · ' + '$setsCount série${setsCount > 1 ? 's' : ''}'; +} + +String _exerciseSummary(_ProgramExerciseDraft draft, int defaultRestSeconds) { + final measures = draft.enabledMeasures + .map((measure) { + final unit = draft.scoreUnitSnapshot?.trim(); + if (measure == WorkoutMeasure.score && + unit != null && + unit.isNotEmpty) { + return 'Score ($unit)'; + } + return _measureLabel(measure); + }) + .join(' + '); + final rest = draft.restSecondsOverride ?? defaultRestSeconds; + return '${draft.setsCount} séries · $measures · Repos $rest s'; +} + +String _measureLabel(WorkoutMeasure measure) { + return switch (measure) { + WorkoutMeasure.time => 'Temps', + WorkoutMeasure.reps => 'Répétitions', + WorkoutMeasure.score => 'Score', + }; +} + +final class _CenteredMessage extends StatelessWidget { + const _CenteredMessage({ + required this.title, + this.message, + this.actionLabel, + this.onAction, + }); + + final String title; + final String? message; + final String? actionLabel; + final VoidCallback? onAction; + + @override + Widget build(BuildContext context) { + return Center( + child: Padding( + padding: const EdgeInsets.all(24), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + title, + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.titleMedium, + ), + if (message != null) ...[ + const SizedBox(height: 8), + Text(message!, textAlign: TextAlign.center), + ], + if (actionLabel != null && onAction != null) ...[ + const SizedBox(height: 16), + FilledButton(onPressed: onAction, child: Text(actionLabel!)), + ], + ], + ), + ), + ); + } +} diff --git a/lib/presentation/workout_execution_screen.dart b/lib/presentation/workout_execution_screen.dart new file mode 100644 index 0000000..ef73d91 --- /dev/null +++ b/lib/presentation/workout_execution_screen.dart @@ -0,0 +1,726 @@ +import 'dart:async'; +import 'dart:convert'; + +import 'package:flutter/material.dart'; + +import '../application/application.dart'; +import '../domain/domain.dart'; +import 'history_screen.dart'; + +enum WorkoutExecutionMode { active, rest, paused, finished } + +final class WorkoutExecutionScreen extends StatefulWidget { + const WorkoutExecutionScreen({ + required this.initialSession, + required this.activeUseCases, + required this.closeUseCase, + required this.historyUseCases, + required this.workoutTemplateUseCases, + super.key, + }); + + final ActiveWorkoutSession initialSession; + final ActiveWorkoutSessionUseCases activeUseCases; + final CloseWorkoutSessionUseCase closeUseCase; + final WorkoutHistoryUseCases historyUseCases; + final WorkoutTemplateUseCases workoutTemplateUseCases; + + @override + State createState() => _WorkoutExecutionScreenState(); +} + +final class _WorkoutExecutionScreenState extends State { + late ActiveWorkoutSession _session; + late final WorkoutExecutionPlan _plan; + late WorkoutExecutionMode _mode; + Timer? _ticker; + Timer? _restTicker; + WorkoutHistory? _completedHistory; + var _reps = 0; + final _scoreController = TextEditingController(); + var _remainingRestSeconds = 0; + + ExecutionPosition get _position => ExecutionPosition( + programIndex: _session.currentProgramIndex, + exerciseIndex: _session.currentExerciseIndex, + setIndex: _session.currentSetIndex, + ); + + ExecutionExercise get _exercise => _plan.exerciseAt(_position); + + @override + void initState() { + super.initState(); + _session = widget.initialSession; + _plan = WorkoutExecutionPlan.fromSession(_session); + _mode = _session.status == ActiveWorkoutStatus.running + ? WorkoutExecutionMode.active + : WorkoutExecutionMode.paused; + _ticker = Timer.periodic(const Duration(seconds: 1), (_) { + if (mounted) setState(() {}); + }); + } + + @override + void dispose() { + _ticker?.cancel(); + _restTicker?.cancel(); + _scoreController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return PopScope( + canPop: false, + child: Scaffold( + appBar: AppBar( + title: Text(_plan.name), + actions: [TextButton(onPressed: _pause, child: const Text('Pause'))], + ), + body: switch (_mode) { + WorkoutExecutionMode.active => _buildActive(), + WorkoutExecutionMode.rest => _buildRest(), + WorkoutExecutionMode.paused => _buildPaused(), + WorkoutExecutionMode.finished => _buildFinished(), + }, + ), + ); + } + + Widget _buildActive() { + return ListView( + padding: const EdgeInsets.all(16), + children: [ + _Header( + elapsedLabel: _formatDuration( + Duration( + milliseconds: widget.activeUseCases.elapsedActiveMilliseconds( + _session, + ), + ), + ), + progressLabel: _plan.progressLabel(_position), + ), + const SizedBox(height: 24), + Text(_exercise.name, style: Theme.of(context).textTheme.headlineMedium), + const SizedBox(height: 16), + SetMeasureInput( + exercise: _exercise, + reps: _reps, + scoreController: _scoreController, + onRepsChanged: (value) => setState(() => _reps = value), + ), + const SizedBox(height: 24), + FilledButton( + onPressed: () => _finishSet(skipped: false), + style: FilledButton.styleFrom(minimumSize: const Size.fromHeight(56)), + child: const Text('Terminer la série'), + ), + const SizedBox(height: 12), + OutlinedButton( + onPressed: () => _finishSet(skipped: true), + style: OutlinedButton.styleFrom( + minimumSize: const Size.fromHeight(52), + ), + child: const Text('Passer'), + ), + ], + ); + } + + Widget _buildRest() { + final next = _plan.nextPosition(_position); + final nextExercise = next == null ? null : _plan.exerciseAt(next); + return Padding( + padding: const EdgeInsets.all(24), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const Text('Repos avant la prochaine série'), + const SizedBox(height: 24), + Center( + child: Text( + _formatDuration(Duration(seconds: _remainingRestSeconds)), + style: Theme.of(context).textTheme.displayLarge, + ), + ), + if (next != null && nextExercise != null) ...[ + const SizedBox(height: 24), + Text( + 'Ensuite : ${nextExercise.name} · ' + 'Série ${next.setIndex + 1}/${nextExercise.setsCount}', + textAlign: TextAlign.center, + ), + ], + const Spacer(), + Row( + children: [ + Expanded( + child: OutlinedButton( + onPressed: () => setState(() { + _remainingRestSeconds = (_remainingRestSeconds - 15) + .clamp(0, 9999) + .toInt(); + }), + child: const Text('-15 s'), + ), + ), + const SizedBox(width: 12), + Expanded( + child: OutlinedButton( + onPressed: () => setState(() { + _remainingRestSeconds += 15; + }), + child: const Text('+15 s'), + ), + ), + ], + ), + const SizedBox(height: 12), + FilledButton( + onPressed: _skipRest, + style: FilledButton.styleFrom( + minimumSize: const Size.fromHeight(52), + ), + child: const Text('Ignorer le repos'), + ), + const SizedBox(height: 12), + TextButton(onPressed: _pause, child: const Text('Pause')), + ], + ), + ); + } + + Widget _buildPaused() { + return Padding( + padding: const EdgeInsets.all(24), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Text('Pause', style: Theme.of(context).textTheme.headlineMedium), + const SizedBox(height: 24), + FilledButton( + onPressed: _resume, + style: FilledButton.styleFrom( + minimumSize: const Size.fromHeight(56), + ), + child: const Text('Reprendre'), + ), + const SizedBox(height: 12), + OutlinedButton( + onPressed: _quitAndSave, + child: const Text('Quitter et sauvegarder'), + ), + const Spacer(), + TextButton( + onPressed: _confirmAbandon, + child: const Text('Abandonner la séance'), + ), + ], + ), + ); + } + + Widget _buildFinished() { + final elapsed = Duration( + milliseconds: widget.activeUseCases.elapsedActiveMilliseconds(_session), + ); + return Padding( + padding: const EdgeInsets.all(24), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Text( + 'Séance terminée', + style: Theme.of(context).textTheme.headlineMedium, + ), + const SizedBox(height: 12), + Text('Temps total : ${_formatDuration(elapsed)}'), + const SizedBox(height: 24), + OutlinedButton( + onPressed: _completedHistory == null ? null : _openHistoryDetail, + child: const Text('Voir le détail'), + ), + OutlinedButton( + onPressed: _completedHistory == null ? null : _restartCompleted, + child: const Text('Relancer cette séance'), + ), + FilledButton( + onPressed: () { + Navigator.of(context).popUntil((route) => route.isFirst); + }, + child: const Text('Retour à l’accueil'), + ), + ], + ), + ); + } + + Future _pause() async { + _restTicker?.cancel(); + _session = await widget.activeUseCases.pause(_session.metadata.id); + if (!mounted) return; + setState(() => _mode = WorkoutExecutionMode.paused); + } + + Future _resume() async { + _session = await widget.activeUseCases.resume(_session.metadata.id); + if (!mounted) return; + setState(() => _mode = WorkoutExecutionMode.active); + } + + Future _quitAndSave() async { + await widget.activeUseCases.quitAndSave(_session.metadata.id); + if (!mounted) return; + Navigator.of(context).popUntil((route) => route.isFirst); + } + + Future _confirmAbandon() async { + final confirmed = await showDialog( + context: context, + builder: (context) => AlertDialog( + title: const Text('Abandonner la séance ?'), + content: const Text('Cette action est définitive.'), + actions: [ + TextButton( + onPressed: () => Navigator.of(context).pop(false), + child: const Text('Annuler'), + ), + FilledButton( + onPressed: () => Navigator.of(context).pop(true), + child: const Text('Abandonner'), + ), + ], + ), + ); + if (confirmed != true) return; + await widget.activeUseCases.abandon(_session.metadata.id); + if (!mounted) return; + Navigator.of(context).popUntil((route) => route.isFirst); + } + + Future _finishSet({required bool skipped}) async { + final score = double.tryParse(_scoreController.text.trim()); + await widget.activeUseCases.recordCurrentSetResult( + sessionId: _session.metadata.id, + programSnapshotId: _plan.programAt(_position).id, + exerciseSnapshotId: _exercise.id, + programIndex: _position.programIndex, + exerciseIndex: _position.exerciseIndex, + setIndex: _position.setIndex, + actualReps: skipped ? null : (_exercise.repsEnabled ? _reps : null), + actualScore: skipped ? null : (_exercise.scoreEnabled ? score : null), + scoreUnitSnapshot: _exercise.scoreUnit, + actualTimeMs: skipped ? null : (_exercise.timeEnabled ? 0 : null), + ); + + final next = _plan.nextPosition(_position); + if (next == null) { + await _complete(); + return; + } + final shouldRest = _plan.shouldShowRestAfter(_position); + if (shouldRest) { + await widget.activeUseCases.startRestAfterSet( + sessionId: _session.metadata.id, + afterProgramIndex: _position.programIndex, + afterExerciseIndex: _position.exerciseIndex, + afterSetIndex: _position.setIndex, + plannedRestSeconds: _exercise.restSeconds, + ); + if (!mounted) return; + _remainingRestSeconds = _exercise.restSeconds; + _startRestTicker(next); + setState(() => _mode = WorkoutExecutionMode.rest); + return; + } + await _moveTo(next); + } + + void _startRestTicker(ExecutionPosition next) { + _restTicker?.cancel(); + _restTicker = Timer.periodic(const Duration(seconds: 1), (timer) { + if (!mounted) return; + if (_remainingRestSeconds <= 1) { + timer.cancel(); + unawaited(_moveTo(next)); + } else { + setState(() => _remainingRestSeconds -= 1); + } + }); + } + + Future _skipRest() async { + _restTicker?.cancel(); + final next = _plan.nextPosition(_position); + if (next == null) { + await _complete(); + return; + } + await _moveTo(next); + } + + Future _moveTo(ExecutionPosition position) async { + _scoreController.clear(); + _reps = 0; + _session = await widget.activeUseCases.updateProgress( + sessionId: _session.metadata.id, + programIndex: position.programIndex, + exerciseIndex: position.exerciseIndex, + setIndex: position.setIndex, + ); + if (!mounted) return; + setState(() => _mode = WorkoutExecutionMode.active); + } + + Future _complete() async { + _session = await widget.activeUseCases.complete(_session.metadata.id); + _completedHistory = await widget.closeUseCase.close( + sessionId: _session.metadata.id, + nameSnapshot: _plan.name, + completed: true, + ); + if (!mounted) return; + setState(() => _mode = WorkoutExecutionMode.finished); + } + + Future _openHistoryDetail() async { + final history = _completedHistory; + if (history == null) return; + await Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => HistoryDetailScreen( + history: history, + historyUseCases: widget.historyUseCases, + workoutTemplateUseCases: widget.workoutTemplateUseCases, + activeUseCases: widget.activeUseCases, + closeUseCase: widget.closeUseCase, + ), + ), + ); + } + + Future _restartCompleted() async { + final history = _completedHistory; + if (history == null) return; + ActiveWorkoutSession session; + final sourceId = history.sourceWorkoutTemplateId; + if (sourceId != null && + await widget.workoutTemplateUseCases.findById(sourceId) != null) { + session = await widget.activeUseCases.startFromTemplate(sourceId); + } else { + if (mounted) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text( + "La séance originale n'existe plus. Une copie va être utilisée.", + ), + ), + ); + } + session = await widget.activeUseCases.startFromHistory(history); + } + if (!mounted) return; + await Navigator.of(context).pushReplacement( + MaterialPageRoute( + builder: (context) => WorkoutExecutionScreen( + initialSession: session, + activeUseCases: widget.activeUseCases, + closeUseCase: widget.closeUseCase, + historyUseCases: widget.historyUseCases, + workoutTemplateUseCases: widget.workoutTemplateUseCases, + ), + ), + ); + } +} + +final class SetMeasureInput extends StatelessWidget { + const SetMeasureInput({ + required this.exercise, + required this.reps, + required this.scoreController, + required this.onRepsChanged, + super.key, + }); + + final ExecutionExercise exercise; + final int reps; + final TextEditingController scoreController; + final ValueChanged onRepsChanged; + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + if (exercise.timeEnabled) + Card( + child: Padding( + padding: const EdgeInsets.all(24), + child: Column( + children: [ + const Text('Temps'), + const SizedBox(height: 8), + Text( + exercise.targetTimeSeconds == null + ? 'Chronométrer' + : '${exercise.targetTimeSeconds} s', + style: Theme.of(context).textTheme.displaySmall, + ), + ], + ), + ), + ), + if (exercise.repsEnabled) ...[ + const SizedBox(height: 12), + Row( + children: [ + const Expanded(child: Text('Répétitions')), + IconButton( + onPressed: () => + onRepsChanged((reps - 1).clamp(0, 999).toInt()), + icon: const Icon(Icons.remove), + ), + Text('$reps'), + IconButton( + onPressed: () => onRepsChanged(reps + 1), + icon: const Icon(Icons.add), + ), + ], + ), + ], + if (exercise.scoreEnabled) ...[ + const SizedBox(height: 12), + TextField( + controller: scoreController, + decoration: InputDecoration( + labelText: exercise.scoreUnit == null + ? 'Score' + : 'Score (${exercise.scoreUnit})', + border: const OutlineInputBorder(), + ), + keyboardType: TextInputType.number, + ), + ], + ], + ); + } +} + +final class WorkoutExecutionPlan { + const WorkoutExecutionPlan({required this.name, required this.programs}); + + factory WorkoutExecutionPlan.fromSession(ActiveWorkoutSession session) { + final snapshot = + jsonDecode(session.resolvedTemplateSnapshotJson) + as Map; + final overrides = snapshot['overrides'] as List? ?? const []; + final programs = (snapshot['programs'] as List? ?? const []).map(( + rawProgram, + ) { + final program = rawProgram as Map; + final programSnapshot = + jsonDecode(program['programSnapshotJson'] as String) + as Map; + return ExecutionProgram.fromSnapshot( + id: program['id'] as String, + name: program['programNameSnapshot'] as String, + snapshot: programSnapshot, + overrides: overrides, + ); + }).toList(); + return WorkoutExecutionPlan( + name: snapshot['name'] as String? ?? 'Séance', + programs: programs, + ); + } + + final String name; + final List programs; + + ExecutionProgram programAt(ExecutionPosition position) { + return programs[position.programIndex]; + } + + ExecutionExercise exerciseAt(ExecutionPosition position) { + return programAt(position).exercises[position.exerciseIndex]; + } + + ExecutionPosition? nextPosition(ExecutionPosition position) { + final exercise = exerciseAt(position); + if (position.setIndex + 1 < exercise.setsCount) { + return position.copyWith(setIndex: position.setIndex + 1); + } + final program = programAt(position); + if (position.exerciseIndex + 1 < program.exercises.length) { + return ExecutionPosition( + programIndex: position.programIndex, + exerciseIndex: position.exerciseIndex + 1, + setIndex: 0, + ); + } + if (position.programIndex + 1 < programs.length) { + return ExecutionPosition( + programIndex: position.programIndex + 1, + exerciseIndex: 0, + setIndex: 0, + ); + } + return null; + } + + bool shouldShowRestAfter(ExecutionPosition position) { + return nextPosition(position) != null && + exerciseAt(position).restSeconds > 0; + } + + String progressLabel(ExecutionPosition position) { + final program = programAt(position); + final exercise = exerciseAt(position); + return 'Programme ${position.programIndex + 1}/${programs.length} · ' + 'Exercice ${position.exerciseIndex + 1}/${program.exercises.length} · ' + 'Série ${position.setIndex + 1}/${exercise.setsCount}'; + } +} + +final class ExecutionProgram { + const ExecutionProgram({ + required this.id, + required this.name, + required this.exercises, + }); + + factory ExecutionProgram.fromSnapshot({ + required String id, + required String name, + required Map snapshot, + required List overrides, + }) { + final exercises = (snapshot['exercises'] as List? ?? const []).map( + (raw) { + final exercise = raw as Map; + Map? override; + for (final rawOverride in overrides) { + final item = rawOverride as Map; + if (item['workoutTemplateProgramId'] == id && + item['snapshotProgramExerciseId'] == exercise['id']) { + override = item; + break; + } + } + return ExecutionExercise.fromSnapshot(exercise, override); + }, + ).toList(); + return ExecutionProgram(id: id, name: name, exercises: exercises); + } + + final String id; + final String name; + final List exercises; +} + +final class ExecutionExercise { + const ExecutionExercise({ + required this.id, + required this.name, + required this.setsCount, + required this.timeEnabled, + required this.repsEnabled, + required this.scoreEnabled, + required this.restSeconds, + this.targetTimeSeconds, + this.targetReps, + this.targetScore, + this.scoreUnit, + }); + + factory ExecutionExercise.fromSnapshot( + Map exercise, + Map? override, + ) { + return ExecutionExercise( + id: exercise['id'] as String, + name: exercise['exerciseNameSnapshot'] as String, + setsCount: + (override?['setsCountOverride'] as int?) ?? + (exercise['setsCount'] as int), + timeEnabled: exercise['timeEnabled'] as bool, + repsEnabled: exercise['repsEnabled'] as bool, + scoreEnabled: exercise['scoreEnabled'] as bool, + restSeconds: exercise['restSecondsOverride'] as int? ?? 0, + targetTimeSeconds: + (override?['targetTimeSecondsOverride'] as int?) ?? + (exercise['targetTimeSeconds'] as int?), + targetReps: + (override?['targetRepsOverride'] as int?) ?? + (exercise['targetReps'] as int?), + targetScore: + (override?['targetScoreOverride'] as num?)?.toDouble() ?? + (exercise['targetScore'] as num?)?.toDouble(), + scoreUnit: exercise['scoreUnitSnapshot'] as String?, + ); + } + + final String id; + final String name; + final int setsCount; + final bool timeEnabled; + final bool repsEnabled; + final bool scoreEnabled; + final int restSeconds; + final int? targetTimeSeconds; + final int? targetReps; + final double? targetScore; + final String? scoreUnit; +} + +final class ExecutionPosition { + const ExecutionPosition({ + required this.programIndex, + required this.exerciseIndex, + required this.setIndex, + }); + + final int programIndex; + final int exerciseIndex; + final int setIndex; + + ExecutionPosition copyWith({int? setIndex}) { + return ExecutionPosition( + programIndex: programIndex, + exerciseIndex: exerciseIndex, + setIndex: setIndex ?? this.setIndex, + ); + } +} + +final class _Header extends StatelessWidget { + const _Header({required this.elapsedLabel, required this.progressLabel}); + + final String elapsedLabel; + final String progressLabel; + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(elapsedLabel, style: Theme.of(context).textTheme.headlineSmall), + const SizedBox(height: 4), + Text(progressLabel), + ], + ); + } +} + +String _formatDuration(Duration duration) { + final minutes = duration.inMinutes.remainder(60).toString().padLeft(2, '0'); + final seconds = duration.inSeconds.remainder(60).toString().padLeft(2, '0'); + final hours = duration.inHours; + if (hours > 0) { + return '$hours:$minutes:$seconds'; + } + return '$minutes:$seconds'; +} diff --git a/lib/presentation/workout_template_screen.dart b/lib/presentation/workout_template_screen.dart new file mode 100644 index 0000000..f71490c --- /dev/null +++ b/lib/presentation/workout_template_screen.dart @@ -0,0 +1,750 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; + +import '../application/application.dart'; +import '../domain/domain.dart'; +import 'workout_execution_screen.dart'; + +final class WorkoutTemplateListScreen extends StatefulWidget { + const WorkoutTemplateListScreen({ + required this.workoutTemplateUseCases, + required this.programUseCases, + required this.activeUseCases, + required this.closeUseCase, + required this.historyUseCases, + super.key, + }); + + final WorkoutTemplateUseCases workoutTemplateUseCases; + final ProgramUseCases programUseCases; + final ActiveWorkoutSessionUseCases activeUseCases; + final CloseWorkoutSessionUseCase closeUseCase; + final WorkoutHistoryUseCases historyUseCases; + + @override + State createState() => + _WorkoutTemplateListScreenState(); +} + +final class _WorkoutTemplateListScreenState + extends State { + late Future> _templates; + + @override + void initState() { + super.initState(); + _templates = widget.workoutTemplateUseCases.listActive(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: const Text('Séances')), + floatingActionButton: FloatingActionButton.extended( + onPressed: () => _openForm(), + icon: const Icon(Icons.add), + label: const Text('Créer'), + ), + body: FutureBuilder>( + future: _templates, + builder: (context, snapshot) { + if (snapshot.connectionState != ConnectionState.done) { + return const Center(child: CircularProgressIndicator()); + } + final templates = snapshot.data ?? const []; + if (templates.isEmpty) { + return _CenteredMessage( + title: 'Aucune séance pour le moment', + message: 'Compose une séance à partir de tes programmes.', + actionLabel: 'Créer une séance', + onAction: () => _openForm(), + ); + } + return ListView.separated( + itemCount: templates.length, + separatorBuilder: (context, index) => const Divider(height: 1), + itemBuilder: (context, index) { + final template = templates[index]; + return ListTile( + title: Text(template.name), + subtitle: Text(_templateSummary(template)), + trailing: Wrap( + spacing: 8, + children: [ + TextButton( + onPressed: () => _start(template), + child: const Text('Lancer'), + ), + const Icon(Icons.chevron_right), + ], + ), + onTap: () => _openForm(template: template), + ); + }, + ); + }, + ), + ); + } + + void _reload() { + setState(() { + _templates = widget.workoutTemplateUseCases.listActive(); + }); + } + + Future _openForm({WorkoutTemplate? template}) async { + final changed = await Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => WorkoutTemplateFormScreen( + workoutTemplateUseCases: widget.workoutTemplateUseCases, + programUseCases: widget.programUseCases, + template: template, + ), + ), + ); + if (changed == true) { + if (!mounted) return; + _reload(); + } + } + + Future _start(WorkoutTemplate template) async { + final session = await widget.activeUseCases.startFromTemplate( + template.metadata.id, + ); + if (!mounted) return; + await Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => WorkoutExecutionScreen( + initialSession: session, + activeUseCases: widget.activeUseCases, + closeUseCase: widget.closeUseCase, + historyUseCases: widget.historyUseCases, + workoutTemplateUseCases: widget.workoutTemplateUseCases, + ), + ), + ); + } +} + +final class WorkoutTemplateFormScreen extends StatefulWidget { + const WorkoutTemplateFormScreen({ + required this.workoutTemplateUseCases, + required this.programUseCases, + this.template, + super.key, + }); + + final WorkoutTemplateUseCases workoutTemplateUseCases; + final ProgramUseCases programUseCases; + final WorkoutTemplate? template; + + @override + State createState() => + _WorkoutTemplateFormScreenState(); +} + +final class _WorkoutTemplateFormScreenState + extends State { + final _formKey = GlobalKey(); + late final TextEditingController _nameController; + late final List _programs; + var _saving = false; + + bool get _isEditing => widget.template != null; + + @override + void initState() { + super.initState(); + final template = widget.template; + _nameController = TextEditingController(text: template?.name); + _programs = [ + for (final program + in template?.programs ?? const []) + WorkoutTemplateProgramDraft.fromTemplateProgram( + program, + template?.overrides ?? const [], + ), + ]; + } + + @override + void dispose() { + _nameController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text(_isEditing ? 'Modifier la séance' : 'Créer une séance'), + ), + bottomNavigationBar: SafeArea( + minimum: const EdgeInsets.all(16), + child: FilledButton.icon( + onPressed: _saving ? null : _save, + icon: _saving + ? const SizedBox.square( + dimension: 18, + child: CircularProgressIndicator(strokeWidth: 2), + ) + : const Icon(Icons.check), + label: const Text('Enregistrer'), + ), + ), + body: Column( + children: [ + Padding( + padding: const EdgeInsets.all(16), + child: Form( + key: _formKey, + child: Column( + children: [ + TextFormField( + controller: _nameController, + decoration: const InputDecoration( + labelText: 'Nom', + border: OutlineInputBorder(), + ), + validator: (value) => value == null || value.trim().isEmpty + ? 'Le nom est obligatoire.' + : null, + ), + const SizedBox(height: 12), + SizedBox( + width: double.infinity, + child: OutlinedButton.icon( + onPressed: _addProgram, + icon: const Icon(Icons.add), + label: const Text('Ajouter un programme'), + ), + ), + ], + ), + ), + ), + Expanded( + child: _programs.isEmpty + ? const _CenteredMessage( + title: 'Aucun programme ajouté', + message: 'Ajoute un programme pour composer la séance.', + ) + : ReorderableListView.builder( + buildDefaultDragHandles: false, + padding: const EdgeInsets.fromLTRB(16, 0, 16, 16), + itemCount: _programs.length, + onReorder: _reorderProgram, + itemBuilder: (context, index) { + final program = _programs[index]; + return Card( + key: ValueKey(program.clientKey), + child: ListTile( + leading: ReorderableDragStartListener( + index: index, + child: const Icon(Icons.drag_handle), + ), + title: Text(program.programNameSnapshot), + subtitle: Text(_programDraftSummary(program)), + trailing: const Icon(Icons.chevron_right), + onTap: () => _openProgramDetail(program), + ), + ); + }, + ), + ), + ], + ), + ); + } + + Future _addProgram() async { + final program = await Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => + ProgramSelectionScreen(programUseCases: widget.programUseCases), + ), + ); + if (program == null) return; + if (!mounted) return; + final shouldExplainSnapshot = _programs.isEmpty; + setState(() { + _programs.add(WorkoutTemplateProgramDraft.fromProgram(program)); + }); + if (shouldExplainSnapshot) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text( + 'Une copie de ce programme sera enregistrée dans la séance. ' + 'Les futures modifications du programme original ne changeront ' + 'pas cette séance.', + ), + ), + ); + } + } + + void _reorderProgram(int oldIndex, int newIndex) { + setState(() { + if (newIndex > oldIndex) { + newIndex -= 1; + } + final item = _programs.removeAt(oldIndex); + _programs.insert(newIndex, item); + }); + } + + Future _openProgramDetail(WorkoutTemplateProgramDraft program) async { + await Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => + WorkoutTemplateProgramDetailScreen(program: program), + ), + ); + if (!mounted) return; + setState(() {}); + } + + Future _save() async { + if (!_formKey.currentState!.validate()) { + return; + } + setState(() => _saving = true); + try { + await widget.workoutTemplateUseCases.saveConfigured( + id: widget.template?.metadata.id, + name: _nameController.text.trim(), + programs: _programs.map((program) => program.toConfig()).toList(), + overrides: _programs + .expand((program) => program.toOverrides()) + .toList(), + ); + if (mounted) { + Navigator.of(context).pop(true); + } + } on Exception catch (error) { + _showSnackBar(error.toString()); + } finally { + if (mounted) { + setState(() => _saving = false); + } + } + } + + void _showSnackBar(String message) { + if (!mounted) return; + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text(message))); + } +} + +final class ProgramSelectionScreen extends StatelessWidget { + const ProgramSelectionScreen({required this.programUseCases, super.key}); + + final ProgramUseCases programUseCases; + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: const Text('Ajouter un programme')), + body: FutureBuilder>( + future: programUseCases.listActive(), + builder: (context, snapshot) { + if (snapshot.connectionState != ConnectionState.done) { + return const Center(child: CircularProgressIndicator()); + } + final programs = snapshot.data ?? const []; + if (programs.isEmpty) { + return const _CenteredMessage( + title: 'Aucun programme disponible', + message: 'Crée un programme avant de composer une séance.', + ); + } + return ListView.separated( + itemCount: programs.length, + separatorBuilder: (context, index) => const Divider(height: 1), + itemBuilder: (context, index) { + final program = programs[index]; + return ListTile( + title: Text(program.name), + subtitle: Text(_programSummary(program)), + onTap: () => Navigator.of(context).pop(program), + ); + }, + ); + }, + ), + ); + } +} + +final class WorkoutTemplateProgramDetailScreen extends StatefulWidget { + const WorkoutTemplateProgramDetailScreen({required this.program, super.key}); + + final WorkoutTemplateProgramDraft program; + + @override + State createState() => + _WorkoutTemplateProgramDetailScreenState(); +} + +final class _WorkoutTemplateProgramDetailScreenState + extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: Text(widget.program.programNameSnapshot)), + body: ListView.builder( + padding: const EdgeInsets.all(16), + itemCount: widget.program.exercises.length, + itemBuilder: (context, index) { + final exercise = widget.program.exercises[index]; + return Card( + child: Padding( + padding: const EdgeInsets.all(12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + exercise.exerciseNameSnapshot, + style: Theme.of(context).textTheme.titleMedium, + ), + const SizedBox(height: 4), + Text(_exerciseDraftSummary(exercise)), + const SizedBox(height: 12), + TextFormField( + initialValue: + '${exercise.setsCountOverride ?? exercise.setsCount}', + decoration: const InputDecoration( + labelText: 'Nombre de séries', + border: OutlineInputBorder(), + ), + keyboardType: TextInputType.number, + onChanged: (value) { + setState(() { + exercise.setsCountOverride = int.tryParse(value); + }); + }, + ), + if (exercise.timeEnabled) + _NumberField( + label: 'Cible temps (s)', + initialValue: + exercise.targetTimeSecondsOverride ?? + exercise.targetTimeSeconds, + onChanged: (value) { + setState(() { + exercise.targetTimeSecondsOverride = value?.round(); + }); + }, + ), + if (exercise.repsEnabled) + _NumberField( + label: 'Cible répétitions', + initialValue: + exercise.targetRepsOverride ?? exercise.targetReps, + onChanged: (value) { + setState(() { + exercise.targetRepsOverride = value?.round(); + }); + }, + ), + if (exercise.scoreEnabled) + _NumberField( + label: exercise.scoreUnitSnapshot == null + ? 'Cible score' + : 'Cible score (${exercise.scoreUnitSnapshot})', + initialValue: + exercise.targetScoreOverride ?? exercise.targetScore, + onChanged: (value) { + setState(() { + exercise.targetScoreOverride = value; + }); + }, + ), + ], + ), + ), + ); + }, + ), + ); + } +} + +final class WorkoutTemplateProgramDraft { + WorkoutTemplateProgramDraft({ + required this.clientKey, + this.existingMetadata, + this.sourceProgramId, + required this.programNameSnapshot, + required this.defaultRestSecondsSnapshot, + required this.programSnapshotJson, + required this.exercises, + }); + + factory WorkoutTemplateProgramDraft.fromProgram(Program program) { + final snapshot = { + 'programId': program.metadata.id, + 'name': program.name, + 'defaultRestSeconds': program.defaultRestSeconds, + 'exercises': program.exercises + .map((exercise) => exercise.toSnapshotJson()) + .toList(), + }; + return WorkoutTemplateProgramDraft( + clientKey: UniqueKey().toString(), + sourceProgramId: program.metadata.id, + programNameSnapshot: program.name, + defaultRestSecondsSnapshot: program.defaultRestSeconds, + programSnapshotJson: jsonEncode(snapshot), + exercises: _parseExercises(snapshot), + ); + } + + factory WorkoutTemplateProgramDraft.fromTemplateProgram( + WorkoutTemplateProgram program, + List overrides, + ) { + final snapshot = + jsonDecode(program.programSnapshotJson) as Map; + final exercises = _parseExercises(snapshot); + for (final exercise in exercises) { + for (final override in overrides) { + if (override.workoutTemplateProgramId == program.metadata.id && + override.snapshotProgramExerciseId == exercise.snapshotExerciseId) { + exercise.existingOverrideMetadata = override.metadata; + exercise.setsCountOverride = override.setsCountOverride; + exercise.targetTimeSecondsOverride = + override.targetTimeSecondsOverride; + exercise.targetRepsOverride = override.targetRepsOverride; + exercise.targetScoreOverride = override.targetScoreOverride; + } + } + } + return WorkoutTemplateProgramDraft( + clientKey: program.metadata.id, + existingMetadata: program.metadata, + sourceProgramId: program.sourceProgramId, + programNameSnapshot: program.programNameSnapshot, + defaultRestSecondsSnapshot: program.defaultRestSecondsSnapshot, + programSnapshotJson: program.programSnapshotJson, + exercises: exercises, + ); + } + + final String clientKey; + final EntityMetadata? existingMetadata; + final String? sourceProgramId; + final String programNameSnapshot; + final int defaultRestSecondsSnapshot; + final String programSnapshotJson; + final List exercises; + + WorkoutTemplateProgramConfig toConfig() { + return WorkoutTemplateProgramConfig( + clientKey: clientKey, + existingMetadata: existingMetadata, + sourceProgramId: sourceProgramId, + programNameSnapshot: programNameSnapshot, + defaultRestSecondsSnapshot: defaultRestSecondsSnapshot, + programSnapshotJson: programSnapshotJson, + ); + } + + Iterable toOverrides() sync* { + for (final exercise in exercises) { + if (!exercise.hasOverride) { + continue; + } + yield WorkoutTemplateExerciseOverrideConfig( + existingMetadata: exercise.existingOverrideMetadata, + workoutTemplateProgramClientKey: clientKey, + snapshotProgramExerciseId: exercise.snapshotExerciseId, + setsCountOverride: exercise.setsCountOverride, + targetTimeSecondsOverride: exercise.targetTimeSecondsOverride, + targetRepsOverride: exercise.targetRepsOverride, + targetScoreOverride: exercise.targetScoreOverride, + ); + } + } +} + +final class WorkoutTemplateExerciseDraft { + WorkoutTemplateExerciseDraft({ + required this.snapshotExerciseId, + required this.exerciseNameSnapshot, + required this.setsCount, + required this.timeEnabled, + required this.repsEnabled, + required this.scoreEnabled, + this.scoreUnitSnapshot, + this.targetTimeSeconds, + this.targetReps, + this.targetScore, + this.existingOverrideMetadata, + this.setsCountOverride, + this.targetTimeSecondsOverride, + this.targetRepsOverride, + this.targetScoreOverride, + }); + + final String snapshotExerciseId; + final String exerciseNameSnapshot; + final int setsCount; + final bool timeEnabled; + final bool repsEnabled; + final bool scoreEnabled; + final String? scoreUnitSnapshot; + final int? targetTimeSeconds; + final int? targetReps; + final double? targetScore; + EntityMetadata? existingOverrideMetadata; + int? setsCountOverride; + int? targetTimeSecondsOverride; + int? targetRepsOverride; + double? targetScoreOverride; + + bool get hasOverride { + return setsCountOverride != null || + targetTimeSecondsOverride != null || + targetRepsOverride != null || + targetScoreOverride != null; + } +} + +final class _NumberField extends StatelessWidget { + const _NumberField({ + required this.label, + required this.initialValue, + required this.onChanged, + }); + + final String label; + final num? initialValue; + final ValueChanged onChanged; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.only(top: 8), + child: TextFormField( + initialValue: initialValue?.toString(), + decoration: InputDecoration( + labelText: label, + border: const OutlineInputBorder(), + ), + keyboardType: TextInputType.number, + onChanged: (value) => onChanged(double.tryParse(value)), + ), + ); + } +} + +List _parseExercises( + Map snapshot, +) { + final rawExercises = snapshot['exercises'] as List? ?? const []; + return rawExercises.map((raw) { + final exercise = raw as Map; + return WorkoutTemplateExerciseDraft( + snapshotExerciseId: exercise['id'] as String, + exerciseNameSnapshot: exercise['exerciseNameSnapshot'] as String, + setsCount: exercise['setsCount'] as int, + timeEnabled: exercise['timeEnabled'] as bool, + repsEnabled: exercise['repsEnabled'] as bool, + scoreEnabled: exercise['scoreEnabled'] as bool, + scoreUnitSnapshot: exercise['scoreUnitSnapshot'] as String?, + targetTimeSeconds: exercise['targetTimeSeconds'] as int?, + targetReps: exercise['targetReps'] as int?, + targetScore: (exercise['targetScore'] as num?)?.toDouble(), + ); + }).toList(); +} + +String _templateSummary(WorkoutTemplate template) { + final programCount = template.programs.length; + final exerciseCount = template.programs.fold( + 0, + (total, program) => total + _exerciseCount(program.programSnapshotJson), + ); + return '$programCount programme${programCount > 1 ? 's' : ''} · ' + '$exerciseCount exercice${exerciseCount > 1 ? 's' : ''}'; +} + +String _programDraftSummary(WorkoutTemplateProgramDraft program) { + final exerciseCount = program.exercises.length; + return '$exerciseCount exercice${exerciseCount > 1 ? 's' : ''}'; +} + +String _programSummary(Program program) { + final exerciseCount = program.exercises.length; + final setsCount = program.exercises.fold( + 0, + (total, exercise) => total + exercise.setsCount, + ); + return '$exerciseCount exercice${exerciseCount > 1 ? 's' : ''} · ' + '$setsCount série${setsCount > 1 ? 's' : ''}'; +} + +String _exerciseDraftSummary(WorkoutTemplateExerciseDraft exercise) { + final measures = [ + if (exercise.timeEnabled) 'Temps', + if (exercise.repsEnabled) 'Répétitions', + if (exercise.scoreEnabled) + exercise.scoreUnitSnapshot == null + ? 'Score' + : 'Score (${exercise.scoreUnitSnapshot})', + ].join(' + '); + final sets = exercise.setsCountOverride ?? exercise.setsCount; + return '$sets séries · $measures'; +} + +int _exerciseCount(String programSnapshotJson) { + final snapshot = jsonDecode(programSnapshotJson) as Map; + return (snapshot['exercises'] as List? ?? const []).length; +} + +final class _CenteredMessage extends StatelessWidget { + const _CenteredMessage({ + required this.title, + this.message, + this.actionLabel, + this.onAction, + }); + + final String title; + final String? message; + final String? actionLabel; + final VoidCallback? onAction; + + @override + Widget build(BuildContext context) { + return Center( + child: Padding( + padding: const EdgeInsets.all(24), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + title, + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.titleMedium, + ), + if (message != null) ...[ + const SizedBox(height: 8), + Text(message!, textAlign: TextAlign.center), + ], + if (actionLabel != null && onAction != null) ...[ + const SizedBox(height: 16), + FilledButton(onPressed: onAction, child: Text(actionLabel!)), + ], + ], + ), + ), + ); + } +} diff --git a/pubspec.lock b/pubspec.lock new file mode 100644 index 0000000..2b6f5c2 --- /dev/null +++ b/pubspec.lock @@ -0,0 +1,725 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: cd6add6f846f35fb79f3c315296703c1a24f3cfd7f4739d91a74961c1c7e9f1b + url: "https://pub.dev" + source: hosted + version: "100.0.0" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: "6ba98576948803398b69e3a444df24eacdbe12ed699c7014e120ea38552debbf" + url: "https://pub.dev" + source: hosted + version: "13.0.0" + args: + dependency: transitive + description: + name: args + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 + url: "https://pub.dev" + source: hosted + version: "2.7.0" + async: + dependency: transitive + description: + name: async + sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37 + url: "https://pub.dev" + source: hosted + version: "2.13.1" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + build: + dependency: transitive + description: + name: build + sha256: "45d14a0fb23e018d8287c32fc98d726ce466b231928ed9b9200f29bd3ccd39ae" + url: "https://pub.dev" + source: hosted + version: "4.0.7" + build_config: + dependency: transitive + description: + name: build_config + sha256: f2c223156a26eea323e6244b85141d76413a80aeee9fe0b380773789fabaf8ae + url: "https://pub.dev" + source: hosted + version: "1.3.1" + build_daemon: + dependency: transitive + description: + name: build_daemon + sha256: fd754058c342243718d5171a95f352cfc9fcf0cba8cfa26df67cb13a5836db78 + url: "https://pub.dev" + source: hosted + version: "4.1.2" + build_runner: + dependency: "direct dev" + description: + name: build_runner + sha256: "5367e521935b102bdf1e735d2aab461e36b2edca6517662d088dd04cc39f8d16" + url: "https://pub.dev" + source: hosted + version: "2.15.1" + built_collection: + dependency: transitive + description: + name: built_collection + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.dev" + source: hosted + version: "5.1.1" + built_value: + dependency: transitive + description: + name: built_value + sha256: "34e4067d30ce212937df995f03b69992eea683539ceeac7f679a1f1eba055b56" + url: "https://pub.dev" + source: hosted + version: "8.12.6" + characters: + dependency: transitive + description: + name: characters + sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b + url: "https://pub.dev" + source: hosted + version: "1.4.1" + charcode: + dependency: transitive + description: + name: charcode + sha256: fb0f1107cac15a5ea6ef0a6ef71a807b9e4267c713bb93e00e92d737cc8dbd8a + url: "https://pub.dev" + source: hosted + version: "1.4.0" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" + url: "https://pub.dev" + source: hosted + version: "2.0.4" + cli_util: + dependency: transitive + description: + name: cli_util + sha256: "5909d2c6b66817222779e1eedc19e0e28b76d1df7bd9856a4792ccb9881df358" + url: "https://pub.dev" + source: hosted + version: "0.5.1" + clock: + dependency: transitive + description: + name: clock + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" + source: hosted + version: "1.1.2" + code_assets: + dependency: transitive + description: + name: code_assets + sha256: bf394f466ba9205f1812a0433b392d6af280f155f56651eda7c18cc32ed493b8 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + collection: + dependency: transitive + description: + name: collection + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" + source: hosted + version: "1.19.1" + convert: + dependency: transitive + description: + name: convert + sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 + url: "https://pub.dev" + source: hosted + version: "3.1.2" + crypto: + dependency: transitive + description: + name: crypto + sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf + url: "https://pub.dev" + source: hosted + version: "3.0.7" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + sha256: "41e005c33bd814be4d3096aff55b1908d419fde52ca656c8c47719ec745873cd" + url: "https://pub.dev" + source: hosted + version: "1.0.9" + dart_style: + dependency: transitive + description: + name: dart_style + sha256: "59d53ef8eaed9d288ed9767618e2b31c4fa0383a127db59d5eb2e737a7638a60" + url: "https://pub.dev" + source: hosted + version: "3.1.9" + drift: + dependency: "direct main" + description: + name: drift + sha256: "84688491040b0ceb26575709a84d701c84ad4df4d8aff020adf6d85f155fb0dd" + url: "https://pub.dev" + source: hosted + version: "2.34.2" + drift_dev: + dependency: "direct dev" + description: + name: drift_dev + sha256: "5c0e6ae3c2afcfc2e3f66ea51e7268622906a1e29fd0ee82e6a9b17bfd73a9b0" + url: "https://pub.dev" + source: hosted + version: "2.34.4" + drift_flutter: + dependency: "direct main" + description: + name: drift_flutter + sha256: "91acf4bee7c3c84467cba46455aa70e5292a3b889f4582645d74f2e5a8c106f2" + url: "https://pub.dev" + source: hosted + version: "0.3.1" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + url: "https://pub.dev" + source: hosted + version: "1.3.3" + ffi: + dependency: transitive + description: + name: ffi + sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + file: + dependency: transitive + description: + name: file + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev" + source: hosted + version: "7.0.1" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + url: "https://pub.dev" + source: hosted + version: "1.1.1" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: "3105dc8492f6183fb076ccf1f351ac3d60564bff92e20bfc4af9cc1651f4e7e1" + url: "https://pub.dev" + source: hosted + version: "6.0.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + glob: + dependency: transitive + description: + name: glob + sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de + url: "https://pub.dev" + source: hosted + version: "2.1.3" + graphs: + dependency: transitive + description: + name: graphs + sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + hooks: + dependency: transitive + description: + name: hooks + sha256: "9a62a50b50b769a737bc0a8ff381f333529df3ab746b2f6b02e83760231455ba" + url: "https://pub.dev" + source: hosted + version: "2.0.2" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8 + url: "https://pub.dev" + source: hosted + version: "3.2.2" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" + url: "https://pub.dev" + source: hosted + version: "4.1.2" + io: + dependency: transitive + description: + name: io + sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b + url: "https://pub.dev" + source: hosted + version: "1.0.5" + jni: + dependency: transitive + description: + name: jni + sha256: c2230682d5bc2362c1c9e8d3c7f406d9cbba23ab3f2e203a025dd47e0fb2e68f + url: "https://pub.dev" + source: hosted + version: "1.0.0" + jni_flutter: + dependency: transitive + description: + name: jni_flutter + sha256: "8b59e590786050b1cd866677dddaf76b1ade5e7bc751abe04b86e84d379d3ba6" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + json_annotation: + dependency: transitive + description: + name: json_annotation + sha256: "2a743920d81b7910627f68ee2c9ac1fc0bfee32b9fc3403587d7c6791ca12f80" + url: "https://pub.dev" + source: hosted + version: "4.12.0" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" + url: "https://pub.dev" + source: hosted + version: "11.0.2" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" + url: "https://pub.dev" + source: hosted + version: "3.0.10" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + lints: + dependency: transitive + description: + name: lints + sha256: "12f842a479589fea194fe5c5a3095abc7be0c1f2ddfa9a0e76aed1dbd26a87df" + url: "https://pub.dev" + source: hosted + version: "6.1.0" + logging: + dependency: transitive + description: + name: logging + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 + url: "https://pub.dev" + source: hosted + version: "1.3.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861 + url: "https://pub.dev" + source: hosted + version: "0.12.19" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" + url: "https://pub.dev" + source: hosted + version: "0.13.0" + meta: + dependency: transitive + description: + name: meta + sha256: "1741988757a65eb6b36abe716829688cf01910bbf91c34354ff7ec1c3de2b349" + url: "https://pub.dev" + source: hosted + version: "1.18.0" + mime: + dependency: transitive + description: + name: mime + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + native_toolchain_c: + dependency: transitive + description: + name: native_toolchain_c + sha256: f9c168717100ae6d9fee9ffb0be379bf1f8b26b0f6bcbd4fdddcd931993a6a72 + url: "https://pub.dev" + source: hosted + version: "0.19.2" + objective_c: + dependency: transitive + description: + name: objective_c + sha256: "6cb691c686fa2838c6deb34980d426145c2a5d537491cb83d463c33cdbc726ed" + url: "https://pub.dev" + source: hosted + version: "9.4.1" + package_config: + dependency: transitive + description: + name: package_config + sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc + url: "https://pub.dev" + source: hosted + version: "2.2.0" + path: + dependency: "direct main" + description: + name: path + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" + source: hosted + version: "1.9.1" + path_provider: + dependency: "direct main" + description: + name: path_provider + sha256: a7f4874f987173da295a61c181b8ee71dab59b332a486b391babf26a1b884825 + url: "https://pub.dev" + source: hosted + version: "2.1.6" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: "69cbd515a62b94d32a7944f086b2f82b4ac40a1d45bebfc00813a430ab2dabcd" + url: "https://pub.dev" + source: hosted + version: "2.3.1" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "2a376b7d6392d80cd3705782d2caa734ca4727776db0b6ec36ef3f1855197699" + url: "https://pub.dev" + source: hosted + version: "2.6.0" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: "58c2005f147315b11e9b4a7bc889cd5203e250cba8e3f012dae259b4972b5c16" + url: "https://pub.dev" + source: hosted + version: "2.2.2" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "484838772624c3a4b94f1e44a3e19897fee738f2d5c4ce448443b0417f7c9dda" + url: "https://pub.dev" + source: hosted + version: "2.1.3" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 + url: "https://pub.dev" + source: hosted + version: "2.3.0" + platform: + dependency: transitive + description: + name: platform + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" + url: "https://pub.dev" + source: hosted + version: "3.1.6" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + pool: + dependency: transitive + description: + name: pool + sha256: "978783255c543aa3586a1b3c21f6e9d720eb315376a915872c61ef8b5c20177d" + url: "https://pub.dev" + source: hosted + version: "1.5.2" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082" + url: "https://pub.dev" + source: hosted + version: "1.5.0" + recase: + dependency: transitive + description: + name: recase + sha256: e4eb4ec2dcdee52dcf99cb4ceabaffc631d7424ee55e56f280bc039737f89213 + url: "https://pub.dev" + source: hosted + version: "4.1.0" + record_use: + dependency: transitive + description: + name: record_use + sha256: "2551bd8eecfe95d14ae75f6021ad0248be5c27f138c2ec12fcb52b500b3ba1ed" + url: "https://pub.dev" + source: hosted + version: "0.6.0" + shelf: + dependency: transitive + description: + name: shelf + sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 + url: "https://pub.dev" + source: hosted + version: "1.4.2" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925" + url: "https://pub.dev" + source: hosted + version: "3.0.0" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + source_gen: + dependency: transitive + description: + name: source_gen + sha256: ec37cc0e6694374cbef59ed79685572c870a54ede6fa30a3e420feb3adffea02 + url: "https://pub.dev" + source: hosted + version: "4.2.3" + source_span: + dependency: transitive + description: + name: source_span + sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" + url: "https://pub.dev" + source: hosted + version: "1.10.2" + sqlcipher_flutter_libs: + dependency: transitive + description: + name: sqlcipher_flutter_libs + sha256: "38d62d659d2fb8739bf25a42c9a350d1fdd6c29a5a61f13a946778ec75d27929" + url: "https://pub.dev" + source: hosted + version: "0.7.0+eol" + sqlite3: + dependency: transitive + description: + name: sqlite3 + sha256: "61c7930bebf32c552ac5808c91bf33802e66711c9216090d3b5579c9f862e80c" + url: "https://pub.dev" + source: hosted + version: "3.4.0" + sqlite3_flutter_libs: + dependency: "direct main" + description: + name: sqlite3_flutter_libs + sha256: "3ed7553eee7bb368f8950f58ba29f634e06e813c029aff6a0d60862b96de8454" + url: "https://pub.dev" + source: hosted + version: "0.6.0+eol" + sqlparser: + dependency: transitive + description: + name: sqlparser + sha256: "772bb2f6f5bce0631a60f26b57d6e8882e1105c22345b05c163ee6ee5d7ba32d" + url: "https://pub.dev" + source: hosted + version: "0.45.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" + source: hosted + version: "1.12.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + stream_transform: + dependency: transitive + description: + name: stream_transform + sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 + url: "https://pub.dev" + source: hosted + version: "2.1.1" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" + source: hosted + version: "1.4.1" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + test_api: + dependency: transitive + description: + name: test_api + sha256: "949a932224383300f01be9221c39180316445ecb8e7547f70a41a35bf421fb9e" + url: "https://pub.dev" + source: hosted + version: "0.7.11" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b + url: "https://pub.dev" + source: hosted + version: "2.2.0" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "0016aef94fc66495ac78af5859181e3f3bf2026bd8eecc72b9565601e19ab360" + url: "https://pub.dev" + source: hosted + version: "15.2.0" + watcher: + dependency: transitive + description: + name: watcher + sha256: "1398c9f081a753f9226febe8900fce8f7d0a67163334e1c94a2438339d79d635" + url: "https://pub.dev" + source: hosted + version: "1.2.1" + web: + dependency: transitive + description: + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + web_socket: + dependency: transitive + description: + name: web_socket + sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8 + url: "https://pub.dev" + source: hosted + version: "3.0.3" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + yaml: + dependency: transitive + description: + name: yaml + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce + url: "https://pub.dev" + source: hosted + version: "3.1.3" +sdks: + dart: ">=3.11.0 <4.0.0" + flutter: ">=3.38.4" diff --git a/pubspec.yaml b/pubspec.yaml new file mode 100644 index 0000000..e3eb54b --- /dev/null +++ b/pubspec.yaml @@ -0,0 +1,28 @@ +name: gametime +description: Offline-first workout planning and tracking app. +publish_to: 'none' + +version: 0.1.0+1 + +environment: + sdk: ^3.10.0 + +dependencies: + flutter: + sdk: flutter + cupertino_icons: ^1.0.8 + drift: ^2.34.2 + drift_flutter: ^0.3.1 + path: ^1.9.1 + path_provider: ^2.1.5 + sqlite3_flutter_libs: ^0.6.0+eol + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^6.0.0 + build_runner: ^2.7.0 + drift_dev: ^2.34.2 + +flutter: + uses-material-design: true diff --git a/test/application/media_use_cases_test.dart b/test/application/media_use_cases_test.dart new file mode 100644 index 0000000..f66caf7 --- /dev/null +++ b/test/application/media_use_cases_test.dart @@ -0,0 +1,191 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:gametime/application/application.dart'; +import 'package:gametime/domain/domain.dart'; + +void main() { + test('imports media and stores sync-ready asset metadata', () async { + final mediaRepository = _FakeMediaAssetRepository(); + final useCase = MediaUseCases( + mediaRepository: mediaRepository, + exerciseRepository: _FakeExerciseRepository(), + storage: _FakeMediaStorage(), + clock: _FakeClock(DateTime.utc(2026, 7, 17, 12)), + ids: _FakeIds(), + originDeviceId: 'device-1', + ); + + final asset = await useCase.importMedia( + sourcePath: '/tmp/source.png', + kind: MediaKind.image, + ); + + expect(asset.kind, MediaKind.image); + expect(asset.localUri, 'file:///app/media/id-1.png'); + expect(asset.mimeType, 'image/png'); + expect(asset.sizeBytes, 128); + expect(asset.width, 10); + expect(asset.height, 20); + expect(asset.remoteUri, isNull); + expect(asset.checksum, isNull); + expect(mediaRepository.saved.single.metadata.id, asset.metadata.id); + }); + + test('attaches imported image to exercise image field', () async { + final exerciseRepository = _FakeExerciseRepository() + ..exercise = Exercise( + metadata: _metadata('exercise-1'), + name: 'Squat', + hasTimeMeasure: false, + hasRepsMeasure: true, + hasScoreMeasure: false, + ); + final mediaRepository = _FakeMediaAssetRepository() + ..asset = MediaAsset( + metadata: _metadata('media-1'), + kind: MediaKind.image, + localUri: 'file:///app/media/media-1.png', + ); + final useCase = MediaUseCases( + mediaRepository: mediaRepository, + exerciseRepository: exerciseRepository, + storage: _FakeMediaStorage(), + clock: _FakeClock(DateTime.utc(2026, 7, 17, 12)), + ids: _FakeIds(), + originDeviceId: 'device-1', + ); + + final updated = await useCase.attachToExercise( + exerciseId: 'exercise-1', + mediaAssetId: 'media-1', + ); + + expect(updated.imageMediaId, 'media-1'); + expect(updated.videoMediaId, isNull); + expect(exerciseRepository.saved.single.imageMediaId, 'media-1'); + }); + + test('deletes managed files not referenced by active media assets', () async { + final storage = _FakeMediaStorage() + ..managedUris = { + 'file:///app/media/kept.png', + 'file:///app/media/orphan.png', + }; + final mediaRepository = _FakeMediaAssetRepository() + ..activeAssets = [ + MediaAsset( + metadata: _metadata('media-1'), + kind: MediaKind.image, + localUri: 'file:///app/media/kept.png', + ), + ]; + final useCase = MediaUseCases( + mediaRepository: mediaRepository, + exerciseRepository: _FakeExerciseRepository(), + storage: storage, + clock: _FakeClock(DateTime.utc(2026, 7, 17, 12)), + ids: _FakeIds(), + originDeviceId: 'device-1', + ); + + final deletedCount = await useCase.deleteOrphanedManagedFiles(); + + expect(deletedCount, 1); + expect(storage.deletedUris, ['file:///app/media/orphan.png']); + }); +} + +EntityMetadata _metadata(String id) { + return EntityMetadata( + id: id, + createdAt: DateTime.utc(2026, 7, 17), + updatedAt: DateTime.utc(2026, 7, 17), + originDeviceId: 'device-1', + ); +} + +final class _FakeClock implements Clock { + const _FakeClock(this.value); + + final DateTime value; + + @override + DateTime now() => value; +} + +final class _FakeIds implements IdGenerator { + var _next = 0; + + @override + String newId() { + _next += 1; + return 'id-$_next'; + } +} + +final class _FakeMediaStorage implements LocalMediaStorage { + Set managedUris = const {}; + final deletedUris = []; + + @override + Future importFile({ + required String sourcePath, + required MediaKind kind, + required String stableFileName, + }) async { + return StoredMediaFile( + localUri: 'file:///app/media/$stableFileName.png', + mimeType: 'image/png', + sizeBytes: 128, + width: 10, + height: 20, + ); + } + + @override + Future> listManagedLocalUris() async => managedUris; + + @override + Future deleteByLocalUri(String localUri) async { + deletedUris.add(localUri); + } +} + +final class _FakeMediaAssetRepository implements MediaAssetRepository { + MediaAsset? asset; + List activeAssets = const []; + final saved = []; + + @override + Future findById(String id) async => asset; + + @override + Future> listActive() async => activeAssets; + + @override + Future save(MediaAsset mediaAsset) async { + saved.add(mediaAsset); + asset = mediaAsset; + } +} + +final class _FakeExerciseRepository implements ExerciseRepository { + Exercise? exercise; + final saved = []; + + @override + Future findById(String id) async => exercise; + + @override + Future> listActive() async { + return exercise == null ? const [] : [exercise!]; + } + + @override + Future isReferencedByProgram(String id) async => false; + + @override + Future save(Exercise exercise) async { + saved.add(exercise); + this.exercise = exercise; + } +} diff --git a/test/application/use_cases_test.dart b/test/application/use_cases_test.dart new file mode 100644 index 0000000..cc923f3 --- /dev/null +++ b/test/application/use_cases_test.dart @@ -0,0 +1,183 @@ +import 'dart:convert'; + +import 'package:flutter_test/flutter_test.dart'; +import 'package:gametime/application/application.dart'; +import 'package:gametime/domain/domain.dart'; + +void main() { + test('Exercise requires at least one active measure', () { + expect( + () => Exercise( + metadata: _metadata('exercise-1'), + name: 'Push up', + hasTimeMeasure: false, + hasRepsMeasure: false, + hasScoreMeasure: false, + ), + throwsA(isA()), + ); + }); + + test('Workout template use case rejects active measure overrides', () async { + final useCase = WorkoutTemplateUseCases( + templateRepository: _FakeWorkoutTemplateRepository(), + programRepository: _FakeProgramRepository(), + clock: _FakeClock(DateTime.utc(2026, 7, 17, 12)), + ids: _FakeIds(), + originDeviceId: 'device-1', + ); + + await expectLater( + useCase.overrideExerciseTargets( + workoutTemplateProgramId: 'template-program-1', + snapshotProgramExerciseId: 'exercise-snapshot-1', + attemptedMeasureOverride: {WorkoutMeasure.reps}, + ), + throwsA(isA()), + ); + }); + + test( + 'Workout template use case rejects target overrides for inactive measures', + () async { + final useCase = WorkoutTemplateUseCases( + templateRepository: _FakeWorkoutTemplateRepository(), + programRepository: _FakeProgramRepository(), + clock: _FakeClock(DateTime.utc(2026, 7, 17, 12)), + ids: _FakeIds(), + originDeviceId: 'device-1', + ); + + await expectLater( + useCase.saveConfigured( + name: 'Séance tir', + programs: [ + WorkoutTemplateProgramConfig( + clientKey: 'program-1', + programNameSnapshot: 'Programme tir', + defaultRestSecondsSnapshot: 30, + programSnapshotJson: jsonEncode({ + 'exercises': [ + { + 'id': 'exercise-snapshot-1', + 'exerciseNameSnapshot': 'Lancers francs', + 'setsCount': 3, + 'timeEnabled': true, + 'repsEnabled': false, + 'scoreEnabled': false, + 'targetTimeSeconds': 60, + 'targetReps': null, + 'targetScore': null, + }, + ], + }), + ), + ], + overrides: const [ + WorkoutTemplateExerciseOverrideConfig( + workoutTemplateProgramClientKey: 'program-1', + snapshotProgramExerciseId: 'exercise-snapshot-1', + targetRepsOverride: 10, + ), + ], + ), + throwsA(isA()), + ); + }, + ); + + test('Active session elapsed time is based on persisted timestamps', () { + final clock = _FakeClock(DateTime.utc(2026, 7, 17, 12)); + final session = ActiveWorkoutSession( + metadata: _metadata('session-1'), + status: ActiveWorkoutStatus.running, + startedAt: clock.now(), + lastPersistedAt: clock.now(), + elapsedActiveMs: 0, + currentProgramIndex: 0, + currentExerciseIndex: 0, + currentSetIndex: 0, + resolvedTemplateSnapshotJson: '{}', + ); + + clock.value = clock.value.add(const Duration(seconds: 30)); + final paused = session.pause(clock.now()); + expect(paused.elapsedActiveMs, 30000); + + clock.value = clock.value.add(const Duration(minutes: 5)); + final resumed = paused.resume(clock.now()); + expect(resumed.elapsedActiveMillisecondsAt(clock.now()), 30000); + + clock.value = clock.value.add(const Duration(seconds: 15)); + expect(resumed.elapsedActiveMillisecondsAt(clock.now()), 45000); + }); +} + +EntityMetadata _metadata(String id) { + return EntityMetadata( + id: id, + createdAt: DateTime.utc(2026, 7, 17), + updatedAt: DateTime.utc(2026, 7, 17), + originDeviceId: 'device-1', + ); +} + +final class _FakeClock implements Clock { + _FakeClock(this.value); + + DateTime value; + + @override + DateTime now() => value; +} + +final class _FakeIds implements IdGenerator { + var _next = 0; + + @override + String newId() { + _next += 1; + return 'id-$_next'; + } +} + +final class _FakeWorkoutTemplateRepository + implements WorkoutTemplateRepository { + @override + Future findById(String id) async => null; + + @override + Future> listActive() async => const []; + + @override + Future replaceComposition( + WorkoutTemplate template, + DateTime deletedAt, + ) async {} + + @override + Future save(WorkoutTemplate template) async {} + + @override + Future saveOverride(WorkoutTemplateExerciseOverride override) async {} + + @override + Future saveProgram(WorkoutTemplateProgram program) async {} +} + +final class _FakeProgramRepository implements ProgramRepository { + @override + Future findById(String id) async => null; + + @override + Future> listActive() async => const []; + + @override + Future replaceExercises(Program program, DateTime deletedAt) async {} + + @override + Future save(Program program) async {} + + @override + Future saveExercise(ProgramExercise exercise) async {} +} diff --git a/test/domain_import_boundaries_test.dart b/test/domain_import_boundaries_test.dart new file mode 100644 index 0000000..3910f0c --- /dev/null +++ b/test/domain_import_boundaries_test.dart @@ -0,0 +1,25 @@ +import 'dart:io'; + +import 'package:flutter_test/flutter_test.dart'; + +void main() { + test('domain layer does not import Flutter or Drift', () { + final domainDirectory = Directory('lib/domain'); + final dartFiles = domainDirectory + .listSync(recursive: true) + .whereType() + .where((file) => file.path.endsWith('.dart')); + + for (final file in dartFiles) { + final source = file.readAsStringSync(); + + expect(source, isNot(contains('package:flutter/')), reason: file.path); + expect(source, isNot(contains('package:drift/')), reason: file.path); + expect( + source, + isNot(contains('package:drift_flutter/')), + reason: file.path, + ); + } + }); +} diff --git a/test/infrastructure/drift_repositories_test.dart b/test/infrastructure/drift_repositories_test.dart new file mode 100644 index 0000000..be44f69 --- /dev/null +++ b/test/infrastructure/drift_repositories_test.dart @@ -0,0 +1,196 @@ +import 'dart:convert'; + +import 'package:drift/native.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:gametime/application/application.dart'; +import 'package:gametime/domain/domain.dart'; +import 'package:gametime/infrastructure/local/local.dart' as local; + +void main() { + late local.AppDatabase database; + late local.DriftActiveSessionRepository activeRepository; + late local.DriftWorkoutTemplateRepository templateRepository; + late local.DriftWorkoutHistoryRepository historyRepository; + + setUp(() { + database = local.AppDatabase(NativeDatabase.memory()); + activeRepository = local.DriftActiveSessionRepository(database); + templateRepository = local.DriftWorkoutTemplateRepository(database); + historyRepository = local.DriftWorkoutHistoryRepository(database); + }); + + tearDown(() async { + await database.close(); + }); + + test( + 'running session elapsed time survives repository reconstruction', + () async { + final persistedAt = DateTime.utc(2026, 7, 17, 12); + final session = ActiveWorkoutSession( + metadata: _metadata('session-1', persistedAt), + sourceWorkoutTemplateId: null, + status: ActiveWorkoutStatus.running, + startedAt: persistedAt.subtract(const Duration(seconds: 30)), + lastPersistedAt: persistedAt, + elapsedActiveMs: 30000, + currentProgramIndex: 0, + currentExerciseIndex: 0, + currentSetIndex: 0, + resolvedTemplateSnapshotJson: _resolvedSnapshot(), + ); + + await activeRepository.save(session); + + final afterAppKillRepository = local.DriftActiveSessionRepository( + database, + ); + final afterAppKillUseCases = ActiveWorkoutSessionUseCases( + sessionRepository: afterAppKillRepository, + templateRepository: templateRepository, + clock: _FakeClock(persistedAt.add(const Duration(seconds: 20))), + ids: _FakeIds(), + originDeviceId: 'device-1', + ); + + final restored = await afterAppKillRepository.findOpen(); + + expect(restored, isNotNull); + expect(afterAppKillUseCases.elapsedActiveMilliseconds(restored!), 50000); + }, + ); + + test( + 'closing a session stores autonomous history rows with set snapshots', + () async { + final now = DateTime.utc(2026, 7, 17, 12); + final template = WorkoutTemplate( + metadata: _metadata('template-1', now), + name: 'Séance jambes', + ); + await templateRepository.save(template); + + final session = ActiveWorkoutSession( + metadata: _metadata('session-1', now), + sourceWorkoutTemplateId: template.metadata.id, + status: ActiveWorkoutStatus.running, + startedAt: now.subtract(const Duration(minutes: 10)), + lastPersistedAt: now, + elapsedActiveMs: 600000, + currentProgramIndex: 0, + currentExerciseIndex: 0, + currentSetIndex: 0, + resolvedTemplateSnapshotJson: _resolvedSnapshot(), + ); + await activeRepository.save(session); + await activeRepository.saveSetResult( + ActiveSetResult( + metadata: _metadata('active-result-1', now), + activeWorkoutSessionId: session.metadata.id, + programSnapshotId: 'program-snapshot-1', + exerciseSnapshotId: 'exercise-snapshot-1', + programIndex: 0, + exerciseIndex: 0, + setIndex: 0, + actualTimeMs: 45000, + actualReps: 10, + actualScore: 80, + scoreLabelSnapshot: 'Charge', + scoreUnitSnapshot: 'kg', + completedAt: now, + ), + ); + + final closeUseCase = CloseWorkoutSessionUseCase( + sessionRepository: activeRepository, + historyRepository: historyRepository, + clock: _FakeClock(now.add(const Duration(seconds: 5))), + ids: _FakeIds(), + originDeviceId: 'device-1', + ); + + final history = await closeUseCase.close( + sessionId: session.metadata.id, + nameSnapshot: 'Séance jambes', + completed: true, + ); + await templateRepository.save( + WorkoutTemplate( + metadata: template.metadata.markDeleted(now), + name: template.name, + ), + ); + + final restored = await historyRepository.findById(history.metadata.id); + + expect(restored, isNotNull); + expect(restored!.nameSnapshot, 'Séance jambes'); + expect(restored.results, hasLength(1)); + expect(restored.results.single.programNameSnapshot, 'Programme jambes'); + expect(restored.results.single.exerciseNameSnapshot, 'Squat'); + expect(restored.results.single.actualTimeMs, 45000); + expect(restored.results.single.actualReps, 10); + expect(restored.results.single.actualScore, 80); + expect(restored.results.single.scoreUnitSnapshot, 'kg'); + }, + ); +} + +String _resolvedSnapshot() { + return jsonEncode({ + 'name': 'Séance jambes', + 'programs': [ + { + 'id': 'program-snapshot-1', + 'programNameSnapshot': 'Programme jambes', + 'programSnapshotJson': jsonEncode({ + 'exercises': [ + { + 'id': 'exercise-snapshot-1', + 'exerciseNameSnapshot': 'Squat', + 'setsCount': 1, + 'timeEnabled': true, + 'repsEnabled': true, + 'scoreEnabled': true, + 'targetTimeSeconds': 45, + 'targetReps': 10, + 'targetScore': 80, + 'scoreLabelSnapshot': 'Charge', + 'scoreUnitSnapshot': 'kg', + 'restSecondsOverride': 0, + }, + ], + }), + }, + ], + 'overrides': const [], + }); +} + +EntityMetadata _metadata(String id, DateTime now) { + return EntityMetadata( + id: id, + createdAt: now, + updatedAt: now, + originDeviceId: 'device-1', + ); +} + +final class _FakeClock implements Clock { + const _FakeClock(this.value); + + final DateTime value; + + @override + DateTime now() => value; +} + +final class _FakeIds implements IdGenerator { + var _next = 0; + + @override + String newId() { + _next += 1; + return 'id-$_next'; + } +} diff --git a/test/presentation/exercise_library_screen_test.dart b/test/presentation/exercise_library_screen_test.dart new file mode 100644 index 0000000..1f8ca56 --- /dev/null +++ b/test/presentation/exercise_library_screen_test.dart @@ -0,0 +1,188 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:gametime/application/application.dart'; +import 'package:gametime/domain/domain.dart'; +import 'package:gametime/presentation/presentation.dart'; + +void main() { + testWidgets('la validation au moins une mesure active bloque la sauvegarde', ( + tester, + ) async { + final exerciseRepository = _FakeExerciseRepository(); + final exerciseUseCases = _exerciseUseCases(exerciseRepository); + + await tester.pumpWidget( + MaterialApp( + home: ExerciseFormScreen( + exerciseUseCases: exerciseUseCases, + mediaUseCases: _mediaUseCases(exerciseRepository), + ), + ), + ); + + await tester.enterText(find.byType(TextFormField).first, 'Gainage'); + await tester.tap(find.widgetWithText(SwitchListTile, 'Temps')); + await tester.pump(); + await tester.dragUntilVisible( + find.text('Enregistrer'), + find.byType(ListView), + const Offset(0, -200), + ); + await tester.pumpAndSettle(); + await tester.tap(find.text('Enregistrer')); + await tester.pump(); + + expect( + find.text('Active au moins une mesure pour enregistrer.'), + findsOneWidget, + ); + expect(exerciseRepository.saved, isEmpty); + }); + + testWidgets('la liste affiche les badges des mesures disponibles', ( + tester, + ) async { + final exercise = Exercise( + metadata: _metadata('exercise-1'), + name: 'Squat', + description: 'Jambes · charge libre', + hasTimeMeasure: true, + hasRepsMeasure: true, + hasScoreMeasure: true, + scoreLabel: 'Charge', + scoreUnit: 'kg', + ); + + await tester.pumpWidget( + MaterialApp( + home: Scaffold(body: ExerciseListTile(exercise: exercise)), + ), + ); + + expect(find.text('Squat'), findsOneWidget); + expect(find.text('Jambes · charge libre'), findsOneWidget); + expect(find.text('Temps'), findsOneWidget); + expect(find.text('Répétitions'), findsOneWidget); + expect(find.text('Score (kg)'), findsOneWidget); + }); +} + +ExerciseUseCases _exerciseUseCases(_FakeExerciseRepository repository) { + return ExerciseUseCases( + repository: repository, + clock: _FakeClock(DateTime.utc(2026, 7, 17, 12)), + ids: _FakeIds(), + originDeviceId: 'device-1', + ); +} + +MediaUseCases _mediaUseCases(_FakeExerciseRepository exerciseRepository) { + return MediaUseCases( + mediaRepository: _FakeMediaAssetRepository(), + exerciseRepository: exerciseRepository, + storage: _FakeMediaStorage(), + clock: _FakeClock(DateTime.utc(2026, 7, 17, 12)), + ids: _FakeIds(), + originDeviceId: 'device-1', + ); +} + +EntityMetadata _metadata(String id) { + return EntityMetadata( + id: id, + createdAt: DateTime.utc(2026, 7, 17), + updatedAt: DateTime.utc(2026, 7, 17), + originDeviceId: 'device-1', + ); +} + +final class _FakeClock implements Clock { + const _FakeClock(this.value); + + final DateTime value; + + @override + DateTime now() => value; +} + +final class _FakeIds implements IdGenerator { + var _next = 0; + + @override + String newId() { + _next += 1; + return 'id-$_next'; + } +} + +final class _FakeExerciseRepository implements ExerciseRepository { + final exercises = []; + final saved = []; + var referenced = false; + + @override + Future findById(String id) async { + for (final exercise in exercises) { + if (exercise.metadata.id == id) { + return exercise; + } + } + return null; + } + + @override + Future isReferencedByProgram(String id) async => referenced; + + @override + Future> listActive() async => exercises; + + @override + Future save(Exercise exercise) async { + saved.add(exercise); + exercises.removeWhere((item) => item.metadata.id == exercise.metadata.id); + exercises.add(exercise); + } +} + +final class _FakeMediaAssetRepository implements MediaAssetRepository { + final saved = []; + + @override + Future findById(String id) async { + for (final asset in saved) { + if (asset.metadata.id == id) { + return asset; + } + } + return null; + } + + @override + Future> listActive() async => saved; + + @override + Future save(MediaAsset mediaAsset) async { + saved.add(mediaAsset); + } +} + +final class _FakeMediaStorage implements LocalMediaStorage { + @override + Future deleteByLocalUri(String localUri) async {} + + @override + Future importFile({ + required String sourcePath, + required MediaKind kind, + required String stableFileName, + }) async { + return StoredMediaFile( + localUri: 'file:///tmp/$stableFileName', + mimeType: kind == MediaKind.image ? 'image/png' : 'video/mp4', + sizeBytes: 1, + ); + } + + @override + Future> listManagedLocalUris() async => const {}; +} diff --git a/test/presentation/history_screen_test.dart b/test/presentation/history_screen_test.dart new file mode 100644 index 0000000..483b552 --- /dev/null +++ b/test/presentation/history_screen_test.dart @@ -0,0 +1,305 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:gametime/application/application.dart'; +import 'package:gametime/domain/domain.dart'; +import 'package:gametime/presentation/presentation.dart'; + +void main() { + testWidgets('la liste groupe les séances par période', (tester) async { + final groups = groupHistoriesByPeriod([ + _history(id: 'today', startedAt: DateTime.utc(2026, 7, 17, 9)), + _history(id: 'week', startedAt: DateTime.utc(2026, 7, 15, 9)), + _history(id: 'old', startedAt: DateTime.utc(2026, 7, 1, 9)), + ], DateTime.utc(2026, 7, 17, 12)); + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: Column(children: [for (final key in groups.keys) Text(key)]), + ), + ), + ); + + expect(find.text("Aujourd'hui"), findsOneWidget); + expect(find.text('Cette semaine'), findsOneWidget); + expect(find.text('Plus ancien'), findsOneWidget); + }); + + testWidgets('le détail affiche temps répétitions et score avec unité', ( + tester, + ) async { + await tester.pumpWidget( + MaterialApp( + home: HistoryDetailScreen( + history: _history(id: 'history-1'), + historyUseCases: _historyUseCases(_FakeWorkoutHistoryRepository()), + workoutTemplateUseCases: _workoutTemplateUseCases(), + activeUseCases: _activeUseCases(), + closeUseCase: _closeUseCase(), + ), + ), + ); + + expect(find.text('Programme jambes'), findsOneWidget); + expect(find.text('Squat'), findsOneWidget); + expect( + find.text('Temps 00:45 · 10 répétitions · Score 80 kg'), + findsOneWidget, + ); + }); + + testWidgets('la suppression demande une confirmation', (tester) async { + final repository = _FakeWorkoutHistoryRepository(); + + await tester.pumpWidget( + MaterialApp( + home: HistoryDetailScreen( + history: _history(id: 'history-1'), + historyUseCases: _historyUseCases(repository), + workoutTemplateUseCases: _workoutTemplateUseCases(), + activeUseCases: _activeUseCases(), + closeUseCase: _closeUseCase(), + ), + ), + ); + + await tester.tap(find.text("Supprimer de l'historique")); + await tester.pumpAndSettle(); + + expect(repository.deletedIds, isEmpty); + expect(find.text("Supprimer de l'historique ?"), findsOneWidget); + + await tester.tap(find.text('Annuler')); + await tester.pumpAndSettle(); + + expect(repository.deletedIds, isEmpty); + + await tester.tap(find.text("Supprimer de l'historique")); + await tester.pumpAndSettle(); + await tester.tap(find.widgetWithText(FilledButton, 'Supprimer')); + await tester.pumpAndSettle(); + + expect(repository.deletedIds, ['history-1']); + }); +} + +WorkoutHistory _history({required String id, DateTime? startedAt}) { + final start = startedAt ?? DateTime.utc(2026, 7, 17, 10); + return WorkoutHistory( + metadata: _metadata(id), + sourceWorkoutTemplateId: 'template-1', + sourceActiveWorkoutSessionId: 'session-1', + nameSnapshot: 'Séance jambes', + startedAt: start, + endedAt: start.add(const Duration(minutes: 30)), + totalActiveMs: 1800000, + completed: true, + historySnapshotJson: jsonEncode({ + 'sessionId': 'session-1', + 'resolvedTemplateSnapshotJson': _resolvedSnapshot(), + 'results': [ + { + 'programSnapshotId': 'program-snapshot-1', + 'exerciseSnapshotId': 'exercise-snapshot-1', + 'programIndex': 0, + 'exerciseIndex': 0, + 'setIndex': 0, + 'actualTimeMs': 45000, + 'actualReps': 10, + 'actualScore': 80, + 'scoreLabelSnapshot': 'Charge', + 'scoreUnitSnapshot': 'kg', + }, + ], + }), + ); +} + +String _resolvedSnapshot() { + return jsonEncode({ + 'name': 'Séance jambes', + 'programs': [ + { + 'id': 'program-snapshot-1', + 'programNameSnapshot': 'Programme jambes', + 'programSnapshotJson': jsonEncode({ + 'exercises': [ + { + 'id': 'exercise-snapshot-1', + 'exerciseNameSnapshot': 'Squat', + 'setsCount': 1, + 'timeEnabled': true, + 'repsEnabled': true, + 'scoreEnabled': true, + 'targetTimeSeconds': 45, + 'targetReps': 10, + 'targetScore': 80, + 'scoreLabelSnapshot': 'Charge', + 'scoreUnitSnapshot': 'kg', + 'restSecondsOverride': 0, + }, + ], + }), + }, + ], + 'overrides': const [], + }); +} + +EntityMetadata _metadata(String id) { + return EntityMetadata( + id: id, + createdAt: DateTime.utc(2026, 7, 17), + updatedAt: DateTime.utc(2026, 7, 17), + originDeviceId: 'device-1', + ); +} + +WorkoutHistoryUseCases _historyUseCases( + _FakeWorkoutHistoryRepository repository, +) { + return WorkoutHistoryUseCases( + repository: repository, + clock: _FakeClock(DateTime.utc(2026, 7, 17)), + ); +} + +WorkoutTemplateUseCases _workoutTemplateUseCases() { + return WorkoutTemplateUseCases( + templateRepository: _FakeWorkoutTemplateRepository(), + programRepository: _FakeProgramRepository(), + clock: _FakeClock(DateTime.utc(2026, 7, 17)), + ids: _FakeIds(), + originDeviceId: 'device-1', + ); +} + +ActiveWorkoutSessionUseCases _activeUseCases() { + return ActiveWorkoutSessionUseCases( + sessionRepository: _FakeActiveSessionRepository(), + templateRepository: _FakeWorkoutTemplateRepository(), + clock: _FakeClock(DateTime.utc(2026, 7, 17)), + ids: _FakeIds(), + originDeviceId: 'device-1', + ); +} + +CloseWorkoutSessionUseCase _closeUseCase() { + return CloseWorkoutSessionUseCase( + sessionRepository: _FakeActiveSessionRepository(), + historyRepository: _FakeWorkoutHistoryRepository(), + clock: _FakeClock(DateTime.utc(2026, 7, 17)), + ids: _FakeIds(), + originDeviceId: 'device-1', + ); +} + +final class _FakeClock implements Clock { + _FakeClock(this.value); + + DateTime value; + + @override + DateTime now() => value; +} + +final class _FakeIds implements IdGenerator { + var _next = 0; + + @override + String newId() { + _next += 1; + return 'id-$_next'; + } +} + +final class _FakeWorkoutHistoryRepository implements WorkoutHistoryRepository { + final deletedIds = []; + + @override + Future delete(String id, DateTime deletedAt) async { + deletedIds.add(id); + } + + @override + Future findById(String id) async => null; + + @override + Future> listActive() async => const []; + + @override + Future save(WorkoutHistory history) async {} + + @override + Future saveSetResult(WorkoutHistorySetResult result) async {} +} + +final class _FakeWorkoutTemplateRepository + implements WorkoutTemplateRepository { + @override + Future findById(String id) async => null; + + @override + Future> listActive() async => const []; + + @override + Future replaceComposition( + WorkoutTemplate template, + DateTime deletedAt, + ) async {} + + @override + Future save(WorkoutTemplate template) async {} + + @override + Future saveOverride(WorkoutTemplateExerciseOverride override) async {} + + @override + Future saveProgram(WorkoutTemplateProgram program) async {} +} + +final class _FakeProgramRepository implements ProgramRepository { + @override + Future findById(String id) async => null; + + @override + Future> listActive() async => const []; + + @override + Future replaceExercises(Program program, DateTime deletedAt) async {} + + @override + Future save(Program program) async {} + + @override + Future saveExercise(ProgramExercise exercise) async {} +} + +final class _FakeActiveSessionRepository implements ActiveSessionRepository { + @override + Future findById(String id) async => null; + + @override + Future findOpen() async => null; + + @override + Future> listRestStates(String sessionId) async { + return const []; + } + + @override + Future> listSetResults(String sessionId) async { + return const []; + } + + @override + Future save(ActiveWorkoutSession session) async {} + + @override + Future saveRestState(ActiveRestState restState) async {} + + @override + Future saveSetResult(ActiveSetResult result) async {} +} diff --git a/test/presentation/program_screen_test.dart b/test/presentation/program_screen_test.dart new file mode 100644 index 0000000..71afa4e --- /dev/null +++ b/test/presentation/program_screen_test.dart @@ -0,0 +1,198 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:gametime/application/application.dart'; +import 'package:gametime/domain/domain.dart'; +import 'package:gametime/presentation/presentation.dart'; + +void main() { + testWidgets( + 'ajoute un exercice au programme avec sa configuration par défaut', + (tester) async { + final exerciseRepository = _FakeExerciseRepository() + ..exercises.add( + Exercise( + metadata: _metadata('exercise-1'), + name: 'Squat', + hasTimeMeasure: true, + hasRepsMeasure: true, + hasScoreMeasure: false, + ), + ); + + await tester.pumpWidget( + MaterialApp( + home: ProgramFormScreen( + programUseCases: _programUseCases( + _FakeProgramRepository(), + exerciseRepository, + ), + exerciseUseCases: _exerciseUseCases(exerciseRepository), + ), + ), + ); + + await tester.tap(find.text('Ajouter un exercice')); + await tester.pumpAndSettle(); + await tester.tap(find.text('Squat')); + await tester.pumpAndSettle(); + + expect(find.text('Squat'), findsOneWidget); + expect( + find.text('3 séries · Temps + Répétitions · Repos 60 s'), + findsOneWidget, + ); + expect(find.widgetWithText(CheckboxListTile, 'Temps'), findsOneWidget); + expect( + find.widgetWithText(CheckboxListTile, 'Répétitions'), + findsOneWidget, + ); + }, + ); + + testWidgets( + 'limite les mesures aux mesures autorisées par l’exercice source', + (tester) async { + final exerciseRepository = _FakeExerciseRepository() + ..exercises.add( + Exercise( + metadata: _metadata('exercise-1'), + name: 'Pompes', + hasTimeMeasure: false, + hasRepsMeasure: true, + hasScoreMeasure: false, + ), + ); + + await tester.pumpWidget( + MaterialApp( + home: ProgramFormScreen( + programUseCases: _programUseCases( + _FakeProgramRepository(), + exerciseRepository, + ), + exerciseUseCases: _exerciseUseCases(exerciseRepository), + ), + ), + ); + + await tester.tap(find.text('Ajouter un exercice')); + await tester.pumpAndSettle(); + await tester.tap(find.text('Pompes')); + await tester.pumpAndSettle(); + + expect( + find.widgetWithText(CheckboxListTile, 'Répétitions'), + findsOneWidget, + ); + expect(find.widgetWithText(CheckboxListTile, 'Temps'), findsNothing); + expect(find.widgetWithText(CheckboxListTile, 'Score'), findsNothing); + }, + ); +} + +ExerciseUseCases _exerciseUseCases(_FakeExerciseRepository repository) { + return ExerciseUseCases( + repository: repository, + clock: _FakeClock(DateTime.utc(2026, 7, 17, 12)), + ids: _FakeIds(), + originDeviceId: 'device-1', + ); +} + +ProgramUseCases _programUseCases( + _FakeProgramRepository programRepository, + _FakeExerciseRepository exerciseRepository, +) { + return ProgramUseCases( + programRepository: programRepository, + exerciseRepository: exerciseRepository, + clock: _FakeClock(DateTime.utc(2026, 7, 17, 12)), + ids: _FakeIds(), + originDeviceId: 'device-1', + ); +} + +EntityMetadata _metadata(String id) { + return EntityMetadata( + id: id, + createdAt: DateTime.utc(2026, 7, 17), + updatedAt: DateTime.utc(2026, 7, 17), + originDeviceId: 'device-1', + ); +} + +final class _FakeClock implements Clock { + const _FakeClock(this.value); + + final DateTime value; + + @override + DateTime now() => value; +} + +final class _FakeIds implements IdGenerator { + var _next = 0; + + @override + String newId() { + _next += 1; + return 'id-$_next'; + } +} + +final class _FakeExerciseRepository implements ExerciseRepository { + final exercises = []; + final saved = []; + + @override + Future findById(String id) async { + for (final exercise in exercises) { + if (exercise.metadata.id == id) { + return exercise; + } + } + return null; + } + + @override + Future isReferencedByProgram(String id) async => false; + + @override + Future> listActive() async => exercises; + + @override + Future save(Exercise exercise) async { + saved.add(exercise); + } +} + +final class _FakeProgramRepository implements ProgramRepository { + final programs = []; + + @override + Future findById(String id) async { + for (final program in programs) { + if (program.metadata.id == id) { + return program; + } + } + return null; + } + + @override + Future> listActive() async => programs; + + @override + Future replaceExercises(Program program, DateTime deletedAt) async { + programs.removeWhere((item) => item.metadata.id == program.metadata.id); + programs.add(program); + } + + @override + Future save(Program program) async { + programs.add(program); + } + + @override + Future saveExercise(ProgramExercise exercise) async {} +} diff --git a/test/presentation/workout_execution_screen_test.dart b/test/presentation/workout_execution_screen_test.dart new file mode 100644 index 0000000..4166c8f --- /dev/null +++ b/test/presentation/workout_execution_screen_test.dart @@ -0,0 +1,313 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:gametime/application/application.dart'; +import 'package:gametime/domain/domain.dart'; +import 'package:gametime/presentation/presentation.dart'; + +void main() { + testWidgets('le temps affiché est recalculé depuis les horodatages', ( + tester, + ) async { + final clock = _FakeClock(DateTime.utc(2026, 7, 17, 12, 0, 15)); + final session = ActiveWorkoutSession( + metadata: _metadata('session-1'), + sourceWorkoutTemplateId: 'template-1', + status: ActiveWorkoutStatus.running, + startedAt: DateTime.utc(2026, 7, 17, 11, 59), + lastPersistedAt: DateTime.utc(2026, 7, 17, 12), + elapsedActiveMs: 30000, + currentProgramIndex: 0, + currentExerciseIndex: 0, + currentSetIndex: 0, + resolvedTemplateSnapshotJson: _sessionSnapshot(), + ); + + await tester.pumpWidget( + MaterialApp( + home: WorkoutExecutionScreen( + initialSession: session, + activeUseCases: _activeUseCases( + _FakeActiveSessionRepository(), + clock, + ), + closeUseCase: _closeUseCase(_FakeActiveSessionRepository(), clock), + historyUseCases: _historyUseCases(clock), + workoutTemplateUseCases: _workoutTemplateUseCases(), + ), + ), + ); + + expect(find.text('00:45'), findsOneWidget); + }); + + testWidgets('les mesures cumulées respectent la hiérarchie visuelle', ( + tester, + ) async { + final scoreController = TextEditingController(); + addTearDown(scoreController.dispose); + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: SetMeasureInput( + exercise: const ExecutionExercise( + id: 'exercise-1', + name: 'Squat', + setsCount: 3, + timeEnabled: true, + repsEnabled: true, + scoreEnabled: true, + restSeconds: 0, + scoreUnit: 'kg', + ), + reps: 0, + scoreController: scoreController, + onRepsChanged: (_) {}, + ), + ), + ), + ); + + final timeY = tester.getTopLeft(find.text('Temps')).dy; + final repsY = tester.getTopLeft(find.text('Répétitions')).dy; + final scoreY = tester.getTopLeft(find.text('Score (kg)')).dy; + + expect(timeY, lessThan(repsY)); + expect(repsY, lessThan(scoreY)); + }); + + testWidgets('aucun repos ne s’affiche après la toute dernière série', ( + tester, + ) async { + final plan = WorkoutExecutionPlan.fromSession( + ActiveWorkoutSession( + metadata: _metadata('session-1'), + sourceWorkoutTemplateId: 'template-1', + status: ActiveWorkoutStatus.running, + startedAt: DateTime.utc(2026, 7, 17, 12), + lastPersistedAt: DateTime.utc(2026, 7, 17, 12), + elapsedActiveMs: 0, + currentProgramIndex: 0, + currentExerciseIndex: 0, + currentSetIndex: 0, + resolvedTemplateSnapshotJson: _sessionSnapshot( + setsCount: 1, + restSeconds: 60, + ), + ), + ); + const position = ExecutionPosition( + programIndex: 0, + exerciseIndex: 0, + setIndex: 0, + ); + + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: Text( + plan.shouldShowRestAfter(position) ? 'Repos' : 'Pas de repos', + ), + ), + ); + + expect(find.text('Pas de repos'), findsOneWidget); + }); +} + +ActiveWorkoutSessionUseCases _activeUseCases( + _FakeActiveSessionRepository repository, + _FakeClock clock, +) { + return ActiveWorkoutSessionUseCases( + sessionRepository: repository, + templateRepository: _FakeWorkoutTemplateRepository(), + clock: clock, + ids: _FakeIds(), + originDeviceId: 'device-1', + ); +} + +CloseWorkoutSessionUseCase _closeUseCase( + _FakeActiveSessionRepository repository, + _FakeClock clock, +) { + return CloseWorkoutSessionUseCase( + sessionRepository: repository, + historyRepository: _FakeWorkoutHistoryRepository(), + clock: clock, + ids: _FakeIds(), + originDeviceId: 'device-1', + ); +} + +WorkoutHistoryUseCases _historyUseCases(_FakeClock clock) { + return WorkoutHistoryUseCases( + repository: _FakeWorkoutHistoryRepository(), + clock: clock, + ); +} + +WorkoutTemplateUseCases _workoutTemplateUseCases() { + return WorkoutTemplateUseCases( + templateRepository: _FakeWorkoutTemplateRepository(), + programRepository: _FakeProgramRepository(), + clock: _FakeClock(DateTime.utc(2026, 7, 17)), + ids: _FakeIds(), + originDeviceId: 'device-1', + ); +} + +String _sessionSnapshot({int setsCount = 3, int restSeconds = 0}) { + return jsonEncode({ + 'name': 'Séance jambes', + 'programs': [ + { + 'id': 'template-program-1', + 'programNameSnapshot': 'Programme jambes', + 'programSnapshotJson': jsonEncode({ + 'exercises': [ + { + 'id': 'exercise-1', + 'exerciseNameSnapshot': 'Squat', + 'setsCount': setsCount, + 'timeEnabled': true, + 'repsEnabled': true, + 'scoreEnabled': true, + 'targetTimeSeconds': 45, + 'targetReps': 10, + 'targetScore': 80, + 'scoreUnitSnapshot': 'kg', + 'restSecondsOverride': restSeconds, + }, + ], + }), + }, + ], + 'overrides': const [], + }); +} + +EntityMetadata _metadata(String id) { + return EntityMetadata( + id: id, + createdAt: DateTime.utc(2026, 7, 17), + updatedAt: DateTime.utc(2026, 7, 17), + originDeviceId: 'device-1', + ); +} + +final class _FakeClock implements Clock { + _FakeClock(this.value); + + DateTime value; + + @override + DateTime now() => value; +} + +final class _FakeIds implements IdGenerator { + var _next = 0; + + @override + String newId() { + _next += 1; + return 'id-$_next'; + } +} + +final class _FakeActiveSessionRepository implements ActiveSessionRepository { + ActiveWorkoutSession? session; + final results = []; + + @override + Future findById(String id) async { + return session?.metadata.id == id ? session : null; + } + + @override + Future findOpen() async => session; + + @override + Future> listRestStates(String sessionId) async { + return const []; + } + + @override + Future> listSetResults(String sessionId) async { + return results; + } + + @override + Future save(ActiveWorkoutSession session) async { + this.session = session; + } + + @override + Future saveRestState(ActiveRestState restState) async {} + + @override + Future saveSetResult(ActiveSetResult result) async { + results.add(result); + } +} + +final class _FakeWorkoutTemplateRepository + implements WorkoutTemplateRepository { + @override + Future findById(String id) async => null; + + @override + Future> listActive() async => const []; + + @override + Future replaceComposition( + WorkoutTemplate template, + DateTime deletedAt, + ) async {} + + @override + Future save(WorkoutTemplate template) async {} + + @override + Future saveOverride(WorkoutTemplateExerciseOverride override) async {} + + @override + Future saveProgram(WorkoutTemplateProgram program) async {} +} + +final class _FakeWorkoutHistoryRepository implements WorkoutHistoryRepository { + @override + Future delete(String id, DateTime deletedAt) async {} + + @override + Future findById(String id) async => null; + + @override + Future> listActive() async => const []; + + @override + Future save(WorkoutHistory history) async {} + + @override + Future saveSetResult(WorkoutHistorySetResult result) async {} +} + +final class _FakeProgramRepository implements ProgramRepository { + @override + Future replaceExercises(Program program, DateTime deletedAt) async {} + + @override + Future findById(String id) async => null; + + @override + Future> listActive() async => const []; + + @override + Future save(Program program) async {} + + @override + Future saveExercise(ProgramExercise exercise) async {} +} diff --git a/test/presentation/workout_template_screen_test.dart b/test/presentation/workout_template_screen_test.dart new file mode 100644 index 0000000..6e3dfd1 --- /dev/null +++ b/test/presentation/workout_template_screen_test.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:gametime/presentation/presentation.dart'; + +void main() { + testWidgets( + 'la vue programme de séance ne permet pas de changer les mesures actives', + (tester) async { + final program = WorkoutTemplateProgramDraft( + clientKey: 'program-1', + programNameSnapshot: 'Jambes', + defaultRestSecondsSnapshot: 60, + programSnapshotJson: '{}', + exercises: [ + WorkoutTemplateExerciseDraft( + snapshotExerciseId: 'exercise-1', + exerciseNameSnapshot: 'Squat', + setsCount: 3, + timeEnabled: true, + repsEnabled: true, + scoreEnabled: false, + targetTimeSeconds: 45, + targetReps: 10, + ), + ], + ); + + await tester.pumpWidget( + MaterialApp(home: WorkoutTemplateProgramDetailScreen(program: program)), + ); + + expect(find.byType(CheckboxListTile), findsNothing); + expect(find.text('Mesures à suivre'), findsNothing); + + await tester.enterText(find.byType(TextFormField).first, '5'); + await tester.pump(); + + expect(program.exercises.single.setsCountOverride, 5); + expect(find.text('5 séries · Temps + Répétitions'), findsOneWidget); + }, + ); +}