import 'package:drift/drift.dart'; class Rides extends Table { IntColumn get id => integer().autoIncrement()(); /// Stable MotorCloud identity preserved across local IDs, reinstalls, and sync retries. TextColumn get cloudRideId => text().nullable()(); /// Firebase UID that owns this ride in MotorCloud. Null means device-only. TextColumn get cloudOwnerUid => text().nullable()(); DateTimeColumn get startTime => dateTime()(); DateTimeColumn get endTime => dateTime().nullable()(); RealColumn get distanceMiles => real().withDefault(const Constant(0.0))(); RealColumn get topSpeedMph => real().withDefault(const Constant(0.0))(); RealColumn get maxLeanLeft => real().withDefault(const Constant(0.0))(); RealColumn get maxLeanRight => real().withDefault(const Constant(0.0))(); RealColumn get maxAccelG => real().withDefault(const Constant(0.0))(); RealColumn get maxBrakingG => real().withDefault(const Constant(0.0))(); RealColumn get best0to60Ms => real().nullable()(); RealColumn get best0to100Ms => real().nullable()(); RealColumn get distance => real().withDefault(const Constant(0.0))(); IntColumn get movingTime => integer().withDefault(const Constant(0))(); IntColumn get stoppedTime => integer().withDefault(const Constant(0))(); RealColumn get averageSpeed => real().withDefault(const Constant(0.0))(); RealColumn get topSpeed => real().withDefault(const Constant(0.0))(); RealColumn get elevationGain => real().withDefault(const Constant(0.0))(); RealColumn get elevationLoss => real().withDefault(const Constant(0.0))(); IntColumn get motorcycleId => integer().nullable()(); IntColumn get motorcycleYear => integer().nullable()(); TextColumn get motorcycleMake => text().nullable()(); TextColumn get motorcycleModel => text().nullable()(); TextColumn get motorcycleVariant => text().nullable()(); } class TelemetrySamples extends Table { IntColumn get id => integer().autoIncrement()(); IntColumn get rideId => integer().references(Rides, #id)(); DateTimeColumn get timestamp => dateTime()(); RealColumn get latitude => real().nullable()(); RealColumn get longitude => real().nullable()(); RealColumn get altitude => real().nullable()(); RealColumn get speed => real().nullable()(); RealColumn get heading => real().nullable()(); RealColumn get gpsAccuracy => real().nullable()(); RealColumn get leanAngle => real().nullable()(); RealColumn get pitchAngle => real().nullable()(); RealColumn get accelX => real().nullable()(); RealColumn get accelY => real().nullable()(); RealColumn get accelZ => real().nullable()(); RealColumn get longitudinalG => real().nullable()(); RealColumn get lateralG => real().nullable()(); } class RideEvents extends Table { IntColumn get id => integer().autoIncrement()(); IntColumn get rideId => integer().references(Rides, #id)(); DateTimeColumn get timestamp => dateTime()(); TextColumn get eventType => text()(); RealColumn get value => real()(); RealColumn get latitude => real().nullable()(); RealColumn get longitude => real().nullable()(); } class PerformanceRuns extends Table { IntColumn get id => integer().autoIncrement()(); IntColumn get rideId => integer().references(Rides, #id).nullable()(); TextColumn get type => text()(); RealColumn get timeMs => real()(); RealColumn get topSpeedReached => real()(); DateTimeColumn get timestamp => dateTime()(); } class GarageMotorcycles extends Table { IntColumn get id => integer().autoIncrement()(); IntColumn get year => integer()(); TextColumn get makeId => text()(); TextColumn get makeName => text()(); TextColumn get modelId => text()(); TextColumn get modelName => text()(); TextColumn get variantId => text().nullable()(); TextColumn get variantName => text().nullable()(); TextColumn get nickname => text().nullable()(); BoolColumn get isDefault => boolean().withDefault(const Constant(false))(); DateTimeColumn get dateAdded => dateTime()(); DateTimeColumn get lastUpdated => dateTime()(); TextColumn get specificationJson => text().nullable()(); } class FieldTestSessions extends Table { IntColumn get id => integer().autoIncrement()(); IntColumn get rideId => integer().nullable().references(Rides, #id)(); DateTimeColumn get startedAt => dateTime()(); DateTimeColumn get endedAt => dateTime().nullable()(); TextColumn get appVersion => text().withDefault(const Constant('1.0.0'))(); TextColumn get buildNumber => text().withDefault(const Constant('1'))(); TextColumn get androidVersion => text().withDefault(const Constant('Android'))(); TextColumn get deviceModel => text().withDefault(const Constant('Generic'))(); IntColumn get motorcycleId => integer().nullable()(); IntColumn get motorcycleYear => integer().nullable()(); TextColumn get motorcycleMake => text().nullable()(); TextColumn get motorcycleModel => text().nullable()(); RealColumn get calibrationRollOffset => real().withDefault(const Constant(0.0))(); RealColumn get calibrationPitchOffset => real().withDefault(const Constant(0.0))(); IntColumn get totalEvents => integer().withDefault(const Constant(0))(); IntColumn get anomalyCount => integer().withDefault(const Constant(0))(); BoolColumn get completed => boolean().withDefault(const Constant(false))(); TextColumn get healthSummaryJson => text().nullable()(); DateTimeColumn get createdAt => dateTime()(); } @TableIndex(name: 'field_test_events_ride_id_idx', columns: {#rideId}) @TableIndex(name: 'field_test_events_timestamp_idx', columns: {#timestamp}) @TableIndex(name: 'field_test_events_event_type_idx', columns: {#eventType}) @TableIndex(name: 'field_test_events_severity_idx', columns: {#severity}) class FieldTestEvents extends Table { IntColumn get id => integer().autoIncrement()(); IntColumn get rideId => integer().nullable().references(Rides, #id)(); IntColumn get sessionId => integer().nullable().references(FieldTestSessions, #id)(); DateTimeColumn get timestamp => dateTime()(); TextColumn get eventType => text()(); TextColumn get severity => text()(); TextColumn get message => text()(); DateTimeColumn get telemetryTimestamp => dateTime().nullable()(); IntColumn get gpsAgeMs => integer().nullable()(); RealColumn get speed => real().nullable()(); RealColumn get latitude => real().nullable()(); RealColumn get longitude => real().nullable()(); RealColumn get gpsAccuracy => real().nullable()(); RealColumn get leanAngle => real().nullable()(); RealColumn get longitudinalG => real().nullable()(); RealColumn get lateralG => real().nullable()(); RealColumn get overallConfidence => real().nullable()(); TextColumn get metadata => text().nullable()(); TextColumn get dataJson => text().nullable()(); } @TableIndex(name: 'field_test_summaries_ride_id_idx', columns: {#rideId}) class FieldTestSummaries extends Table { IntColumn get id => integer().autoIncrement()(); IntColumn get rideId => integer().references(Rides, #id)(); DateTimeColumn get startTime => dateTime()(); DateTimeColumn get endTime => dateTime().nullable()(); IntColumn get durationSeconds => integer().withDefault(const Constant(0))(); IntColumn get totalSamples => integer().withDefault(const Constant(0))(); IntColumn get validSamples => integer().withDefault(const Constant(0))(); IntColumn get suspectSamples => integer().withDefault(const Constant(0))(); IntColumn get rejectedSamples => integer().withDefault(const Constant(0))(); RealColumn get validPercentage => real().withDefault(const Constant(0.0))(); RealColumn get suspectPercentage => real().withDefault(const Constant(0.0))(); RealColumn get rejectedPercentage => real().withDefault(const Constant(0.0))(); IntColumn get gpsFixCount => integer().withDefault(const Constant(0))(); IntColumn get gpsStaleEventCount => integer().withDefault(const Constant(0))(); IntColumn get gpsJumpRejectCount => integer().withDefault(const Constant(0))(); IntColumn get maxGpsAgeMs => integer().nullable()(); RealColumn get averageGpsAccuracy => real().nullable()(); RealColumn get worstGpsAccuracy => real().nullable()(); IntColumn get telemetryGapCount => integer().withDefault(const Constant(0))(); IntColumn get maxTelemetryGapMs => integer().nullable()(); IntColumn get imuSaturationCount => integer().withDefault(const Constant(0))(); RealColumn get maxSpeedMph => real().nullable()(); RealColumn get maxLeanAngle => real().nullable()(); RealColumn get maxLongitudinalG => real().nullable()(); RealColumn get maxLateralG => real().nullable()(); IntColumn get accelerationEventCount => integer().withDefault(const Constant(0))(); IntColumn get brakingEventCount => integer().withDefault(const Constant(0))(); IntColumn get zeroTo60Count => integer().withDefault(const Constant(0))(); IntColumn get zeroTo100Count => integer().withDefault(const Constant(0))(); RealColumn get bestZeroTo60 => real().nullable()(); RealColumn get bestZeroTo100 => real().nullable()(); IntColumn get databaseSamplesWritten => integer().withDefault(const Constant(0))(); IntColumn get databaseSamplesLost => integer().withDefault(const Constant(0))(); IntColumn get eventCount => integer().withDefault(const Constant(0))(); RealColumn get overallConfidence => real().nullable()(); IntColumn get rideQualityScore => integer().withDefault(const Constant(0))(); TextColumn get rideQualityRating => text().withDefault(const Constant('INVALID'))(); BoolColumn get wasRecoveredAfterCrash => boolean().withDefault(const Constant(false))(); BoolColumn get wasInterrupted => boolean().withDefault(const Constant(false))(); TextColumn get exportIntegrity => text().nullable()(); } class FieldTestGpsRecords extends Table { IntColumn get id => integer().autoIncrement()(); IntColumn get sessionId => integer().references(FieldTestSessions, #id)(); DateTimeColumn get timestamp => dateTime()(); RealColumn get latitude => real()(); RealColumn get longitude => real()(); RealColumn get altitude => real().nullable()(); RealColumn get rawSpeed => real().nullable()(); RealColumn get filteredSpeed => real().nullable()(); RealColumn get heading => real().nullable()(); RealColumn get accuracy => real().nullable()(); TextColumn get gpsHealth => text()(); BoolColumn get accepted => boolean()(); TextColumn get rejectionReason => text().nullable()(); } class FieldTestImuRecords extends Table { IntColumn get id => integer().autoIncrement()(); IntColumn get sessionId => integer().references(FieldTestSessions, #id)(); DateTimeColumn get timestamp => dateTime()(); RealColumn get accelerometerX => real().nullable()(); RealColumn get accelerometerY => real().nullable()(); RealColumn get accelerometerZ => real().nullable()(); RealColumn get gyroX => real().nullable()(); RealColumn get gyroY => real().nullable()(); RealColumn get gyroZ => real().nullable()(); RealColumn get roll => real().nullable()(); RealColumn get pitch => real().nullable()(); RealColumn get longitudinalG => real().nullable()(); RealColumn get lateralG => real().nullable()(); RealColumn get filteredLongitudinalG => real().nullable()(); RealColumn get filteredLateralG => real().nullable()(); }