import UIKit
import Shared
import Combine
import AppResources
import AppNavigation
import DrawerFeature
import ComposableArchitecture

public final class RestoreListController: UIViewController {
  @Dependency(\.navigator) var navigator

  private lazy var screenView = RestoreListView()

  private let viewModel = RestoreListViewModel()
  private var cancellables = Set<AnyCancellable>()
  private var drawerCancellables = Set<AnyCancellable>()

  public override func loadView() {
    view = screenView
    presentWarning()
  }

  public override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    navigationItem.backButtonTitle = ""
    navigationController?.navigationBar.customize(translucent: true)
  }

  public override func viewDidLoad() {
    super.viewDidLoad()

    viewModel
      .sftpPublisher
      .receive(on: DispatchQueue.main)
      .sink { [unowned self] _ in
        navigator.perform(PresentSFTP(completion: { [weak self] host, username, password in
          guard let self else { return }
          self.viewModel.setupSFTP(host: host, username: username, password: password)
        }, on: navigationController!))
      }.store(in: &cancellables)

    viewModel.detailsPublisher
      .receive(on: DispatchQueue.main)
      .sink { [unowned self] _ in
//        coordinator.toRestore(with: $0, from: self)
      }.store(in: &cancellables)

    screenView.cancelButton
      .publisher(for: .touchUpInside)
      .sink { [unowned self] in didTapBack() }
      .store(in: &cancellables)

    screenView.driveButton
      .publisher(for: .touchUpInside)
      .sink { [unowned self] in
        viewModel.link(provider: .drive, from: self) { [weak self] in
          guard let self else { return }
          self.viewModel.fetch(provider: .drive)
        }
      }.store(in: &cancellables)

    screenView.icloudButton
      .publisher(for: .touchUpInside)
      .sink { [unowned self] in
        viewModel.link(provider: .icloud, from: self) { [weak self] in
          guard let self else { return }
          self.viewModel.fetch(provider: .icloud)
        }
      }.store(in: &cancellables)

    screenView.dropboxButton
      .publisher(for: .touchUpInside)
      .sink { [unowned self] in
        viewModel.link(provider: .dropbox, from: self) { [weak self] in
          guard let self else { return }
          self.viewModel.fetch(provider: .dropbox)
        }
      }.store(in: &cancellables)

    screenView.sftpButton
      .publisher(for: .touchUpInside)
      .sink { [unowned self] in
        viewModel.link(provider: .sftp, from: self) {}
      }.store(in: &cancellables)
  }

  @objc private func didTapBack() {
    navigationController?.popViewController(animated: true)
  }
}

extension RestoreListController {
  private func presentWarning() {
    let actionButton = DrawerCapsuleButton(model: .init(
      title: Localized.AccountRestore.Warning.action,
      style: .brandColored
    ))

    actionButton
      .action
      .receive(on: DispatchQueue.main)
      .sink { [unowned self] in
        navigator.perform(DismissModal(from: self)) { [weak self] in
          guard let self else { return }
          self.drawerCancellables.removeAll()
        }
      }.store(in: &drawerCancellables)

    navigator.perform(PresentDrawer(items: [
      DrawerText(
        font: Fonts.Mulish.bold.font(size: 26.0),
        text: Localized.AccountRestore.Warning.title,
        spacingAfter: 19
      ),
      DrawerText(
        text: Localized.AccountRestore.Warning.subtitle,
        spacingAfter: 37
      ),
      actionButton
    ], isDismissable: true, from: self))
  }
}