package storage import ( "database/sql" "log" "synlotto-website/internal/helpers" "synlotto-website/internal/models" ) func InsertTicket(db *sql.DB, ticket models.Ticket) error { var bonus1Val interface{} var bonus2Val interface{} if ticket.Bonus1 != nil { bonus1Val = helpers.Nullable(*ticket.Bonus1) } else { bonus1Val = nil } if ticket.Bonus2 != nil { bonus2Val = helpers.Nullable(*ticket.Bonus2) } else { bonus2Val = nil } // Use NULL-safe equality <=> for possible NULLs const dupQuery = ` SELECT COUNT(*) FROM my_tickets WHERE game_type = ? AND draw_date = ? AND ball1 = ? AND ball2 = ? AND ball3 = ? AND ball4 = ? AND ball5 = ? AND bonus1 <=> ? AND bonus2 <=> ?; ` var count int if err := db.QueryRow(dupQuery, ticket.GameType, ticket.DrawDate, ticket.Ball1, ticket.Ball2, ticket.Ball3, ticket.Ball4, ticket.Ball5, bonus1Val, bonus2Val, ).Scan(&count); err != nil { return err } isDuplicate := count > 0 const insert = ` INSERT INTO my_tickets ( game_type, draw_date, ball1, ball2, ball3, ball4, ball5, bonus1, bonus2, duplicate ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?); ` _, err := db.Exec(insert, ticket.GameType, ticket.DrawDate, ticket.Ball1, ticket.Ball2, ticket.Ball3, ticket.Ball4, ticket.Ball5, bonus1Val, bonus2Val, isDuplicate, ) if err != nil { log.Println("❌ Failed to insert ticket:", err) } else if isDuplicate { log.Println("⚠️ Duplicate ticket detected and flagged.") } return err }