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 imageURL: String? = nil var details: String? = nil var addons: [CartItemAddonState] = [] var quantity: Int var unitPrice: Double } struct CartItemAddonState: Identifiable, Hashable { let id: String var name: String 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 SessionStateStore.clearCart() } 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() SessionStateStore.saveCart(self) } 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() if items.isEmpty { SessionStateStore.clearCart() } else { SessionStateStore.saveCart(self) } } mutating func increment(itemId: String) { guard let index = items.firstIndex(where: { $0.id == itemId }) else { return } items[index].quantity += 1 recalculateTotal() SessionStateStore.saveCart(self) } 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() if items.isEmpty { SessionStateStore.clearCart() } else { SessionStateStore.saveCart(self) } } func toOrderItemsPayload() -> [CreateOrderItemPayload] { items.map { item in CreateOrderItemPayload( productId: item.productId, name: item.name, qty: item.quantity, price: item.unitPrice, addons: item.addons .filter { $0.quantity > 0 } .map { CreateOrderAddonPayload( addonId: $0.id, name: $0.name, qty: $0.quantity, price: $0.unitPrice ) } ) } } }