// Copyright 2020-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 UIKit
import MaterialComponents.MaterialButtons
import MaterialComponents.MaterialButtons_Theming 
import MaterialComponents.MaterialSnackbar

class SnackbarKeyboardExample: UIViewController {

  @objc var containerScheme = MDCContainerScheme()

  let contentStackView: UIStackView = {
    let stackView = UIStackView()
    stackView.axis = .vertical
    stackView.spacing = 10
    stackView.translatesAutoresizingMaskIntoConstraints = false
    return stackView
  }()

  lazy var textField: UITextField = {
    let textField = UITextField()
    textField.borderStyle = .roundedRect
    textField.returnKeyType = .done
    textField.delegate = self
    return textField
  }()

  lazy var showSnackbarButton: MDCButton = {
    let button = MDCButton()
    button.setTitle("Show snackbar", for: .normal)
    button.addTarget(self, action: #selector(showSnackbarButtonTapped), for: .touchUpInside)
    return button
  }()

  override func viewDidLoad() {
    super.viewDidLoad()

    view.backgroundColor = .white
    showSnackbarButton.applyTextTheme(withScheme: containerScheme)

    contentStackView.addArrangedSubview(textField)
    contentStackView.addArrangedSubview(showSnackbarButton)
    view.addSubview(contentStackView)

    contentStackView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    contentStackView.topAnchor
      .constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 20).isActive = true
  }

  @objc func showSnackbarButtonTapped() {
    MDCSnackbarManager.default.show(MDCSnackbarMessage(text: "Hello!"))
  }
}

extension SnackbarKeyboardExample: UITextFieldDelegate {
  func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    textField.resignFirstResponder()
    return false
  }
}

extension SnackbarKeyboardExample {
  @objc class func catalogMetadata() -> [String: Any] {
    return [
      "breadcrumbs": ["Snackbar", "Snackbar Keyboard"],
      "primaryDemo": false,
      "presentable": true,
      "snapshotDelay": 1.0,
    ]
  }
}
