// 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.

#import <UIKit/UIKit.h>

#import "MDCTextFieldPositioningDelegate.h"

@protocol MDCTextInput;
@protocol MDCTextInputCharacterCounter;

/** Controllers that manipulate styling and animation of text inputs. */

API_DEPRECATED_BEGIN(
    "🕘 Schedule time to migrate. "
    "Use branded UITextField or UITextView instead: go/material-ios-text-fields/gm2-migration. "
    "This is go/material-ios-migrations#not-scriptable 🕘",
    ios(12, 12))

@protocol MDCTextInputController <NSObject, NSCopying, MDCTextInputPositioningDelegate>

/**
 Color for decorations that indicates the input is currently editing.

 Default is activeColorDefault.
 */
@property(nonatomic, null_resettable, strong) UIColor *activeColor;

/**
 Default value for activeColor.
 */
@property(class, nonatomic, null_resettable, strong) UIColor *activeColorDefault;

/**
 The character counter. Override to use a custom character counter.

 Default is an internal instance MDCTextInputAllCharactersCounter. Setting this property to null
 will reset it to return that instance.
 */
@property(nonatomic, null_resettable, weak) IBInspectable id<MDCTextInputCharacterCounter>
    characterCounter;

/**
 The character count maximum for the text input. A label under the input counts characters entered
 and presents the count / the max.

 If character count / max has been hidden by the characterCountViewMode
 (ie: UITextFieldViewModeNever) changing the value of characterLimit has no effect.

 If the character count goes above its max, the underline, the character count / max label and
 any floating placeholder label all turn to the error color; the text input will be in error state.
 Note: setErrorText:errorAccessibilityValue: also sets these MDCTextInput properties.

 There is no support for a minimum character count.
 */
@property(nonatomic, assign) IBInspectable NSUInteger characterCountMax;

/**
 Controls when the character count will be shown and therefore whether character counting determines
 error state.
 */
@property(nonatomic, assign) UITextFieldViewMode characterCountViewMode;

/**
 Color for decorations that indicates the input is not enabled / not accepting touch.

 Default is disabledColorDefault.
 */
@property(nonatomic, null_resettable, strong) UIColor *disabledColor;

/** Default value for disabledColor. */
@property(class, nonatomic, null_resettable, strong) UIColor *disabledColorDefault;

/**
 The color used to denote error state in decorations, the errorText's label, the placeholder and
 the character count label.

 Default is errorColorDefault.
 */
@property(nonatomic, null_resettable, strong) UIColor *errorColor;

/** Default value for errorColor. */
@property(class, nonatomic, null_resettable, strong) UIColor *errorColorDefault;

/**
 The text being displayed in the leading underline label when in an error state.

 NOTE: To set this value, you must use setErrorText:errorAccessibilityValue:.
 */
@property(nonatomic, nullable, copy, readonly) NSString *errorText;

/**
 Text displayed in the leading underline label.

 This text should give context or instruction to the user. If error text is set, it is
 not shown.
 */
@property(nonatomic, nullable, copy) IBInspectable NSString *helperText;

/**
 The color applied to the placeholder when inline (not floating).

 Default is inlinePlaceholderColorDefault.

 Note: The [Design guidance](https://material.io/components/text-fields/#anatomy) changed and treats
 placeholder as distinct from `label text`. The placeholder-related properties of this class most
 closely align with the "label text" as described in the guidance.
 */
@property(nonatomic, null_resettable, strong) UIColor *inlinePlaceholderColor;

/**
 Default value for inlinePlaceholderColor.

 Note: The [Design guidance](https://material.io/components/text-fields/#anatomy) changed and treats
 placeholder as distinct from `label text`. The placeholder-related properties of this class most
 closely align with the "label text" as described in the guidance.
 */
@property(class, nonatomic, null_resettable, strong) UIColor *inlinePlaceholderColorDefault;

/**
 The font applied to the text input.

 Default or in case this property is nil, the value will be textInputFontDefault.
 If textInputFontDefault is nil, textInput.font would be the fallback.
 */
@property(nonatomic, null_resettable, strong) UIFont *textInputFont;

/** Default value for textInputFontDefault. If nil, textInput.font would be the fallback.  */
@property(class, nonatomic, nullable, strong) UIFont *textInputFontDefault;

/**
 The font applied to the placeholder when inline (not floating).

 Default is inlinePlaceholderFontDefault;

 Note: The [Design guidance](https://material.io/components/text-fields/#anatomy) changed and treats
 placeholder as distinct from `label text`. The placeholder-related properties of this class most
 closely align with the "label text" as described in the guidance.
 */
@property(nonatomic, null_resettable, strong) UIFont *inlinePlaceholderFont;

/**
 Default value for inlinePlaceholderFont.

 Note: The [Design guidance](https://material.io/components/text-fields/#anatomy) changed and treats
 placeholder as distinct from `label text`. The placeholder-related properties of this class most
 closely align with the "label text" as described in the guidance.
 */
@property(class, nonatomic, null_resettable, strong) UIFont *inlinePlaceholderFontDefault;

/**
 The font applied to the leading side underline label.

 Default is leadingUnderlineLabelFontDefault.
 */
@property(nonatomic, null_resettable, strong) UIFont *leadingUnderlineLabelFont;

/** Default value for leadingUnderlineLabelFont. */
@property(class, nonatomic, null_resettable, strong) UIFont *leadingUnderlineLabelFontDefault;

/**
 The color applied to the leading side underline label when not in error state.

 Default is leadingUnderlineLabelTextColorDefault.
 */
@property(nonatomic, null_resettable, strong) UIColor *leadingUnderlineLabelTextColor;

/** Default value for leadingUnderlineLabelTextColor. */
@property(class, nonatomic, null_resettable, strong) UIColor *leadingUnderlineLabelTextColorDefault;

/*
 Indicates whether the alert contents should automatically update their font when the device’s
 UIContentSizeCategory changes.

 This property is modeled after the adjustsFontForContentSizeCategory property in the
 UIContentSizeCategoryAdjusting protocol added by Apple in iOS 10.0.

 Default is @c NO.
 */
@property(nonatomic, assign, readwrite, setter=mdc_setAdjustsFontForContentSizeCategory:)
    BOOL mdc_adjustsFontForContentSizeCategory;

/**
 Color for decorations that indicates the input is enabled but not currently editing.

 Default is normalColorDefault.
 */
@property(nonatomic, null_resettable, strong) UIColor *normalColor;

/** Default value for normalColor. */
@property(class, nonatomic, null_resettable, strong) UIColor *normalColorDefault;

/**
 The text displayed in the placeholder label.

 Note: The [Design guidance](https://material.io/components/text-fields/#anatomy) changed and treats
 placeholder as distinct from `label text`. The placeholder-related properties of this class most
 closely align with the "label text" as described in the guidance.
 */
@property(nonatomic, nullable, copy) NSString *placeholderText;

/**
 The corners to be rounded in the border area.

 Default is roundedCornersDefault.
 */
@property(nonatomic, assign) UIRectCorner roundedCorners;

/** Default for roundedCorners. */
@property(class, nonatomic, assign) UIRectCorner roundedCornersDefault;

/** The text input the controller is affecting. */
@property(nonatomic, nullable, strong) UIView<MDCTextInput> *textInput;

/**
 The tintColor applied to the textInput's clear button.
 See @c UIImageView.tintColor for additional details.
 */
@property(nonatomic, null_resettable, strong) UIColor *textInputClearButtonTintColor;

/**
 Default value for @c textInputClearButtonTintColor. */
@property(class, nonatomic, nullable, strong) UIColor *textInputClearButtonTintColorDefault;

/**
 The font applied to the trailing side underline label.

 Default is trailingUnderlineLabelFontDefault.
 */
@property(nonatomic, null_resettable, strong) UIFont *trailingUnderlineLabelFont;

/** Default value for trailingUnderlineLabelFont. */
@property(class, nonatomic, null_resettable, strong) UIFont *trailingUnderlineLabelFontDefault;
/**
 The color applied to the trailing side underline label when not in error state.

 Default is trailingUnderlineLabelTextColorDefault.
 */
@property(nonatomic, nullable, strong) UIColor *trailingUnderlineLabelTextColor;

/** Default value for trailingUnderlineLabelTextColor. */
@property(class, nonatomic, nullable, strong) UIColor *trailingUnderlineLabelTextColorDefault;

/**
 Height of the underline when text field is first responder.

 Default is underlineHeightActiveDefault.
 */
@property(nonatomic, assign) CGFloat underlineHeightActive;

/** Default value for underlineHeightActive. */
@property(class, nonatomic, assign) CGFloat underlineHeightActiveDefault;

/**
 Height of the underline when NOT first responder.

 Default is underlineHeightNormalDefault.
 */
@property(nonatomic, assign) CGFloat underlineHeightNormal;

/** Default value for underlineHeightNormal. */
@property(class, nonatomic, assign) CGFloat underlineHeightNormalDefault;

/**
 Controls when the underline will be shown.

 The underline is an overlay that can be hidden depending on the editing state of the input text.

 Default is underlineViewModeDefault.
 */
@property(nonatomic, assign) UITextFieldViewMode underlineViewMode;

/** Default value for underlineViewMode. */
@property(class, nonatomic, assign) UITextFieldViewMode underlineViewModeDefault;

/**
 Convenience init. Never fails.

 @param input An MDCTextInput this controller will manage.
 */
- (nonnull instancetype)initWithTextInput:(nullable UIView<MDCTextInput> *)input;

/**
 Sets the state of the controller by setting the values of properties errorText and
 errorAccessibilityValue.

 The value of errorText controls the state of the text input.

 @param errorText               The error text to be shown as underline text. (Copied.)
 @param errorAccessibilityValue Optional override of default underline text accessibility value.
                                (Copied.)

 This method is usually called from whatever object is the UITextFieldDelegate for the MDCTextField.
 That object is responsible for validation of the text and calling this method if the error state
 needs to change.

 When errorText != nil, the text input is in an error state:
 - The error text appears in the underline text with the errorColor as text color.
 - The input rectangle's underline, placeholder and character are colored to the errorColor.

 When errorText == nil, the text input is not in error state:
 - The underline text is restored to the color and value it was.
 - The underline color and height is restored.
 - The placeholder text is restored to the color it was.
 - The character count text is restored to the color it was.

 Setting errorText to an empty string (@"") will put the input in error state but the underline text
 will be empty. It will color (if visible) the underline, the placeholder, and the character
 count in the errorColor.

 Setting errorAccessibilityValue when errorText == nil has no effect.

 Note: The characterCountMax property also affects these same MDCTextInput properties.
 */
- (void)setErrorText:(nullable NSString *)errorText
    errorAccessibilityValue:(nullable NSString *)errorAccessibilityValue;

/**
 Sets helper text and a corresponding accessibilityLabel.

 @param helperText               The helper text to be shown as leading underline text. (Copied.)
 @param helperAccessibilityLabel Optional override of leading underline accessibilityLabel when
                                 helper text is displayed. (Copied.)

 If the TextField is in an error state helperText is saved as the previousLeadingText, and
 helperAccessibilityLabel is saved in an instance variable. When the TextField eventually leaves the
 error state the previousLeadingText becomes the leadingUnderlineLabel's text and the
 helperAccessibilityLabel becomes the leadingUnderlinLabel's accessibilityLabel.

 If the TextField is not in an error state helperText is set as the leadingUnderlineLabel's text and
 helperAccessibilityLabel is set as the leadingUnderlineLabel's accessibilityLabel.
 */
- (void)setHelperText:(nullable NSString *)helperText
    helperAccessibilityLabel:(nullable NSString *)helperAccessibilityLabel;

@end

API_DEPRECATED_END
