// 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 encapsulating the Tulsi generator config wizard.
final class ConfigEditorWizardViewController: NSViewController, NSPageControllerDelegate {
  // The storyboard identifiers for the wizard subpage view controllers.
  static let wizardPageIdentifiers = [
      "BUILDTargetSelect",
      "Options",
      "SourceTargetSelect",
  ]
  static let LastPageIndex = wizardPageIdentifiers.count - 1
  var pageViewController: NSPageController! = nil

  @IBOutlet weak var previousButton: NSButton!
  @IBOutlet weak var nextButton: NSButton!

  override var representedObject: Any? {
    didSet {
      // Update the current wizard page, if any.
      pageViewController?.selectedViewController?.representedObject = representedObject
    }
  }

  override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
    if segue.identifier! == "Embed Wizard PageController" {
      pageViewController = (segue.destinationController as! NSPageController)
      pageViewController.arrangedObjects = ConfigEditorWizardViewController.wizardPageIdentifiers
      pageViewController.delegate = self
    }
    super.prepare(for: segue, sender: sender)
  }

  func setNextButtonEnabled(_ enabled: Bool) {
    nextButton.isEnabled = enabled
  }

  func updateNextButton() {
    if pageViewController.selectedIndex == 0 {
      let document = representedObject as! TulsiGeneratorConfigDocument
      nextButton.isEnabled = document.selectedRuleInfoCount > 0
    }
  }

  @IBAction func cancel(_ sender: AnyObject?) {
    let document = representedObject as! TulsiGeneratorConfigDocument
    do {
      try document.revert()
    } catch {
      // Nothing useful can be done here with failures to revert so the exception is ignored.
    }
    document.close()
  }

  @IBAction func next(_ sender: NSButton? = nil) {
    if let deactivatingSubview = pageViewController.selectedViewController as? WizardSubviewProtocol, deactivatingSubview.shouldWizardSubviewDeactivateMovingForward?() == false {
      return
    }

    var selectedIndex = pageViewController.selectedIndex
    if selectedIndex >= ConfigEditorWizardViewController.LastPageIndex {
      let document = representedObject as! TulsiGeneratorConfigDocument
      document.save() { (canceled, error) in
        if !canceled && error == nil {
          document.close()
        }
      }
      return
    }

    pageViewController!.navigateForward(sender)
    selectedIndex += 1
    previousButton.isHidden = false

    if selectedIndex == ConfigEditorWizardViewController.LastPageIndex {
      nextButton.title = NSLocalizedString("Wizard_SaveConfig",
                                           comment: "Label for action button to be used to go to the final page in the project wizard.")
    }
  }

  @IBAction func previous(_ sender: NSButton? = nil) {
    if let deactivatingSubview = pageViewController.selectedViewController as? WizardSubviewProtocol, deactivatingSubview.shouldWizardSubviewDeactivateMovingBackward?() == false {
      return
    }

    var selectedIndex = pageViewController!.selectedIndex
    if selectedIndex > 0 {
      previousButton.isHidden = selectedIndex <= 1
      pageViewController!.navigateBack(sender)
      selectedIndex -= 1
      nextButton.isEnabled = true

      if selectedIndex < ConfigEditorWizardViewController.LastPageIndex {
        nextButton.title = NSLocalizedString("Wizard_Next",
                                             comment: "Label for action button to be used to go to the next page in the project wizard.")
      }
    }
  }

  // MARK: - NSPageControllerDelegate

  func pageController(_ pageController: NSPageController, identifierFor object: Any) -> NSPageController.ObjectIdentifier {
    return object as! NSPageController.ObjectIdentifier
  }

  func pageController(_ pageController: NSPageController, viewControllerForIdentifier identifier: NSPageController.ObjectIdentifier) -> NSViewController {
    let vc = storyboard!.instantiateController(withIdentifier: identifier) as! NSViewController

    // NSPageController doesn't appear to support Autolayout properly, so fall back to
    // autoresizingMask.
    vc.view.autoresizingMask = [NSView.AutoresizingMask.width, NSView.AutoresizingMask.height]
    return vc
  }

  func pageController(_ pageController: NSPageController,
                      prepare viewController: NSViewController,
                      with object: Any?) {
    _pageController(pageController, prepareViewController: viewController, withObject: object! as AnyObject)
  }

  private func _pageController(_ pageController: NSPageController,
                               prepareViewController viewController: NSViewController,
                               withObject object: AnyObject) {
    // By default, the viewController will have its representedObject set to the currently selected
    // member of the pageController's arrangedObjects. Wizard pages need to represent the underlying
    // TulsiDocument, so it's set here.
    viewController.representedObject = representedObject

    // This index is guaranteed to exist due to fixed number of pages we have.
    let newPageIndex = ConfigEditorWizardViewController.wizardPageIdentifiers.index(of: object as! String)!
    let subview = viewController as? WizardSubviewProtocol
    subview?.presentingWizardViewController = self
    if pageController.selectedIndex < newPageIndex {
      subview?.wizardSubviewWillActivateMovingForward?()
    } else if pageController.selectedIndex > newPageIndex {
      subview?.wizardSubviewWillActivateMovingBackward?()
    }
  }

  func pageControllerDidEndLiveTransition(_ pageController: NSPageController) {
    if let subview = pageController.selectedViewController as? WizardSubviewProtocol {
      subview.wizardSubviewDidDeactivate?()
    }
    pageController.completeTransition()
  }
}

