import AppCore
import Defaults
import Keychain
import Foundation
import Dependencies
import AppResources
import XXMessengerClient

final class SettingsDeleteViewModel {
  @Dependency(\.keychain) var keychain: KeychainManager
  @Dependency(\.app.dbManager) var dbManager: DBManager
  @Dependency(\.app.messenger) var messenger: Messenger
  @Dependency(\.app.hudManager) var hudManager: HUDManager
  @KeyObject(.username, defaultValue: nil) var username: String?

  private var isCurrentlyDeleting = false
  
  func didTapDelete() {
    guard isCurrentlyDeleting == false else { return }
    isCurrentlyDeleting = true

    hudManager.show()
    
    do {
      try cleanUD()
      try messenger.destroy()
      try keychain.destroy()
      try dbManager.removeDB()

      UserDefaults.resetStandardUserDefaults()
      UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
      UserDefaults.standard.synchronize()

      hudManager.show(.init(
        title: Localized.Settings.Delete.Success.title,
        content: Localized.Settings.Delete.Success.subtitle
      ))
    } catch {
      DispatchQueue.main.async { [weak self] in
        guard let self else { return }
        self.hudManager.show(.init(error: error))
      }
    }
  }
  
  private func cleanUD() throws {
    try messenger.ud.get()!.permanentDeleteAccount(
      username: .init(type: .username, value: username!)
    )
  }
}