// // ScenarioPlanner.swift // SportsTime // // Protocol for scenario-based trip planning. // import Foundation /// Protocol that all scenario planners must implement. /// Each scenario (A, B, C) has its own isolated implementation. protocol ScenarioPlanner { /// Plan itineraries for this scenario. /// - Parameter request: The planning request with all inputs /// - Returns: Success with ranked itineraries, or explicit failure func plan(request: PlanningRequest) -> ItineraryResult } /// Factory for creating the appropriate scenario planner enum ScenarioPlannerFactory { /// Creates the appropriate planner based on the request inputs static func planner(for request: PlanningRequest) -> ScenarioPlanner { print("🔍 ScenarioPlannerFactory: Selecting planner...") print(" - followTeamId: \(request.preferences.followTeamId ?? "nil")") print(" - selectedGames.count: \(request.selectedGames.count)") print(" - startLocation: \(request.startLocation?.name ?? "nil")") print(" - endLocation: \(request.endLocation?.name ?? "nil")") // Scenario D: User wants to follow a specific team if request.preferences.followTeamId != nil { print("🔍 ScenarioPlannerFactory: → ScenarioDPlanner (follow team)") return ScenarioDPlanner() } // Scenario B: User selected specific games if !request.selectedGames.isEmpty { print("🔍 ScenarioPlannerFactory: → ScenarioBPlanner (selected games)") return ScenarioBPlanner() } // Scenario C: User specified start and end locations if request.startLocation != nil && request.endLocation != nil { print("🔍 ScenarioPlannerFactory: → ScenarioCPlanner (start/end locations)") return ScenarioCPlanner() } // Scenario A: Date range only (default) print("🔍 ScenarioPlannerFactory: → ScenarioAPlanner (default/date range)") return ScenarioAPlanner() } /// Classifies which scenario applies to this request static func classify(_ request: PlanningRequest) -> PlanningScenario { if request.preferences.followTeamId != nil { return .scenarioD } if !request.selectedGames.isEmpty { return .scenarioB } if request.startLocation != nil && request.endLocation != nil { return .scenarioC } return .scenarioA } }