// Copyright 2019-present the Material Components for iOS 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 Foundation
import MaterialComponents.MaterialAppBar
import MaterialComponents.MaterialAppBar_Theming 
import MaterialComponents.MaterialContainerScheme

class AppBarNavigationControllerExampleViewController:
  UIViewController,
  MDCAppBarNavigationControllerDelegate
{

  @objc var containerScheme: MDCContainerScheming = MDCContainerScheme()

  init() {
    super.init(nibName: nil, bundle: nil)

    self.title = "Navigation Controller"
  }

  required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
  }

  override func viewDidLoad() {
    super.viewDidLoad()

    self.view.backgroundColor = self.containerScheme.colorScheme.backgroundColor

    self.navigationItem.rightBarButtonItem =
      UIBarButtonItem(
        title: "Present",
        style: .done,
        target: self,
        action: #selector(presentModalAnimated))
  }

  @objc func presentModalAnimated() {
    presentModal(animated: true)
  }

  func presentModal(animated: Bool) {
    let contentViewController = PresentedViewController()
    let navigationController = MDCAppBarNavigationController()
    navigationController.shouldSetNavigationBarHiddenHideAppBar = true
    navigationController.delegate = self
    navigationController.pushViewController(contentViewController, animated: false)

    contentViewController.navigationItem.rightBarButtonItem =
      UIBarButtonItem(
        title: "Dismiss",
        style: .done,
        target: self,
        action: #selector(dismissModal))

    // Explicitly use the full-screen style to validate safe area insets behavior.
    navigationController.modalPresentationStyle = .fullScreen

    self.present(navigationController, animated: animated, completion: nil)
  }

  @objc func dismissModal() {
    dismiss(animated: true)
  }

  // MARK: - MDCAppBarNavigationControllerDelegate

  func appBarNavigationController(
    _ navigationController: MDCAppBarNavigationController,
    willAdd appBarViewController: MDCAppBarViewController,
    asChildOf viewController: UIViewController
  ) {
    appBarViewController.applyPrimaryTheme(withScheme: self.containerScheme)
  }
}

private class PresentedViewController: UITableViewController {

  init() {
    super.init(nibName: nil, bundle: nil)

    self.title = "Presented"

    self.navigationItem.leftBarButtonItem =
      UIBarButtonItem(
        title: "Toggle",
        style: .done,
        target: self,
        action: #selector(toggleVisibility))
  }

  required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
  }

  // MARK - Actions

  @objc func toggleVisibility() {
    guard let navigationController = navigationController else {
      return
    }
    navigationController.setNavigationBarHidden(
      !navigationController.isNavigationBarHidden,
      animated: true)
  }

  // MARK: - UITableViewDataSource

  override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 50
  }

  override func tableView(
    _ tableView: UITableView,
    cellForRowAt indexPath: IndexPath
  ) -> UITableViewCell {

    return self.tableView.dequeueReusableCell(withIdentifier: "cell")
      ?? UITableViewCell(style: .default, reuseIdentifier: "cell")
  }

  // MARK - UITableViewDelegate

  override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    toggleVisibility()

    tableView.deselectRow(at: indexPath, animated: true)
  }
}

// MARK: Catalog by convention
extension AppBarNavigationControllerExampleViewController {

  @objc class func catalogMetadata() -> [String: Any] {
    return [
      "breadcrumbs": ["App Bar", "Navigation Controller"],
      "primaryDemo": false,
      "presentable": true,
    ]
  }
}

// MARK: Snapshot testing by convention
extension AppBarNavigationControllerExampleViewController {

  @objc func testPresented() {
    presentModal(animated: false)
  }
}
