import 'package:drift/drift.dart'; class Rides extends Table { IntColumn get id => integer().autoIncrement()(); 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()(); // Phase 2 additions RealColumn get distance => real().withDefault(const Constant(0.0))(); // Total distance (e.g., meters) IntColumn get movingTime => integer().withDefault(const Constant(0))(); // seconds IntColumn get stoppedTime => integer().withDefault(const Constant(0))(); // seconds 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))(); // Phase 3 additions: Motorcycle association 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()(); // MPH 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()(); // e.g. "Hard Braking", "Extreme Corner" 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()(); // "0-60" or "0-100" 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()(); } class FieldTestEvents extends Table { IntColumn get id => integer().autoIncrement()(); IntColumn get sessionId => integer().references(FieldTestSessions, #id)(); DateTimeColumn get timestamp => dateTime()(); TextColumn get eventType => text()(); TextColumn get severity => text()(); TextColumn get message => text()(); TextColumn get dataJson => 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()(); }