import 'package:flutter/material.dart'; import 'package:latlong2/latlong.dart'; import 'package:rogapp/features/data/checkpoint.dart'; import 'package:rogapp/features/data/user_location.dart'; enum GameStatus { notStarted, started, inProgress, atCheckpoint, gameCompleted, } enum PendingAction { none, checkInPhoto, receiptPhoto, endGamePhoto, } @immutable class GameState { final GameStatus status; final List markers; final UserLocation? currentLocation; final Set visitedMarkers; final bool isWithinStartRadius; final bool hasLeftStartArea; final bool hasVisitedCheckpoint; final Feature? currentCheckpoint; final bool checkpointPhotoTaken; final bool receiptPhotoTaken; final PendingAction pendingAction; const GameState({ this.status = GameStatus.notStarted, this.markers = const [], this.currentLocation, this.visitedMarkers = const {}, this.isWithinStartRadius = false, this.hasLeftStartArea = false, this.hasVisitedCheckpoint = false, this.currentCheckpoint, this.checkpointPhotoTaken = false, this.receiptPhotoTaken = false, this.pendingAction = PendingAction.none, }); LatLng? getUserLatLng() { return currentLocation != null ? LatLng(currentLocation!.latitude, currentLocation!.longitude) : null; } GameState.fromMap(Map map) : status = GameStatus.values[map['status']], markers = List.from(map['markers'].map((x) => Feature.fromMap(x))), currentLocation = UserLocation.fromMap(map['currentLocation']), visitedMarkers = Set.from( map['visitedMarkers'].map((x) => Feature.fromMap(x))), isWithinStartRadius = map['isWithinStartRadius'], hasLeftStartArea = map['hasLeftStartArea'], hasVisitedCheckpoint = map['hasVisitedCheckpoint'], currentCheckpoint = map['currentCheckpoint'] != null ? Feature.fromMap(map['currentCheckpoint']) : null, checkpointPhotoTaken = map['checkpointPhotoTaken'], receiptPhotoTaken = map['receiptPhotoTaken'], pendingAction = PendingAction.values[map['pendingAction']]; GameState copyWith({ GameStatus? status, List? markers, UserLocation? currentLocation, Set? visitedMarkers, bool? isWithinStartRadius, bool? hasLeftStartArea, bool? hasVisitedCheckpoint, Feature? currentCheckpoint, bool? checkpointPhotoTaken, bool? receiptPhotoTaken, PendingAction? pendingAction, }) { return GameState( status: status ?? this.status, markers: markers ?? this.markers, currentLocation: currentLocation ?? this.currentLocation, visitedMarkers: visitedMarkers ?? this.visitedMarkers, isWithinStartRadius: isWithinStartRadius ?? this.isWithinStartRadius, hasLeftStartArea: hasLeftStartArea ?? this.hasLeftStartArea, hasVisitedCheckpoint: hasVisitedCheckpoint ?? this.hasVisitedCheckpoint, currentCheckpoint: currentCheckpoint ?? this.currentCheckpoint, checkpointPhotoTaken: checkpointPhotoTaken ?? this.checkpointPhotoTaken, receiptPhotoTaken: receiptPhotoTaken ?? this.receiptPhotoTaken, pendingAction: pendingAction ?? this.pendingAction); } }