import HUD
import Combine
import Defaults
import Foundation
import XXClient
import XXMessengerClient
import DependencyInjection
import Models

final class AccountDeleteViewModel {
    @Dependency var messenger: Messenger

    @KeyObject(.username, defaultValue: nil) var username: String?

    var deleting = false

    var hud: AnyPublisher<HUDStatus, Never> { hudRelay.eraseToAnyPublisher() }
    private let hudRelay = CurrentValueSubject<HUDStatus, Never>(.none)

    func didTapDelete() {
        guard deleting == false else { return }
        deleting = true

        DispatchQueue.main.async { [weak self] in
            self?.hudRelay.send(.on)
        }

        do {
            let fact = Fact(fact: username!, type: FactType.username.rawValue)
            try messenger.ud.get()!.permanentDeleteAccount(username: fact)
            try messenger.destroy()

            DispatchQueue.main.async { [weak self] in
                self?.hudRelay.send(.error(.init(
                    content: "Now kill the app and re-open",
                    title: "Account deleted",
                    dismissable: false
                )))
            }
        } catch {
            DispatchQueue.main.async { [weak self] in
                self?.hudRelay.send(.error(.init(with: error)))
            }
        }
    }
}