// Copyright 2016 The Tulsi Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

import Cocoa


/// View controller allowing certain Bazel build targets from the project to be selected for Xcode
/// project generation.
final class ConfigEditorBuildTargetSelectorViewController: NSViewController, WizardSubviewProtocol {
  // This list needs to be kept up to date with whatever Bazel supports and determines the set of
  // user-selectable target types displayed in the Tulsi UI.
  // This filter does not limit Tulsi from generating targets for other types, however. Notably,
  // since watchos_applications are tightly bound to their host binary, Tulsi automatically
  // generates all targets referenced in an ios_application's "extensions" attribute rather than
  // risk the user accidentally selecting the extension without the host. For this reason,
  // ios_extension and watchos_extension are omitted as well.
  static let filteredFileTypes = [
      // Remove apple_ui_test and apple_unit_test once Tulsi has been released with support for
      // the new rule names.
      "apple_ui_test",
      "apple_unit_test",
      "cc_binary",
      "cc_library",
      "cc_test",
      "ios_app_clip",
      "ios_application",
      "ios_framework",
      "ios_legacy_test",
      "ios_ui_test",
      "ios_unit_test",
      "macos_application",
      "macos_bundle",
      "macos_command_line_application",
      "macos_extension",
      "macos_ui_test",
      "macos_unit_test",
      "objc_library",
      "swift_library",
      "test_suite",
      "tvos_application",
      "tvos_ui_test",
      "tvos_unit_test",
  ]

  @IBOutlet weak var buildTargetTable: NSTableView!

  @objc dynamic let typeFilter: NSPredicate? = NSPredicate.init(format: "(SELF.type IN %@) OR (SELF.selected == TRUE)",
                                                          argumentArray: [filteredFileTypes])

  @objc var selectedRuleInfoCount: Int = 0 {
    didSet {
      presentingWizardViewController?.setNextButtonEnabled(selectedRuleInfoCount > 0)
    }
  }

  override var representedObject: Any? {
    didSet {
      NSObject.unbind(NSBindingName(rawValue: "selectedRuleInfoCount"))
      guard let document = representedObject as? TulsiGeneratorConfigDocument else { return }
      bind(NSBindingName(rawValue: "selectedRuleInfoCount"),
           to: document,
           withKeyPath: "selectedRuleInfoCount",
           options: nil)
    }
  }

  deinit {
    NSObject.unbind(NSBindingName(rawValue: "selectedRuleInfoCount"))
  }

  override func loadView() {
    super.loadView()

    let typeColumn = buildTargetTable.tableColumn(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "Type"))!
    let labelColumn = buildTargetTable.tableColumn(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "Label"))!
    buildTargetTable.sortDescriptors = [typeColumn.sortDescriptorPrototype!,
                                        labelColumn.sortDescriptorPrototype!]
  }

  // MARK: - WizardSubviewProtocol

  weak var presentingWizardViewController: ConfigEditorWizardViewController? = nil {
    didSet {
      presentingWizardViewController?.setNextButtonEnabled(selectedRuleInfoCount > 0)
    }
  }

  func wizardSubviewDidDeactivate() {
    NSObject.unbind(NSBindingName(rawValue: "selectedRuleInfoCount"))
  }
}
