// Copyright 2017-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 "MaterialTextFields.h"

@interface MultilineTextFieldLegacyExample : UIViewController <UITextViewDelegate>

// Be sure to keep your controllers in memory somewhere like a property:
@property(nonatomic, strong) MDCTextInputControllerLegacyDefault *textFieldControllerDefaultCharMax;
@property(nonatomic, strong) MDCTextInputControllerLegacyDefault *textFieldControllerFloating;
@property(nonatomic, strong) MDCTextInputControllerLegacyFullWidth *textFieldControllerFullWidth;
@property(nonatomic, strong) UIScrollView *scrollView;

@end

@implementation MultilineTextFieldLegacyExample

- (void)viewDidLoad {
  [super viewDidLoad];
  self.view.backgroundColor = [UIColor colorWithWhite:(CGFloat)0.97 alpha:1];

  self.title = @"Legacy Multi-line Styles";

  self.scrollView = [[UIScrollView alloc] initWithFrame:CGRectZero];
  [self.view addSubview:self.scrollView];
  self.scrollView.translatesAutoresizingMaskIntoConstraints = NO;

  UIEdgeInsets margins = UIEdgeInsetsMake(0, 16, 0, 16);
  self.scrollView.layoutMargins = margins;

  [NSLayoutConstraint
      activateConstraints:[NSLayoutConstraint
                              constraintsWithVisualFormat:@"V:|[scrollView]|"
                                                  options:0
                                                  metrics:nil
                                                    views:@{@"scrollView" : self.scrollView}]];
  [NSLayoutConstraint
      activateConstraints:[NSLayoutConstraint
                              constraintsWithVisualFormat:@"H:|[scrollView]|"
                                                  options:0
                                                  metrics:nil
                                                    views:@{@"scrollView" : self.scrollView}]];

  MDCMultilineTextField *multilineTextFieldUnstyled = [[MDCMultilineTextField alloc] init];
  [self.scrollView addSubview:multilineTextFieldUnstyled];
  multilineTextFieldUnstyled.translatesAutoresizingMaskIntoConstraints = NO;

  multilineTextFieldUnstyled.placeholder = @"No Controller (unstyled)";
  multilineTextFieldUnstyled.textView.delegate = self;
  multilineTextFieldUnstyled.leadingUnderlineLabel.text = @"Leading";
  multilineTextFieldUnstyled.trailingUnderlineLabel.text = @"Trailing";

  MDCMultilineTextField *multilineTextFieldUnstyledArea = [[MDCMultilineTextField alloc] init];
  [self.scrollView addSubview:multilineTextFieldUnstyledArea];
  multilineTextFieldUnstyledArea.translatesAutoresizingMaskIntoConstraints = NO;

  multilineTextFieldUnstyledArea.placeholder = @"No Controller (unstyled) minimum of 3 lines";
  multilineTextFieldUnstyledArea.textView.delegate = self;
  multilineTextFieldUnstyledArea.leadingUnderlineLabel.text = @"Leading";
  multilineTextFieldUnstyledArea.trailingUnderlineLabel.text = @"Trailing";
  multilineTextFieldUnstyledArea.minimumLines = 3;
  multilineTextFieldUnstyledArea.expandsOnOverflow = NO;

  MDCMultilineTextField *multilineTextFieldFloating = [[MDCMultilineTextField alloc] init];
  [self.scrollView addSubview:multilineTextFieldFloating];
  multilineTextFieldFloating.translatesAutoresizingMaskIntoConstraints = NO;

  multilineTextFieldFloating.textView.delegate = self;

  self.textFieldControllerFloating =
      [[MDCTextInputControllerLegacyDefault alloc] initWithTextInput:multilineTextFieldFloating];
  self.textFieldControllerFloating.placeholderText = @"Floating Controller";

  MDCMultilineTextField *multilineTextFieldCharMaxDefault = [[MDCMultilineTextField alloc] init];
  [self.scrollView addSubview:multilineTextFieldCharMaxDefault];
  multilineTextFieldCharMaxDefault.translatesAutoresizingMaskIntoConstraints = NO;

  multilineTextFieldCharMaxDefault.textView.delegate = self;

  self.textFieldControllerDefaultCharMax = [[MDCTextInputControllerLegacyDefault alloc]
      initWithTextInput:multilineTextFieldCharMaxDefault];
  self.textFieldControllerDefaultCharMax.characterCountMax = 30;
  self.textFieldControllerDefaultCharMax.floatingEnabled = NO;
  self.textFieldControllerDefaultCharMax.placeholderText = @"Inline Placeholder Only";

  MDCMultilineTextField *multilineTextFieldCharMaxFullWidth = [[MDCMultilineTextField alloc] init];
  [self.scrollView addSubview:multilineTextFieldCharMaxFullWidth];
  multilineTextFieldCharMaxFullWidth.translatesAutoresizingMaskIntoConstraints = NO;

  multilineTextFieldCharMaxFullWidth.textView.delegate = self;

  self.textFieldControllerFullWidth = [[MDCTextInputControllerLegacyFullWidth alloc]
      initWithTextInput:multilineTextFieldCharMaxFullWidth];
  self.textFieldControllerFullWidth.characterCountMax = 140;
  self.textFieldControllerFullWidth.placeholderText = @"Full Width Controller";

  id<UILayoutSupport> topGuide = self.topLayoutGuide;
  [NSLayoutConstraint
      activateConstraints:[NSLayoutConstraint
                              constraintsWithVisualFormat:
                                  @"V:[topGuide]-[unstyled]-[area]-[floating]-[charMax]-[fullWidth]"
                                                  options:0
                                                  metrics:nil
                                                    views:@{
                                                      @"topGuide" : topGuide,
                                                      @"unstyled" : multilineTextFieldUnstyled,
                                                      @"area" : multilineTextFieldUnstyledArea,
                                                      @"charMax" : multilineTextFieldCharMaxDefault,
                                                      @"floating" : multilineTextFieldFloating,
                                                      @"fullWidth" :
                                                          multilineTextFieldCharMaxFullWidth
                                                    }]];
  [NSLayoutConstraint
      activateConstraints:[NSLayoutConstraint
                              constraintsWithVisualFormat:@"H:|-[unstyled]-|"
                                                  options:0
                                                  metrics:nil
                                                    views:@{
                                                      @"unstyled" : multilineTextFieldUnstyled
                                                    }]];
  [NSLayoutConstraint
      activateConstraints:[NSLayoutConstraint
                              constraintsWithVisualFormat:@"H:|-[area]-|"
                                                  options:0
                                                  metrics:nil
                                                    views:@{
                                                      @"area" : multilineTextFieldUnstyledArea
                                                    }]];
  [NSLayoutConstraint
      activateConstraints:[NSLayoutConstraint
                              constraintsWithVisualFormat:@"H:|-[floating]-|"
                                                  options:0
                                                  metrics:nil
                                                    views:@{
                                                      @"floating" : multilineTextFieldFloating
                                                    }]];
  [NSLayoutConstraint
      activateConstraints:[NSLayoutConstraint
                              constraintsWithVisualFormat:@"H:|-[charMax]-|"
                                                  options:0
                                                  metrics:nil
                                                    views:@{
                                                      @"charMax" : multilineTextFieldCharMaxDefault
                                                    }]];

  if (@available(iOS 11.0, *)) {
    [NSLayoutConstraint activateConstraints:@[
      [NSLayoutConstraint constraintWithItem:multilineTextFieldUnstyled
                                   attribute:NSLayoutAttributeTop
                                   relatedBy:NSLayoutRelationEqual
                                      toItem:self.scrollView.contentLayoutGuide
                                   attribute:NSLayoutAttributeTop
                                  multiplier:1
                                    constant:20],
      [NSLayoutConstraint constraintWithItem:multilineTextFieldCharMaxFullWidth
                                   attribute:NSLayoutAttributeBottom
                                   relatedBy:NSLayoutRelationEqual
                                      toItem:self.scrollView.contentLayoutGuide
                                   attribute:NSLayoutAttributeBottomMargin
                                  multiplier:1
                                    constant:-20]
    ]];
  } else {
    [NSLayoutConstraint activateConstraints:@[
      [NSLayoutConstraint constraintWithItem:multilineTextFieldUnstyled
                                   attribute:NSLayoutAttributeTop
                                   relatedBy:NSLayoutRelationEqual
                                      toItem:self.scrollView
                                   attribute:NSLayoutAttributeTop
                                  multiplier:1
                                    constant:20],
      [NSLayoutConstraint constraintWithItem:multilineTextFieldCharMaxFullWidth
                                   attribute:NSLayoutAttributeBottom
                                   relatedBy:NSLayoutRelationEqual
                                      toItem:self.scrollView
                                   attribute:NSLayoutAttributeBottomMargin
                                  multiplier:1
                                    constant:-20]
    ]];
  }

  [NSLayoutConstraint constraintWithItem:multilineTextFieldCharMaxFullWidth
                               attribute:NSLayoutAttributeLeading
                               relatedBy:NSLayoutRelationEqual
                                  toItem:self.view
                               attribute:NSLayoutAttributeLeading
                              multiplier:1
                                constant:0]
      .active = YES;
  [NSLayoutConstraint constraintWithItem:multilineTextFieldCharMaxFullWidth
                               attribute:NSLayoutAttributeTrailing
                               relatedBy:NSLayoutRelationEqual
                                  toItem:self.view
                               attribute:NSLayoutAttributeTrailing
                              multiplier:1
                                constant:0]
      .active = YES;
  [NSLayoutConstraint
      activateConstraints:[NSLayoutConstraint
                              constraintsWithVisualFormat:@"H:|[fullWidth]|"
                                                  options:0
                                                  metrics:nil
                                                    views:@{
                                                      @"fullWidth" :
                                                          multilineTextFieldCharMaxFullWidth
                                                    }]];

  UITapGestureRecognizer *tapRecognizer =
      [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapDidTouch)];
  [self.view addGestureRecognizer:tapRecognizer];

  [self registerKeyboardNotifications];
}

- (void)tapDidTouch {
  [self.view endEditing:YES];
}

#pragma mark - CatalogByConvention

+ (NSDictionary *)catalogMetadata {
  return @{
    @"breadcrumbs" : @[ @"Text Field", @"[Legacy] Multi-line" ],
    @"primaryDemo" : @NO,
    @"presentable" : @NO,
  };
}

#pragma mark - Keyboard Handling

- (void)registerKeyboardNotifications {
  NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];
  [defaultCenter addObserver:self
                    selector:@selector(keyboardWillShow:)
                        name:UIKeyboardWillShowNotification
                      object:nil];
  [defaultCenter addObserver:self
                    selector:@selector(keyboardWillShow:)
                        name:UIKeyboardDidChangeFrameNotification
                      object:nil];
  [defaultCenter addObserver:self
                    selector:@selector(keyboardWillHide:)
                        name:UIKeyboardWillHideNotification
                      object:nil];
}

- (void)keyboardWillShow:(NSNotification *)notification {
  CGRect frame = [[notification.userInfo valueForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
  self.scrollView.contentInset = UIEdgeInsetsMake(0, 0, CGRectGetHeight(frame), 0);
}

- (void)keyboardWillHide:(NSNotification *)notification {
  self.scrollView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0);
}

@end

@implementation MultilineTextFieldLegacyExample (UITextViewDelegate)

- (void)textViewDidChange:(UITextView *)textView {
  NSLog(@"%@", textView.text);
}

@end
