using Microsoft.EntityFrameworkCore; namespace RR3CommunityServer.Data; public class RR3DbContext : DbContext { public RR3DbContext(DbContextOptions options) : base(options) { } public DbSet Devices { get; set; } public DbSet Users { get; set; } public DbSet Sessions { get; set; } public DbSet Purchases { get; set; } public DbSet CatalogItems { get; set; } public DbSet DailyRewards { get; set; } public DbSet TimeTrials { get; set; } public DbSet TimeTrialResults { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // Seed some default catalog items modelBuilder.Entity().HasData( new CatalogItem { Id = 1, Sku = "com.ea.rr3.gold_1000", Name = "1000 Gold", Type = "currency", Price = 0.99m, Available = true }, new CatalogItem { Id = 2, Sku = "com.ea.rr3.car_tier1", Name = "Starter Car", Type = "car", Price = 0m, Available = true }, new CatalogItem { Id = 3, Sku = "com.ea.rr3.upgrade_engine", Name = "Engine Upgrade", Type = "upgrade", Price = 4.99m, Available = true } ); // Seed gold purchase options modelBuilder.Entity().HasData( new CatalogItem { Id = 4, Sku = "com.ea.rr3.gold_100", Name = "100 Gold", Type = "currency", Price = 0m, // FREE in community server Available = true }, new CatalogItem { Id = 5, Sku = "com.ea.rr3.gold_500", Name = "500 Gold", Type = "currency", Price = 0m, Available = true }, new CatalogItem { Id = 6, Sku = "com.ea.rr3.gold_1000", Name = "1000 Gold", Type = "currency", Price = 0m, Available = true }, new CatalogItem { Id = 7, Sku = "com.ea.rr3.gold_5000", Name = "5000 Gold", Type = "currency", Price = 0m, Available = true } ); // Seed time trials modelBuilder.Entity().HasData( new TimeTrial { Id = 1, Name = "Daily Sprint Challenge", TrackName = "Silverstone National", CarName = "Any Car", StartDate = DateTime.UtcNow, EndDate = DateTime.UtcNow.AddDays(7), TargetTime = 90.5, GoldReward = 50, CashReward = 10000, Active = true }, new TimeTrial { Id = 2, Name = "Speed Demon Trial", TrackName = "Dubai Autodrome", CarName = "Any Car", StartDate = DateTime.UtcNow, EndDate = DateTime.UtcNow.AddDays(7), TargetTime = 120.0, GoldReward = 100, CashReward = 25000, Active = true } ); } } // Database entities public class Device { public int Id { get; set; } public string DeviceId { get; set; } = string.Empty; public string HardwareId { get; set; } = string.Empty; public DateTime CreatedAt { get; set; } = DateTime.UtcNow; public DateTime LastSeenAt { get; set; } = DateTime.UtcNow; } public class User { public int Id { get; set; } public string SynergyId { get; set; } = string.Empty; public string? DeviceId { get; set; } public DateTime CreatedAt { get; set; } = DateTime.UtcNow; public string? Nickname { get; set; } public int? Gold { get; set; } = 0; public int? Cash { get; set; } = 0; } public class Session { public int Id { get; set; } public string SessionId { get; set; } = string.Empty; public string? SynergyId { get; set; } public string DeviceId { get; set; } = string.Empty; public int? UserId { get; set; } public DateTime CreatedAt { get; set; } = DateTime.UtcNow; public DateTime ExpiresAt { get; set; } } public class Purchase { public int Id { get; set; } public string SynergyId { get; set; } = string.Empty; public string ItemId { get; set; } = string.Empty; public string Sku { get; set; } = string.Empty; public string OrderId { get; set; } = string.Empty; public DateTime PurchaseTime { get; set; } = DateTime.UtcNow; public string Token { get; set; } = string.Empty; public decimal Price { get; set; } public string Status { get; set; } = "approved"; // For web panel display public int? UserId { get; set; } public DateTime PurchaseDate => PurchaseTime; } public class CatalogItem { public int Id { get; set; } public string Sku { get; set; } = string.Empty; public string Name { get; set; } = string.Empty; public string Type { get; set; } = string.Empty; public decimal Price { get; set; } public bool Available { get; set; } = true; } public class DailyReward { public int Id { get; set; } public int UserId { get; set; } public DateTime RewardDate { get; set; } public int GoldAmount { get; set; } public int CashAmount { get; set; } public bool Claimed { get; set; } public DateTime? ClaimedAt { get; set; } public int Streak { get; set; } } public class TimeTrial { public int Id { get; set; } public string Name { get; set; } = string.Empty; public string TrackName { get; set; } = string.Empty; public string CarName { get; set; } = string.Empty; public DateTime StartDate { get; set; } public DateTime EndDate { get; set; } public double TargetTime { get; set; } public int GoldReward { get; set; } public int CashReward { get; set; } public bool Active { get; set; } = true; } public class TimeTrialResult { public int Id { get; set; } public int UserId { get; set; } public int TimeTrialId { get; set; } public double TimeSeconds { get; set; } public DateTime SubmittedAt { get; set; } public bool BeatTarget { get; set; } public int GoldEarned { get; set; } public int CashEarned { get; set; } }