// Copyright 2018-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>

@interface MDCAlertControllerView : UIView <UIContentSizeCategoryAdjusting>

@property(nonatomic, strong, nullable) UIFont *titleFont UI_APPEARANCE_SELECTOR;
@property(nonatomic, strong, nullable) UIColor *titleColor UI_APPEARANCE_SELECTOR;

@property(nonatomic, strong, nullable) UIImage *titleIcon;
@property(nonatomic, strong, nullable) UIColor *titleIconTintColor;

@property(nonatomic, strong, nullable) UIFont *messageFont UI_APPEARANCE_SELECTOR;
@property(nonatomic, strong, nullable) UIColor *messageColor UI_APPEARANCE_SELECTOR;

@property(nonatomic, assign) CGFloat cornerRadius;

#pragma mark - Adjustable Insets

/**
 The edge insets around the title icon or title icon view against the dialog edges (top, leading,
 trailing) and the title (bottom). Note that `titleIconInsets.bottom` takes precedence over
 `titleInsets.top`.

 Default value is UIEdgeInsets(top: 24, leading: 24, bottom: 12, trailing: 24).
 */
@property(nonatomic, assign) UIEdgeInsets titleIconInsets;

/**
 The edge insets around the title against the dialog edges or its neighbor elements. Note that
 `titleInsets.bottom` takes precedence over `contentInsets.top`.

 Default value is UIEdgeInsets(top: 24, leading: 24, bottom: 20, trailing: 24).
 */
@property(nonatomic, assign) UIEdgeInsets titleInsets;

/**
 The edge insets around the content view (which includes the message, and the accessory view if it
 is set) against the dialog edges or its neighbor elements, the title and the actions.

 Default value is UIEdgeInsets(top: 24, leading: 24, bottom: 24, trailing: 24).
 */
@property(nonatomic, assign) UIEdgeInsets contentInsets;

/**
 The edge insets around the content view (which includes the message, and the accessory view if it
 is set) against the dialog edges or its neighbor elements, the title and the actions.

 In GM3, the bottom content inset is not needed due to the top action inset provding 24 spacing.

 Default value is UIEdgeInsets(top: 24, leading: 24, bottom: 0, trailing: 24).
 */
@property(nonatomic, assign) UIEdgeInsets M3CDialogContentInsets;

/**
 The edge insets around the actions against the dialog edges and its neighbor, which could be any of
 the other elements: the message, accessory view, title, title icon or title icon view.

 The action insets are taken based on the visible area of the button, not its frame.
 Since the default size of the alert buttons do not meet minimum touch area requirement,
 the buttons frame are larger than the visible area, allowing for a large enough touch area.

 Default value is UIEdgeInsets(top: 8, leading: 8, bottom: 8, trailing: 8).
 */
@property(nonatomic, assign) UIEdgeInsets actionsInsets;

/**
 The edge insets around the actions against the dialog edges and its neighbor,
 which could be any of the other elements: the message, accessory view, title,
 title icon or title icon view.

 Since GM3 buttons meet minimum touch area requirements by default, the insets
 are set directly to Figma spec.

 Default value is UIEdgeInsets(top: 24, leading: 24, bottom: 24, trailing: 24).
 */
@property(nonatomic, assign) UIEdgeInsets M3CButtonActionsInsets;

/**
 The horizontal space between the action buttons when the buttons are horizontally aligned, and if
 more than one button is presented.

 Default value is 8.
 */
@property(nonatomic, assign) CGFloat actionsHorizontalMargin;

/**
 The vertical space between the action buttons when the buttons are vertically aligned, and if more
 than one button is presented.

 The action buttons represent the visible areas of the buttons, it can differ from the frame when
 the button doesn't meet the minimum touch area requirement and its frame is adjusted to be larger
 then its visible area.

 Default value is 12.
 */
@property(nonatomic, assign) CGFloat actionsVerticalMargin;
/**
 The vertical space between the action buttons when the buttons are vertically aligned, and if more
 than one button is presented.
 */
@property(nonatomic, assign) BOOL adjustButtonVerticalMargin;
/**
 The GM3 vertical space between the action buttons when the buttons are
 vertically aligned, and if more than one button is presented.

 All GM3 buttons meet minimum touch area by default.

 Default value is 8.
 */
@property(nonatomic, assign) CGFloat M3CButtonActionsVerticalMargin;

/**
 The vertical inset between the accessory view and the message, if both are present.

 Default value is 20.
 */
@property(nonatomic, assign) CGFloat accessoryViewVerticalInset;

/**
The horizontal inset that sets the leading and trailing margins of the accessory view. The accessory
insets are added to the contentInsets.leading and contentInsets.trailing values when calculating the
leading and trailing margins of the accessory view.

@note: Unlike the content's horizontal insets, the accessory insets use a single value for both
       leading and trailing edge, while the final margins are calculated using both the content and
       the accessory insets.

@note: You may use a negative `accessoryViewHorizontalInset` value in order to to decreases the
       leading and trailing margins of the accessory view.

Default value is 0 (meaning, the accessory view's horizontal insets are determined soley by the
                    horizontal contentInsets values).
*/
@property(nonatomic, assign) CGFloat accessoryViewHorizontalInset;

/** The horizontal alignment of @c title. */
@property(nonatomic, assign) NSTextAlignment titleAlignment;

@end

@interface MDCAlertControllerView (Deprecated)

@property(nonatomic, strong, nullable) UIColor *buttonColor UI_APPEARANCE_SELECTOR __deprecated_msg(
    "Use MDCAlertController's buttonForAction API");
@property(nonatomic, strong, nullable)
    UIColor *buttonInkColor UI_APPEARANCE_SELECTOR __deprecated_msg(
        "Use MDCAlertController's buttonForAction API");

/**
 By setting this property to @c YES, the Ripple component will be used instead of Ink to display
 visual feedback to the user.

 @note This property will eventually be enabled by default, deprecated, and then deleted as part of
 our migration to Ripple. Learn more at
 https://github.com/material-components/material-components-ios/tree/develop/components/Ink#migration-guide-ink-to-ripple

 Defaults to @c NO.
 */
@property(nonatomic, assign) BOOL enableRippleBehavior __deprecated_msg(
    "See go/material-ios-touch-response, Ripple should not be used.");

@end
