# Onboarding System Implementation Summary

## Overview

A comprehensive, non-intrusive onboarding system has been implemented for both Blackjack and Baccarat games. The system provides a great first-time user experience without annoying experienced players.

## Components Created (in CasinoKit)

### 1. OnboardingState.swift
- Tracks first-time user progress
- Manages which hints have been shown
- Persists state to UserDefaults
- Supports tutorial mode (replay hints)
- Game-specific identifiers (separate state per game)

**Key Methods:**
- `shouldShowHint(key:)` - Check if hint should be displayed
- `markHintShown(key:)` - Mark hint as seen (persisted)
- `completeWelcome()` - Mark welcome sheet as completed
- `startTutorialMode()` / `endTutorialMode()` - Enable/disable tutorial replay
- `reset()` - Clear all onboarding data (for testing)

### 2. WelcomeSheet.swift
- First-launch welcome screen
- Lists key features with icons
- Two CTAs: "Show Me How" (tutorial) or "Start Playing" (skip)
- Automatically shows game emoji (🃏 for Blackjack, 🎴 for Baccarat)
- Fully localized

### 3. ContextualTooltip.swift
- In-game hint tooltips
- Appears at the right moment
- "Got it" button to dismiss
- Animated entry/exit
- Automatically marks hint as shown on dismiss
- View modifier for easy integration

### 4. PulsingModifier.swift
- Visual pulse animation to draw attention
- Optional enhancement for interactive elements
- Configurable color and scale
- Currently available but not actively used (can be added later)

## Integration in Games

### Blackjack

**Welcome Sheet Features:**
1. Beat the Dealer - Get closer to 21
2. Learn Strategy - Built-in hints
3. Practice Free - Start with $1,000
4. Customize Rules - Change settings

**Contextual Hints:**
- **Betting Zone**: "Tap chips, then tap here to bet" (when entering betting phase for first time)
- **Deal Button**: "Tap Deal to start the round" (after placing first bet)
- **Player Actions**: "Choose your action based on the hint above" (during first player turn)

### Baccarat

**Welcome Sheet Features:**
1. Bet on Player, Banker, or Tie
2. Track Patterns - Road maps show history
3. Practice Free - Start with $1,000
4. Customize Settings - Change table limits

**Contextual Hints:**
- **Betting Zone**: "Tap chips, then tap a betting zone" (when entering betting phase for first time)
- **Deal Button**: "Tap Deal to start the round" (after placing first bet)
- **Result Display**: "Results appear here, then in the road maps below" (after first round completes)

## Settings Changes

Both games now default to more beginner-friendly settings:

| Setting | Old Default | New Default |
|---------|-------------|-------------|
| Table Limits | Low Stakes ($10-$1,000) | Casual ($5-$500) |
| Starting Balance | $10,000 | $1,000 |

**Rationale:**
- Lower minimum bet ($5) is less intimidating for beginners
- $1,000 balance creates more meaningful decisions (not too much/little)
- Still allows ~200 hands at $5/hand for good learning experience
- Users can always increase in settings

## Bug Fix

**Blackjack Late Surrender:**
- Fixed inconsistency where `resetToDefaults()` set it to `true` but Vegas preset overrode to `false`
- Now correctly defaults to `false` to match Vegas rules

## User Flow

### First Launch:
1. App loads
2. Welcome sheet appears automatically after 500ms delay
3. User chooses:
   - **"Show Me How"**: Enables tutorial mode, shows contextual hints during first round
   - **"Start Playing"**: Skips tutorial, hints still appear once naturally during gameplay

### Subsequent Launches:
- Welcome sheet never shows again
- Contextual hints appear once at the right moment
- Each hint only shows once per hint key
- Completely transparent to returning users

### Tutorial Mode:
- User can replay tutorial by tapping "Show Me How" on welcome
- All hints re-enabled for that session
- Tutorial mode doesn't persist across app launches

## Technical Details

### Hint Timing
- Hints are shown with delays using `Task.sleep(for:)` on MainActor
- Animations use spring duration for smooth transitions
- onChange modifiers trigger hints based on game state changes

### Persistence
- Uses UserDefaults with game-specific keys
- Format: `"onboarding.{gameIdentifier}.{property}"`
- Examples: `"onboarding.blackjack.hasLaunched"`, `"onboarding.baccarat.hintsShown"`

### Thread Safety
- All onboarding state is @MainActor
- Safe to use from SwiftUI views
- No threading concerns

## Documentation Updates

### Blackjack README
- Added "First-Time User Experience" section at top of features
- Documents welcome sheet, tutorial mode, and contextual hints

### Baccarat README
- Added "First-Time User Experience" section at top of features
- Same structure as Blackjack for consistency

### CasinoKit README
- New "Onboarding & Tutorials" section with full API documentation
- Code examples for WelcomeSheet, ContextualTooltip, OnboardingState
- Updated file structure to show new components
- Added Blackjack to "Apps Using CasinoKit" list

## Best Practices Followed

✅ **Non-intrusive**: All onboarding is skippable
✅ **One-time only**: Hints never show twice (unless tutorial mode)
✅ **Right moment**: Hints appear contextually, not all at once
✅ **Short & visual**: Messages are concise with icons
✅ **Localized**: All strings use String Catalog
✅ **Accessible**: Uses standard SwiftUI components
✅ **Persistent**: User's progress is saved
✅ **Game-specific**: Each game has independent onboarding state

## Testing Recommendations

### Manual Testing:
1. **Fresh install**: Delete app, reinstall, verify welcome sheet appears
2. **Tutorial mode**: Tap "Show Me How", verify hints appear in sequence
3. **Skip mode**: Tap "Start Playing", verify hints still appear once naturally
4. **Second launch**: Relaunch app, verify welcome doesn't show again
5. **Settings reset**: Check if onboarding can be reset (could add to settings)

### Reset for Testing:
Add this to a development menu if needed:
```swift
Button("Reset Onboarding") {
    gameState.onboarding.reset()
}
```

## Future Enhancements (Not Implemented)

These could be added later if desired:

1. **Progressive discovery hints**: Tips after 5/10/20 hands
   - "Enable card counting in settings" (Blackjack)
   - "Side bets offer bigger payouts" (both games)
   
2. **Onboarding analytics**: Track which hints are most helpful

3. **User-requested replay**: "Show tutorial again" in settings

4. **Pulsing hints**: Use PulsingModifier on interactive elements during tutorial

5. **Accessibility announcements**: Post VoiceOver announcements for key moments

## Files Created

```
CasinoKit/Sources/CasinoKit/
├── Models/OnboardingState.swift
└── Views/
    ├── ContextualTooltip.swift
    ├── WelcomeSheet.swift
    └── PulsingModifier.swift
```

## Files Modified

```
Blackjack/
├── Models/GameSettings.swift (defaults changed, bug fix)
├── Engine/GameState.swift (added onboarding property)
└── Views/Game/GameTableView.swift (integrated onboarding UI)

Baccarat/
├── Models/GameSettings.swift (defaults changed)
├── Engine/GameState.swift (added onboarding property)
└── Views/Game/GameTableView.swift (integrated onboarding UI)

README Files:
├── Blackjack/README.md
├── Baccarat/README.md
└── CasinoKit/README.md
```

## Conclusion

The onboarding system provides a polished first-time user experience that:
- Helps new users understand the game quickly
- Never annoys experienced players
- Maintains the premium feel of the apps
- Follows iOS best practices
- Is fully reusable for future casino games

All code follows the project's Swift/SwiftUI guidelines, uses design constants, and includes proper accessibility support.

