/*
 Copyright 2016-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.
 */

// swiftlint:disable file_length
// swiftlint:disable type_body_length
// swiftlint:disable function_body_length

import UIKit

import MaterialComponents.MaterialTextFields
import MaterialComponents.MaterialAppBar
import MaterialComponents.MaterialButtons
import MaterialComponents.MaterialTypography
import MaterialComponents.MaterialPalettes

final class TextFieldKitchenSinkSwiftExample: UIViewController {

  let scrollView = UIScrollView()

  let controlLabel: UILabel = {
    let controlLabel = UILabel()
    controlLabel.translatesAutoresizingMaskIntoConstraints = false
    controlLabel.text = "Options"
    controlLabel.font = UIFont.preferredFont(forTextStyle: .headline)
    controlLabel.textColor = UIColor(white: 0, alpha: MDCTypography.headlineFontOpacity())
    return controlLabel
  }()

  let singleLabel: UILabel = {
    let singleLabel = UILabel()
    singleLabel.translatesAutoresizingMaskIntoConstraints = false
    singleLabel.text = "Single-line Text Fields"
    singleLabel.font = UIFont.preferredFont(forTextStyle: .headline)
    singleLabel.textColor = UIColor(white: 0, alpha: MDCTypography.headlineFontOpacity())
    singleLabel.numberOfLines = 0
    return singleLabel
  }()

  let multiLabel: UILabel = {
    let multiLabel = UILabel()
    multiLabel.translatesAutoresizingMaskIntoConstraints = false
    multiLabel.text = "Multi-line Text Fields"
    multiLabel.font = UIFont.preferredFont(forTextStyle: .headline)
    multiLabel.textColor = UIColor(white: 0, alpha: MDCTypography.headlineFontOpacity())
    multiLabel.numberOfLines = 0
    return multiLabel
  }()

  let errorLabel: UILabel = {
    let errorLabel = UILabel()
    errorLabel.translatesAutoresizingMaskIntoConstraints = false
    errorLabel.text = "In Error:"
    errorLabel.font = UIFont.preferredFont(forTextStyle: .subheadline)
    errorLabel.textColor = UIColor(white: 0, alpha: MDCTypography.subheadFontOpacity())
    errorLabel.numberOfLines = 0
    return errorLabel
  }()

  let helperLabel: UILabel = {
    let helperLabel = UILabel()
    helperLabel.translatesAutoresizingMaskIntoConstraints = false
    helperLabel.text = "Show Helper Text:"
    helperLabel.font = UIFont.preferredFont(forTextStyle: .subheadline)
    helperLabel.textColor = UIColor(white: 0, alpha: MDCTypography.subheadFontOpacity())
    helperLabel.numberOfLines = 0
    return helperLabel
  }()

  let baselineTestLabel: UILabel = {
    let baselineTestLabel = UILabel()
    baselineTestLabel.text = "popopopopopop       "
    baselineTestLabel.translatesAutoresizingMaskIntoConstraints = false
    return baselineTestLabel
  }()

  var allInputControllers = [MDCTextInputController]()
  var allTextFieldControllers = [MDCTextInputController]()
  var allMultilineTextFieldControllers = [MDCTextInputController]()
  var controllersWithCharacterCount = [MDCTextInputController]()
  var controllersFullWidth = [MDCTextInputControllerFullWidth]()

  let unstyledTextField = MDCTextField()
  let unstyledMultilineTextField = MDCMultilineTextField()

  lazy var textInsetsModeButton: MDCButton = self.setupButton()
  lazy var characterModeButton: MDCButton = self.setupButton()
  lazy var clearModeButton: MDCButton = self.setupButton()
  lazy var underlineButton: MDCButton = self.setupButton()

  let attributedString = NSAttributedString(string: "This uses attributed text.")

  deinit {
    NotificationCenter.default.removeObserver(self)
  }

  override func viewDidLoad() {
    super.viewDidLoad()
    setupExampleViews()
  }

  func setupFilledTextFields() -> [MDCTextInputControllerFilled] {
    let textFieldFilled = MDCTextField()
    textFieldFilled.translatesAutoresizingMaskIntoConstraints = false
    scrollView.addSubview(textFieldFilled)

    textFieldFilled.delegate = self

    let textFieldControllerFilled = MDCTextInputControllerFilled(textInput: textFieldFilled)
    textFieldControllerFilled.isFloatingEnabled = false
    textFieldControllerFilled.placeholderText = "This is a filled text field"

    let textFieldFilledFloating = MDCTextField()
    textFieldFilledFloating.translatesAutoresizingMaskIntoConstraints = false
    scrollView.addSubview(textFieldFilledFloating)

    textFieldFilledFloating.delegate = self

    let textFieldControllerFilledFloating = MDCTextInputControllerFilled(textInput: textFieldFilledFloating)
    textFieldControllerFilledFloating.placeholderText = "This is filled and floating"

    let textFieldFilledFloatingAttributed = MDCTextField()
    textFieldFilledFloatingAttributed.translatesAutoresizingMaskIntoConstraints = false
    scrollView.addSubview(textFieldFilledFloatingAttributed)

    textFieldFilledFloatingAttributed.delegate = self

    let textFieldControllerFilledFloatingAttributed =
        MDCTextInputControllerFilled(textInput: textFieldFilledFloatingAttributed)
    textFieldControllerFilledFloatingAttributed.placeholderText = "This is filled and floating"
    textFieldFilledFloatingAttributed.attributedText = attributedString
    return [textFieldControllerFilled, textFieldControllerFilledFloating,
            textFieldControllerFilledFloatingAttributed]
  }

  func setupFullWidthTextFields() -> [MDCTextInputControllerFullWidth] {
    let textFieldFullWidthPlaceholder = MDCTextField()
    textFieldFullWidthPlaceholder.translatesAutoresizingMaskIntoConstraints = false
    scrollView.addSubview(textFieldFullWidthPlaceholder)

    textFieldFullWidthPlaceholder.delegate = self
    textFieldFullWidthPlaceholder.clearButtonMode = .whileEditing

    let textFieldControllerFullWidthPlaceholder =
      MDCTextInputControllerFullWidth(textInput: textFieldFullWidthPlaceholder)
    textFieldControllerFullWidthPlaceholder.placeholderText = "This is a full width text field"

    let textFieldFullWidthCharMax = MDCTextField()
    textFieldFullWidthCharMax.translatesAutoresizingMaskIntoConstraints = false
    scrollView.addSubview(textFieldFullWidthCharMax)

    textFieldFullWidthCharMax.delegate = self
    textFieldFullWidthCharMax.clearButtonMode = .whileEditing

    let textFieldControllerFullWidthCharMax =
      MDCTextInputControllerFullWidth(textInput: textFieldFullWidthCharMax)
    textFieldControllerFullWidthCharMax.characterCountMax = 50
    textFieldControllerFullWidthCharMax.placeholderText =
      "This is a full width text field with character count and a very long placeholder"

    controllersWithCharacterCount.append(textFieldControllerFullWidthCharMax)

    return [textFieldControllerFullWidthPlaceholder,
            textFieldControllerFullWidthCharMax]
  }

  func setupFloatingUnderlineTextFields() -> [MDCTextInputControllerUnderline] {
    let textFieldFloating = MDCTextField()
    textFieldFloating.translatesAutoresizingMaskIntoConstraints = false
    scrollView.addSubview(textFieldFloating)

    textFieldFloating.delegate = self
    textFieldFloating.clearButtonMode = .whileEditing

    let textFieldControllerFloating = MDCTextInputControllerUnderline(textInput: textFieldFloating)
    textFieldControllerFloating.placeholderText = "This is a text field w/ floating placeholder"

    let textFieldFloatingCharMax = MDCTextField()
    textFieldFloatingCharMax.translatesAutoresizingMaskIntoConstraints = false
    scrollView.addSubview(textFieldFloatingCharMax)

    textFieldFloatingCharMax.delegate = self
    textFieldFloatingCharMax.clearButtonMode = .whileEditing

    let textFieldControllerFloatingCharMax =
      MDCTextInputControllerUnderline(textInput: textFieldFloatingCharMax)
    textFieldControllerFloatingCharMax.characterCountMax = 50
    textFieldControllerFloatingCharMax.placeholderText = "This is floating with character count"

    controllersWithCharacterCount.append(textFieldControllerFloatingCharMax)

    baselineTestLabel.font = textFieldFloatingCharMax.font
    self.scrollView.addSubview(baselineTestLabel)

    if #available(iOSApplicationExtension 9.0, *) {
      baselineTestLabel.trailingAnchor.constraint(equalTo: textFieldFloatingCharMax.trailingAnchor,
                                                 constant: 0).isActive = true

      baselineTestLabel.firstBaselineAnchor.constraint(equalTo: textFieldFloatingCharMax.firstBaselineAnchor).isActive = true
    } else {
      NSLayoutConstraint(item: baselineTestLabel,
                         attribute: .trailing,
                         relatedBy: .equal,
                         toItem: textFieldFloatingCharMax,
                         attribute: .trailing,
                         multiplier: 1,
                         constant: 0).isActive = true
      NSLayoutConstraint(item: baselineTestLabel,
                         attribute: .lastBaseline,
                         relatedBy: .equal,
                         toItem: textFieldFloatingCharMax,
                         attribute: .lastBaseline,
                         multiplier: 1,
                         constant: 0).isActive = true
    }

    return [textFieldControllerFloating, textFieldControllerFloatingCharMax]
  }

  func setupInlineUnderlineTextFields() -> [MDCTextInputControllerUnderline] {
    let textFieldUnderline = MDCTextField()
    textFieldUnderline.translatesAutoresizingMaskIntoConstraints = false
    scrollView.addSubview(textFieldUnderline)

    textFieldUnderline.delegate = self
    textFieldUnderline.clearButtonMode = .whileEditing

    let textFieldControllerUnderline = MDCTextInputControllerUnderline(textInput: textFieldUnderline)

    textFieldControllerUnderline.isFloatingEnabled = false

    let textFieldUnderlinePlaceholder = MDCTextField()
    textFieldUnderlinePlaceholder.translatesAutoresizingMaskIntoConstraints = false
    scrollView.addSubview(textFieldUnderlinePlaceholder)

    textFieldUnderlinePlaceholder.delegate = self

    textFieldUnderlinePlaceholder.clearButtonMode = .whileEditing

    let textFieldControllerUnderlinePlaceholder =
      MDCTextInputControllerUnderline(textInput: textFieldUnderlinePlaceholder)

    textFieldControllerUnderlinePlaceholder.isFloatingEnabled = false
    textFieldControllerUnderlinePlaceholder.placeholderText = "This is a text field w/ inline placeholder"

    let textFieldUnderlineCharMax = MDCTextField()
    textFieldUnderlineCharMax.translatesAutoresizingMaskIntoConstraints = false
    scrollView.addSubview(textFieldUnderlineCharMax)

    textFieldUnderlineCharMax.delegate = self
    textFieldUnderlineCharMax.clearButtonMode = .whileEditing

    let textFieldControllerUnderlineCharMax =
      MDCTextInputControllerUnderline(textInput: textFieldUnderlineCharMax)
    textFieldControllerUnderlineCharMax.characterCountMax = 50
    textFieldControllerUnderlineCharMax.isFloatingEnabled = false
    textFieldControllerUnderlineCharMax.placeholderText = "This is a text field w/ character count"

    controllersWithCharacterCount.append(textFieldControllerUnderlineCharMax)

    return [textFieldControllerUnderline, textFieldControllerUnderlinePlaceholder,
            textFieldControllerUnderlineCharMax]
  }

  func setupSpecialTextFields() -> [MDCTextInputControllerFloatingPlaceholder] {
    let textFieldDisabled = MDCTextField()
    textFieldDisabled.translatesAutoresizingMaskIntoConstraints = false
    scrollView.addSubview(textFieldDisabled)

    textFieldDisabled.delegate = self
    textFieldDisabled.isEnabled = false

    let textFieldControllerUnderlineDisabled =
      MDCTextInputControllerUnderline(textInput: textFieldDisabled)
    textFieldControllerUnderlineDisabled.isFloatingEnabled = false
    textFieldControllerUnderlineDisabled.placeholderText = "This is a disabled text field"

    let textFieldCustomFont = MDCTextField()
    textFieldCustomFont.translatesAutoresizingMaskIntoConstraints = false
    scrollView.addSubview(textFieldCustomFont)

    textFieldCustomFont.font = UIFont.preferredFont(forTextStyle: .headline)
    textFieldCustomFont.delegate = self
    textFieldCustomFont.clearButtonMode = .whileEditing

    let textFieldControllerUnderlineCustomFont =
      MDCTextInputControllerUnderline(textInput: textFieldCustomFont)
    textFieldControllerUnderlineCustomFont.inlinePlaceholderFont = UIFont.preferredFont(forTextStyle: .headline)
    textFieldControllerUnderlineCustomFont.isFloatingEnabled = false
    textFieldControllerUnderlineCustomFont.placeholderText = "This is a custom font"

    let textFieldCustomFontFloating = MDCTextField()
    textFieldCustomFontFloating.translatesAutoresizingMaskIntoConstraints = false
    scrollView.addSubview(textFieldCustomFontFloating)

    textFieldCustomFontFloating.font = UIFont.preferredFont(forTextStyle: .headline)
    textFieldCustomFontFloating.delegate = self
    textFieldCustomFontFloating.clearButtonMode = .whileEditing
    textFieldCustomFontFloating.cursorColor = .orange

    let textFieldControllerUnderlineCustomFontFloating =
      MDCTextInputControllerUnderline(textInput: textFieldCustomFontFloating)
    textFieldControllerUnderlineCustomFontFloating.characterCountMax = 40
    textFieldControllerUnderlineCustomFontFloating.placeholderText = "This is a custom font with the works"
    textFieldControllerUnderlineCustomFontFloating.helperText = "Custom Font"
    textFieldControllerUnderlineCustomFontFloating.activeColor = .green
    textFieldControllerUnderlineCustomFontFloating.normalColor = .purple
    textFieldControllerUnderlineCustomFontFloating.leadingUnderlineLabelTextColor = .cyan
    textFieldControllerUnderlineCustomFontFloating.trailingUnderlineLabelTextColor = .magenta
    textFieldControllerUnderlineCustomFontFloating.leadingUnderlineLabelFont =
      UIFont.preferredFont(forTextStyle: .headline)
    textFieldControllerUnderlineCustomFontFloating.inlinePlaceholderFont =
      UIFont.preferredFont(forTextStyle: .headline)
    textFieldControllerUnderlineCustomFontFloating.trailingUnderlineLabelFont =
      UIFont.preferredFont(forTextStyle: .subheadline)
    textFieldCustomFontFloating.clearButton.tintColor = MDCPalette.red.accent400
    textFieldControllerUnderlineCustomFontFloating.floatingPlaceholderNormalColor = .yellow
    textFieldControllerUnderlineCustomFontFloating.floatingPlaceholderActiveColor = .orange

    let bundle = Bundle(for: TextFieldKitchenSinkSwiftExample.self)
    let leadingViewImage = UIImage(named: "ic_search", in: bundle, compatibleWith: nil)!

    let textFieldLeadingView = MDCTextField()
    textFieldLeadingView.leadingViewMode = .always
    textFieldLeadingView.leadingView = UIImageView(image:leadingViewImage)

    textFieldLeadingView.translatesAutoresizingMaskIntoConstraints = false
    scrollView.addSubview(textFieldLeadingView)

    textFieldLeadingView.delegate = self
    textFieldLeadingView.clearButtonMode = .whileEditing

    let textFieldControllerUnderlineLeadingView =
      MDCTextInputControllerUnderline(textInput: textFieldLeadingView)
    textFieldControllerUnderlineLeadingView.isFloatingEnabled = false
    textFieldControllerUnderlineLeadingView.placeholderText = "This has a leading view"

    let textFieldLeadingViewAttributed = MDCTextField()
    textFieldLeadingViewAttributed.leadingViewMode = .always
    textFieldLeadingViewAttributed.leadingView = UIImageView(image:leadingViewImage)

    textFieldLeadingViewAttributed.translatesAutoresizingMaskIntoConstraints = false
    scrollView.addSubview(textFieldLeadingViewAttributed)

    textFieldLeadingViewAttributed.delegate = self
    textFieldLeadingViewAttributed.clearButtonMode = .whileEditing

    let textFieldControllerUnderlineLeadingViewAttributed =
      MDCTextInputControllerUnderline(textInput: textFieldLeadingViewAttributed)
    textFieldControllerUnderlineLeadingViewAttributed.isFloatingEnabled = false
    textFieldControllerUnderlineLeadingViewAttributed.placeholderText = "This has a leading view"
    textFieldLeadingViewAttributed.attributedText = attributedString

    let textFieldLeadingViewFloating = MDCTextField()
    textFieldLeadingViewFloating.leadingViewMode = .always
    textFieldLeadingViewFloating.leadingView = UIImageView(image:leadingViewImage)

    textFieldLeadingViewFloating.translatesAutoresizingMaskIntoConstraints = false
    scrollView.addSubview(textFieldLeadingViewFloating)

    textFieldLeadingViewFloating.delegate = self
    textFieldLeadingViewFloating.clearButtonMode = .whileEditing

    let textFieldControllerUnderlineLeadingViewFloating =
      MDCTextInputControllerUnderline(textInput: textFieldLeadingViewFloating)
    textFieldControllerUnderlineLeadingViewFloating.placeholderText = "This has a leading view and floats"

    let textFieldLeadingViewFloatingAttributed = MDCTextField()
    textFieldLeadingViewFloatingAttributed.leadingViewMode = .always
    textFieldLeadingViewFloatingAttributed.leadingView = UIImageView(image:leadingViewImage)

    textFieldLeadingViewFloatingAttributed.translatesAutoresizingMaskIntoConstraints = false
    scrollView.addSubview(textFieldLeadingViewFloatingAttributed)

    textFieldLeadingViewFloatingAttributed.delegate = self
    textFieldLeadingViewFloatingAttributed.clearButtonMode = .whileEditing

    let textFieldControllerUnderlineLeadingViewFloatingAttributed =
      MDCTextInputControllerUnderline(textInput: textFieldLeadingViewFloatingAttributed)
    textFieldControllerUnderlineLeadingViewFloatingAttributed.placeholderText =
        "This has a leading view and floats"
    textFieldLeadingViewFloatingAttributed.attributedText = attributedString

    let trailingViewImage = UIImage(named: "ic_done", in: bundle, compatibleWith: nil)!

    let textFieldTrailingView = MDCTextField()
    textFieldTrailingView.trailingViewMode = .always
    textFieldTrailingView.trailingView = UIImageView(image:trailingViewImage)

    textFieldTrailingView.translatesAutoresizingMaskIntoConstraints = false
    scrollView.addSubview(textFieldTrailingView)

    textFieldTrailingView.delegate = self
    textFieldTrailingView.clearButtonMode = .whileEditing

    let textFieldControllerUnderlineTrailingView =
      MDCTextInputControllerUnderline(textInput: textFieldTrailingView)
    textFieldControllerUnderlineTrailingView.isFloatingEnabled = false
    textFieldControllerUnderlineTrailingView.placeholderText = "This has a trailing view"

    let textFieldTrailingViewFloating = MDCTextField()
    textFieldTrailingViewFloating.trailingViewMode = .always
    textFieldTrailingViewFloating.trailingView = UIImageView(image:trailingViewImage)

    textFieldTrailingViewFloating.translatesAutoresizingMaskIntoConstraints = false
    scrollView.addSubview(textFieldTrailingViewFloating)

    textFieldTrailingViewFloating.delegate = self
    textFieldTrailingViewFloating.clearButtonMode = .whileEditing

    let textFieldControllerUnderlineTrailingViewFloating =
      MDCTextInputControllerUnderline(textInput: textFieldTrailingViewFloating)
    textFieldControllerUnderlineTrailingViewFloating.placeholderText = "This has a trailing view and floats"

    let textFieldLeadingTrailingView = MDCTextField()
    textFieldLeadingTrailingView.leadingViewMode = .whileEditing
    textFieldLeadingTrailingView.leadingView = UIImageView(image: leadingViewImage)
    textFieldLeadingTrailingView.trailingViewMode = .unlessEditing
    textFieldLeadingTrailingView.trailingView = UIImageView(image:trailingViewImage)

    textFieldLeadingTrailingView.translatesAutoresizingMaskIntoConstraints = false
    scrollView.addSubview(textFieldLeadingTrailingView)

    textFieldLeadingTrailingView.delegate = self
    textFieldLeadingTrailingView.clearButtonMode = .whileEditing

    let textFieldControllerUnderlineLeadingTrailingView =
      MDCTextInputControllerUnderline(textInput: textFieldLeadingTrailingView)
    textFieldControllerUnderlineLeadingTrailingView.isFloatingEnabled = false
    textFieldControllerUnderlineLeadingTrailingView.placeholderText =
      "This has leading & trailing views and a very long placeholder that should be truncated"

    let textFieldLeadingTrailingViewFloating = MDCTextField()
    textFieldLeadingTrailingViewFloating.leadingViewMode = .always
    textFieldLeadingTrailingViewFloating.leadingView = UIImageView(image: leadingViewImage)
    textFieldLeadingTrailingViewFloating.trailingViewMode = .whileEditing
    textFieldLeadingTrailingViewFloating.trailingView = UIImageView(image:trailingViewImage)

    textFieldLeadingTrailingViewFloating.translatesAutoresizingMaskIntoConstraints = false
    scrollView.addSubview(textFieldLeadingTrailingViewFloating)

    textFieldLeadingTrailingViewFloating.delegate = self
    textFieldLeadingTrailingViewFloating.clearButtonMode = .whileEditing

    let textFieldControllerUnderlineLeadingTrailingViewFloating =
      MDCTextInputControllerUnderline(textInput: textFieldLeadingTrailingViewFloating)
    textFieldControllerUnderlineLeadingTrailingViewFloating.placeholderText =
      "This has leading & trailing views and floats and a very long placeholder that should be truncated"

    let textFieldBase = MDCTextField()
    textFieldBase.delegate = self
    textFieldBase.translatesAutoresizingMaskIntoConstraints = false
    scrollView.addSubview(textFieldBase)

    let textFieldControllerBase = MDCTextInputControllerBase(textInput: textFieldBase)
    textFieldControllerBase.placeholderText = "This is the common base class for controllers"
    textFieldControllerBase.helperText = "It's expected that you'll subclass this."

    unstyledTextField.translatesAutoresizingMaskIntoConstraints = false
    scrollView.addSubview(unstyledTextField)

    unstyledTextField.placeholder = "This is an unstyled text field (no controller)"
    unstyledTextField.leadingUnderlineLabel.text = "Leading label"
    unstyledTextField.trailingUnderlineLabel.text = "Trailing label"
    unstyledTextField.delegate = self
    unstyledTextField.clearButtonMode = .whileEditing
    unstyledTextField.leadingView = UIImageView(image: leadingViewImage)
    unstyledTextField.leadingViewMode = .always
    unstyledTextField.trailingView = UIImageView(image: trailingViewImage)
    unstyledTextField.trailingViewMode = .always

    return [textFieldControllerUnderlineDisabled,
            textFieldControllerUnderlineCustomFont, textFieldControllerUnderlineCustomFontFloating,
            textFieldControllerUnderlineLeadingView,
            textFieldControllerUnderlineLeadingViewAttributed,
            textFieldControllerUnderlineLeadingViewFloating,
            textFieldControllerUnderlineLeadingViewFloatingAttributed,
            textFieldControllerUnderlineTrailingView,
            textFieldControllerUnderlineTrailingViewFloating,
            textFieldControllerUnderlineLeadingTrailingView,
            textFieldControllerUnderlineLeadingTrailingViewFloating,
            textFieldControllerBase]
  }

  // MARK: - Multi-line

  func setupAreaTextFields() -> [MDCTextInputControllerOutlinedTextArea] {
    let textFieldArea = MDCMultilineTextField()
    textFieldArea.translatesAutoresizingMaskIntoConstraints = false
    scrollView.addSubview(textFieldArea)

    textFieldArea.textView?.delegate = self

    let textFieldControllerArea = MDCTextInputControllerOutlinedTextArea(textInput: textFieldArea)
    textFieldControllerArea.placeholderText = "This is a text area"

    let textFieldAreaAttributed = MDCMultilineTextField()
    textFieldAreaAttributed.translatesAutoresizingMaskIntoConstraints = false
    scrollView.addSubview(textFieldAreaAttributed)

    textFieldAreaAttributed.textView?.delegate = self

    let textFieldControllerAreaAttributed =
        MDCTextInputControllerOutlinedTextArea(textInput: textFieldAreaAttributed)
    textFieldControllerAreaAttributed.placeholderText = "This is a text area"
    textFieldAreaAttributed.attributedText = attributedString

    return [textFieldControllerArea, textFieldControllerAreaAttributed]
  }

  func setupUnderlineMultilineTextFields() -> [MDCTextInputControllerUnderline] {
    let multilineTextFieldUnderline = MDCMultilineTextField()
    multilineTextFieldUnderline.translatesAutoresizingMaskIntoConstraints = false
    scrollView.addSubview(multilineTextFieldUnderline)

    multilineTextFieldUnderline.textView?.delegate = self

    let multilineTextFieldControllerUnderline =
        MDCTextInputControllerUnderline(textInput: multilineTextFieldUnderline)
    multilineTextFieldControllerUnderline.isFloatingEnabled = false

    let multilineTextFieldUnderlinePlaceholder = MDCMultilineTextField()
    multilineTextFieldUnderlinePlaceholder.translatesAutoresizingMaskIntoConstraints = false
    scrollView.addSubview(multilineTextFieldUnderlinePlaceholder)

    multilineTextFieldUnderlinePlaceholder.textView?.delegate = self

    let multilineTextFieldControllerUnderlinePlaceholder =
      MDCTextInputControllerUnderline(textInput: multilineTextFieldUnderlinePlaceholder)
    multilineTextFieldControllerUnderlinePlaceholder.isFloatingEnabled = false
    multilineTextFieldControllerUnderlinePlaceholder.placeholderText =
      "This is a multi-line text field with placeholder"

    let multilineTextFieldUnderlineCharMax = MDCMultilineTextField()
    multilineTextFieldUnderlineCharMax.translatesAutoresizingMaskIntoConstraints = false
    scrollView.addSubview(multilineTextFieldUnderlineCharMax)

    multilineTextFieldUnderlineCharMax.textView?.delegate = self

    let multilineTextFieldControllerUnderlineCharMax =
          MDCTextInputControllerUnderline(textInput: multilineTextFieldUnderlineCharMax)
    multilineTextFieldControllerUnderlineCharMax.characterCountMax = 140
    multilineTextFieldControllerUnderlineCharMax.isFloatingEnabled = false
    multilineTextFieldControllerUnderlineCharMax.placeholderText =
      "This is a multi-line text field with placeholder"

    controllersWithCharacterCount.append(multilineTextFieldControllerUnderlineCharMax)

    return [multilineTextFieldControllerUnderline, multilineTextFieldControllerUnderlinePlaceholder,
            multilineTextFieldControllerUnderlineCharMax]
  }

  func setupFullWidthMultilineTextFields() -> [MDCTextInputControllerFullWidth] {
    let multilineTextFieldFullWidth = MDCMultilineTextField()
    multilineTextFieldFullWidth.translatesAutoresizingMaskIntoConstraints = false
    scrollView.addSubview(multilineTextFieldFullWidth)

    multilineTextFieldFullWidth.textView?.delegate = self

    let multilineTextFieldControllerFullWidth =
          MDCTextInputControllerFullWidth(textInput: multilineTextFieldFullWidth)
    multilineTextFieldControllerFullWidth.placeholderText =
      "This is a full width multi-line text field"

    let multilineTextFieldFullWidthCharMax = MDCMultilineTextField()
    multilineTextFieldFullWidthCharMax.translatesAutoresizingMaskIntoConstraints = false
    scrollView.addSubview(multilineTextFieldFullWidthCharMax)

    multilineTextFieldFullWidthCharMax.textView?.delegate = self

    let multilineTextFieldControllerFullWidthCharMax =
          MDCTextInputControllerFullWidth(textInput: multilineTextFieldFullWidthCharMax)
    multilineTextFieldControllerFullWidthCharMax.placeholderText =
        "This is a full width multi-line text field with character count"

    controllersWithCharacterCount.append(multilineTextFieldControllerFullWidthCharMax)
    multilineTextFieldControllerFullWidthCharMax.characterCountMax = 140

    return [multilineTextFieldControllerFullWidth, multilineTextFieldControllerFullWidthCharMax]
  }

  func setupFloatingMultilineTextFields() -> [MDCTextInputControllerUnderline] {
    let multilineTextFieldFloating = MDCMultilineTextField()
    multilineTextFieldFloating.translatesAutoresizingMaskIntoConstraints = false
    scrollView.addSubview(multilineTextFieldFloating)

    multilineTextFieldFloating.textView?.delegate = self

    let multilineTextFieldControllerFloating =
          MDCTextInputControllerUnderline(textInput: multilineTextFieldFloating)
    multilineTextFieldControllerFloating.placeholderText =
      "This is a multi-line text field with a floating placeholder"

    let multilineTextFieldFloatingCharMax = MDCMultilineTextField()
    multilineTextFieldFloatingCharMax.translatesAutoresizingMaskIntoConstraints = false
    scrollView.addSubview(multilineTextFieldFloatingCharMax)

    multilineTextFieldFloatingCharMax.textView?.delegate = self

    let multilineTextFieldControllerFloatingCharMax =
          MDCTextInputControllerUnderline(textInput: multilineTextFieldFloatingCharMax)
    multilineTextFieldControllerFloatingCharMax.placeholderText =
        "This is a multi-line text field with a floating placeholder and character count"

    controllersWithCharacterCount.append(multilineTextFieldControllerFloatingCharMax)

    return [multilineTextFieldControllerFloating, multilineTextFieldControllerFloatingCharMax]
  }

  func setupSpecialMultilineTextFields() -> [MDCTextInputController] {
    let bundle = Bundle(for: TextFieldKitchenSinkSwiftExample.self)
    let trailingViewImage = UIImage(named: "ic_done", in: bundle, compatibleWith: nil)!

    let multilineTextFieldTrailingView = MDCMultilineTextField()
    multilineTextFieldTrailingView.trailingViewMode = .always
    multilineTextFieldTrailingView.trailingView = UIImageView(image:trailingViewImage)

    multilineTextFieldTrailingView.translatesAutoresizingMaskIntoConstraints = false
    scrollView.addSubview(multilineTextFieldTrailingView)

    multilineTextFieldTrailingView.textView?.delegate = self
    multilineTextFieldTrailingView.clearButtonMode = .whileEditing

    let multilineTextFieldControllerUnderlineTrailingView =
        MDCTextInputControllerUnderline(textInput: multilineTextFieldTrailingView)
    multilineTextFieldControllerUnderlineTrailingView.isFloatingEnabled = false
    multilineTextFieldControllerUnderlineTrailingView.placeholderText = "This has a trailing view"

    let multilineTextFieldCustomFont = MDCMultilineTextField()
    multilineTextFieldCustomFont.translatesAutoresizingMaskIntoConstraints = false
    scrollView.addSubview(multilineTextFieldCustomFont)

    let multilineTextFieldControllerUnderlineCustomFont =
        MDCTextInputControllerUnderline(textInput: multilineTextFieldCustomFont)
    multilineTextFieldControllerUnderlineCustomFont.placeholderText = "This has a custom font"

    multilineTextFieldCustomFont.placeholderLabel.font = UIFont.preferredFont(forTextStyle: .headline)
    multilineTextFieldCustomFont.font = UIFont.preferredFont(forTextStyle: .headline)

    scrollView.addSubview(unstyledMultilineTextField)
    unstyledMultilineTextField.translatesAutoresizingMaskIntoConstraints = false

    unstyledMultilineTextField.placeholder =
        "This multi-line text field has no controller (unstyled)"
    unstyledMultilineTextField.leadingUnderlineLabel.text = "Leading label"
    unstyledMultilineTextField.trailingUnderlineLabel.text = "Trailing label"
    unstyledMultilineTextField.textView?.delegate = self

    return [multilineTextFieldControllerUnderlineTrailingView,
            multilineTextFieldControllerUnderlineCustomFont]
  }

  @objc func tapDidTouch(sender: Any) {
    self.view.endEditing(true)
  }

  @objc func errorSwitchDidChange(errorSwitch: UISwitch) {
    allInputControllers.forEach { controller in
      if errorSwitch.isOn {
        controller.setErrorText("Uh oh! Try something else.", errorAccessibilityValue: nil)
      } else {
        controller.setErrorText(nil, errorAccessibilityValue: nil)
      }
    }
  }

  @objc func helperSwitchDidChange(helperSwitch: UISwitch) {
    allInputControllers.forEach { controller in
      controller.helperText = helperSwitch.isOn ? "This is helper text." : nil
    }
  }

}

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

extension TextFieldKitchenSinkSwiftExample: UITextViewDelegate {
  func textViewDidChange(_ textView: UITextView) {
    print(textView.text)
  }
}

extension TextFieldKitchenSinkSwiftExample {
  @objc func contentSizeCategoryDidChange(notif: Notification) {
    controlLabel.font = UIFont.preferredFont(forTextStyle: .headline)
    singleLabel.font = UIFont.preferredFont(forTextStyle: .headline)
    errorLabel.font = UIFont.preferredFont(forTextStyle: .subheadline)
    helperLabel.font = UIFont.preferredFont(forTextStyle: .subheadline)
  }
}
