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()(); }