import Foundation struct AppState { var session = SessionState() var profile = ProfileState() var cart = CartState() var address = AddressState() var favorites = FavoritesState() var activeModal: AppModal? = nil } enum AppModal: String, Identifiable { case addressPicker case filters var id: String { rawValue } } struct SessionState { var isAuthenticated: Bool = false var jwt: String? = nil } struct ProfileState { var id: String? = nil var name: String = "" var email: String = "" var phone: String = "" } struct AddressState { var selectedId: String? = nil var display: String = "Defina seu endereco" var latitude: Double? = nil var longitude: Double? = nil var onboardingMessage: String? = nil } struct FavoritesState { var storeIds: Set = [] } struct CartState { var storeId: String? = nil var storeName: String? = nil var items: [CartItemState] = [] var total: Double = 0 } struct CartItemState: Identifiable { let id: String var productId: String var storeId: String var name: String var details: String? = nil var quantity: Int var unitPrice: Double } extension CartState { var totalItems: Int { items.reduce(0) { $0 + $1.quantity } } mutating func recalculateTotal() { total = items.reduce(0) { $0 + (Double($1.quantity) * $1.unitPrice) } } mutating func clear() { storeId = nil storeName = nil items = [] total = 0 } mutating func add(item: CartItemState) { if let index = items.firstIndex(where: { $0.id == item.id }) { items[index].quantity += item.quantity } else { items.append(item) } recalculateTotal() } mutating func set(item: CartItemState) { if let index = items.firstIndex(where: { $0.id == item.id }) { if item.quantity <= 0 { items.remove(at: index) } else { items[index] = item } } else if item.quantity > 0 { items.append(item) } if items.isEmpty { storeId = nil storeName = nil } recalculateTotal() } mutating func increment(itemId: String) { guard let index = items.firstIndex(where: { $0.id == itemId }) else { return } items[index].quantity += 1 recalculateTotal() } mutating func decrement(itemId: String) { guard let index = items.firstIndex(where: { $0.id == itemId }) else { return } items[index].quantity -= 1 if items[index].quantity <= 0 { items.remove(at: index) } if items.isEmpty { storeId = nil storeName = nil } recalculateTotal() } }