import Foundation enum AutoCompleter { /// Finds the next card that can be auto-moved to a foundation. /// Returns the source location and foundation index, or nil if no move is available. static func findNextAutoMove(state: GameSnapshot, rules: GameRules) -> (from: CardLocation, to: CardLocation)? { // Check waste pile if let topWaste = state.waste.last { for (i, foundation) in state.foundations.enumerated() { if MoveValidator.canPlaceOnFoundation(topWaste, topCard: foundation.last) { return (.waste, .foundation(i)) } } } // Check free cells for (cellIndex, cell) in state.freeCells.enumerated() { guard let card = cell else { continue } for (i, foundation) in state.foundations.enumerated() { if MoveValidator.canPlaceOnFoundation(card, topCard: foundation.last) { return (.freeCell(cellIndex), .foundation(i)) } } } // Check tableau tops for (tabIndex, tableau) in state.tableaus.enumerated() { guard let topCard = tableau.last, topCard.isFaceUp else { continue } for (i, foundation) in state.foundations.enumerated() { if MoveValidator.canPlaceOnFoundation(topCard, topCard: foundation.last) { return (.tableau(tabIndex), .foundation(i)) } } } return nil } }