package main import ( "context" "flag" "fmt" "log" "os" "time" "github.com/google/uuid" "github.com/jackc/pgx/v5/pgxpool" "github.com/breakpilot/school-service/internal/seed" ) func main() { // Parse command line flags teacherIDStr := flag.String("teacher-id", "", "Teacher UUID (required)") dbURL := flag.String("db", "", "Database URL (or set DATABASE_URL env var)") flag.Parse() // Get database URL databaseURL := *dbURL if databaseURL == "" { databaseURL = os.Getenv("DATABASE_URL") } if databaseURL == "" { databaseURL = "postgres://postgres:postgres@localhost:5432/school_service?sslmode=disable" } // Get teacher ID var teacherID uuid.UUID if *teacherIDStr == "" { // Use a default demo teacher ID if not provided teacherID = uuid.MustParse("e9484ad9-32ee-4f2b-a4e1-d182e02ccf20") log.Printf("Using default teacher ID: %s", teacherID) } else { var err error teacherID, err = uuid.Parse(*teacherIDStr) if err != nil { log.Fatalf("Invalid teacher ID: %v", err) } } // Connect to database ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute) defer cancel() config, err := pgxpool.ParseConfig(databaseURL) if err != nil { log.Fatalf("Unable to parse database URL: %v", err) } pool, err := pgxpool.NewWithConfig(ctx, config) if err != nil { log.Fatalf("Unable to connect to database: %v", err) } defer pool.Close() // Test connection if err := pool.Ping(ctx); err != nil { log.Fatalf("Unable to ping database: %v", err) } fmt.Println("==============================================") fmt.Println(" School Service - Seed Data Generator") fmt.Println("==============================================") fmt.Printf("Teacher ID: %s\n", teacherID) fmt.Printf("Database: %s\n", databaseURL) fmt.Println() // Run seeder seeder := seed.NewSeeder(pool, teacherID) if err := seeder.SeedAll(ctx); err != nil { log.Fatalf("Seeding failed: %v", err) } fmt.Println() fmt.Println("==============================================") fmt.Println(" Seed Data Generation Complete!") fmt.Println("==============================================") fmt.Println() fmt.Println("Created:") fmt.Println(" - 3 School Years (2022/23, 2023/24, 2024/25)") fmt.Println(" - 6 Classes per year (5a, 5b, 6a, 6b, 7a, 7b)") fmt.Println(" - 15-25 Students per class") fmt.Println(" - 10 Subjects") fmt.Println(" - Exam results with realistic grade distribution") fmt.Println(" - Attendance records") fmt.Println() }