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

// TODO(b/151929968): Delete import of delegate headers when client code has been migrated to no
// longer import delegates as transitive dependencies.
#import "MDCDialogPresentationControllerDelegate.h"
#import "MaterialShadowElevations.h"

NS_ASSUME_NONNULL_BEGIN

@class MDCDialogPresentationController;
@protocol MDCDialogPresentationControllerDelegate;

/**
 MDCDialogPresentationController will present a modal ViewController as a dialog according to the
 Material spec.

 https://material.io/go/design-dialogs

 MDCDialogPresentationController should not be used to present full-screen dialogs.

 The presented UIViewController will be asked for it's preferredContentSize to help determine
 the best size for the dialog to be displayed.

 This controller will manage the background dimming view and add a material-styled shadow underneath
 the presented view.

 This controller will respond to the display / dismissal of the keyboard and update the
 presentedView's frame.
 */
@interface MDCDialogPresentationController : UIPresentationController

/**
 An object conforming to MDCDialogPresentationControllerDelegate. When non-nil, the
 MDCDialogPresentationController will call the appropriate MDCDialogPresentationControllerDelegate
 methods on this object.
 */
@property(nonatomic, weak, nullable) id<MDCDialogPresentationControllerDelegate>
    dialogPresentationControllerDelegate;

/**
 Should a tap on the dimmed background view dismiss the presented controller. This property must be
 enabled in order to make use of the @c MDCDialogPresentationControllerDelegate methods related to
 dismissal.

 Defaults to YES.
 */
@property(nonatomic, assign) BOOL dismissOnBackgroundTap;

/**
 Customize the corner radius of the shadow to match the presented view's corner radius.

 By default, the corner radius of the presented shadow is adjusted to match the corner radius of the
 view being presented.  This behavior is achieved without making any changes to dialogCornerRadius.
 Once a value is set on dialogCornerRadius, that value will be used to determine the radius of both
 the presetned view and the shadow. That means that any further changes to the presented view's
 corner radius (yourViewController.view.layer.cornerRadius) will be ignored once dialogCornerRadius
 is set.

 In either cases, the presentation controller ensures that the shadow layer's corner radius matches
 the presented view's.

 Material themers use dialogCornerRadius for setting the corner radius, therefore, when applying
 a themer to your custom UIViewController, any value you assign to your view's corner radius
 will be ignored. If you wish to override the corner radius after a themer is called, make sure
 to set it to dialogCornerRadius, and not to the presented view's corner radius.

 Defaults to: The presented view's corner radius.
 */
@property(nonatomic, assign) CGFloat dialogCornerRadius;

/**
 Customize the elevation of the shadow to match the presented view's shadow.

 Defaults to 24.0.
 */
@property(nonatomic, assign) MDCShadowElevation dialogElevation;

/**
 The color of the shadow that will be applied to the @c MDCDialogPresentationController.

 Defaults to black.
 */
@property(nonatomic, copy, nonnull) UIColor *dialogShadowColor;

/**
 Customize the color of the background scrim.

 Defaults to a semi-transparent Black.
 */
@property(nonatomic, strong, nullable) UIColor *scrimColor;

/**
 The transform applied to the @c MDCDialogPresentationController. Used to ensure the shadow
 properly tracks the view.

 The default value is @c CGAffineTransformIdentity.
 */
@property(nonatomic, assign) CGAffineTransform dialogTransform;

/**
 The spacing between the dialog and the @c safeArea of the presenting view controller.

 Defaults to {24, 20, 24, 20}.
 */
@property(nonatomic, assign) UIEdgeInsets dialogEdgeInsets;

/**
 Returns the size of the specified child view controller's content.

 The size is initially based on container.preferredSize. Width is will have a minimum of 280 and a
 maximum of the parentSize - 40 for the padding on the left and right size.

 Height has no minimum.  Height has a maximum of the parentSize - height of any displayed
 keyboards - 48 for the padding on the top and bottom.  If preferredSize.height is 0, height will
 be set to the maximum.
 */
- (CGSize)sizeForChildContentContainer:(nonnull id<UIContentContainer>)container
               withParentContainerSize:(CGSize)parentSize;

/**
 Returns the frame rectangle to assign to the presented view at the end of the animations.

 The size of the frame is determined by sizeForChildContentContainer:withParentContainerSize:. The
 presentedView is centered horizontally and verically in the available space.  The available space
 is the size of the containerView subtracting any space taken up by the keyboard.
 */
- (CGRect)frameOfPresentedViewInContainerView;

/**
 A block that is invoked when the MDCDialogPresentationController receives a call to @c
 traitCollectionDidChange:. The block is called after the call to the superclass.
 */
@property(nonatomic, copy, nullable) void (^traitCollectionDidChangeBlock)
    (MDCDialogPresentationController *_Nullable presentationController,
     UITraitCollection *_Nullable previousTraitCollection);

@end

NS_ASSUME_NONNULL_END
