package storage import ( "database/sql" "log" _ "modernc.org/sqlite" ) func InitDB(filepath string) *sql.DB { db, err := sql.Open("sqlite", filepath) if err != nil { log.Fatal("❌ Failed to open DB:", err) } createThunderballResultsTable := ` CREATE TABLE IF NOT EXISTS results_thunderball ( id INTEGER PRIMARY KEY AUTOINCREMENT, draw_date TEXT NOT NULL UNIQUE, machine TEXT, ballset TEXT, ball1 INTEGER, ball2 INTEGER, ball3 INTEGER, ball4 INTEGER, ball5 INTEGER, thunderball INTEGER );` if _, err := db.Exec(createThunderballResultsTable); err != nil { log.Fatal("❌ Failed to create Thunderball table:", err) } createThunderballPrizeTable := ` CREATE TABLE IF NOT EXISTS prizes_thunderball ( id INTEGER PRIMARY KEY AUTOINCREMENT, draw_id INTEGER NOT NULL, draw_date TEXT, prize1 TEXT, prize1_winners INTEGER, prize1_per_winner INTEGER, prize1_fund INTEGER, prize2 TEXT, prize2_winners INTEGER, prize2_per_winner INTEGER, prize2_fund INTEGER, prize3 TEXT, prize3_winners INTEGER, prize3_per_winner INTEGER, prize3_fund INTEGER, prize4 TEXT, prize4_winners INTEGER, prize4_per_winner INTEGER, prize4_fund INTEGER, prize5 TEXT, prize5_winners INTEGER, prize5_per_winner INTEGER, prize5_fund INTEGER, prize6 TEXT, prize6_winners INTEGER, prize6_per_winner INTEGER, prize6_fund INTEGER, prize7 TEXT, prize7_winners INTEGER, prize7_per_winner INTEGER, prize7_fund INTEGER, prize8 TEXT, prize8_winners INTEGER, prize8_per_winner INTEGER, prize8_fund INTEGER, prize9 TEXT, prize9_winners INTEGER, prize9_per_winner INTEGER, prize9_fund INTEGER, total_winners INTEGER, total_prize_fund INTEGER, FOREIGN KEY (draw_date) REFERENCES results_thunderball(draw_date) );` _, err = db.Exec(createThunderballPrizeTable) if err != nil { log.Fatal("❌ Failed to create Thunderball prize table:", err) } createLottoResultsTable := ` CREATE TABLE IF NOT EXISTS results_lotto ( id INTEGER PRIMARY KEY AUTOINCREMENT, draw_date TEXT NOT NULL UNIQUE, machine TEXT, ballset TEXT, ball1 INTEGER, ball2 INTEGER, ball3 INTEGER, ball4 INTEGER, ball5 INTEGER, ball6 INTEGER, bonusball INTEGER );` if _, err := db.Exec(createLottoResultsTable); err != nil { log.Fatal("❌ Failed to create Thunderball table:", err) } createMyTicketsTable := ` CREATE TABLE IF NOT EXISTS my_tickets ( id INTEGER PRIMARY KEY AUTOINCREMENT, userId INTEGER NOT NULL, game_type TEXT NOT NULL, draw_date TEXT NOT NULL, ball1 INTEGER, ball2 INTEGER, ball3 INTEGER, ball4 INTEGER, ball5 INTEGER, ball6 INTEGER, bonus1 INTEGER, bonus2 INTEGER, duplicate BOOLEAN DEFAULT 0, purchase_date TEXT, purchase_method TEXT, image_path TEXT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, matched_main INTEGER, matched_bonus INTEGER, prize_tier TEXT, is_winner BOOLEAN, prize_amount INTEGER, prize_label TEXT, FOREIGN KEY (userId) REFERENCES users(id) );` if _, err := db.Exec(createMyTicketsTable); err != nil { log.Fatal("❌ Failed to create MyTickets table:", err) } createUsersTable := ` CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL UNIQUE, password_hash TEXT NOT NULL );` if _, err := db.Exec(createUsersTable); err != nil { log.Fatal("❌ Failed to create Users table:", err) } createAuditLogTable := ` CREATE TABLE IF NOT EXISTS auditlog ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT, success INTEGER, timestamp TEXT );` if _, err := db.Exec(createAuditLogTable); err != nil { log.Fatal("❌ Failed to create Users table:", err) } createLogTicketMatchingTable := ` CREATE TABLE IF NOT EXISTS log_ticket_matching ( id INTEGER PRIMARY KEY AUTOINCREMENT, triggered_by TEXT, run_at DATETIME DEFAULT CURRENT_TIMESTAMP, tickets_matched INTEGER, winners_found INTEGER, notes TEXT );` if _, err := db.Exec(createLogTicketMatchingTable); err != nil { log.Fatal("❌ Failed to create ticket matching log table:", err) } return db }