import Foundation

@MainActor
final class WalletViewModel: ObservableObject {
    private let wallet: WalletRepository

    @Published private(set) var balance: WalletResponse?
    @Published private(set) var loading = false
    @Published private(set) var error: String?
    /// Set when a top-up session is created; the view opens it and then clears it.
    @Published var paymentURL: URL?

    init(wallet: WalletRepository) {
        self.wallet = wallet
    }

    func refresh() {
        run { self.balance = try await self.wallet.balance() }
    }

    func topUp(packageCode: String) {
        run {
            let payment = try await self.wallet.topUp(packageCode: packageCode)
            self.paymentURL = payment.paymentUrl.flatMap(URL.init(string:))
        }
    }

    private func run(_ operation: @escaping () async throws -> Void) {
        loading = true
        error = nil
        Task {
            do {
                try await operation()
            } catch let err {
                error = (err as? LocalizedError)?.errorDescription ?? err.localizedDescription
            }
            loading = false
        }
    }
}
