// Copyright 2015-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 "MaterialShadowElevations.h"

API_DEPRECATED_BEGIN("🤖👀 Use branded UIKit shadows instead. "
                     "See go/material-ios-elevation/gm2-migration for more details. "
                     "This has go/material-ios-migrations#scriptable-potential 🤖👀.",
                     ios(12, 12))

/**
 Metrics of the Material shadow effect.

 These can be used if you require your own shadow implementation but want to match the material
 spec.
 */
@interface MDCShadowMetrics : NSObject
@property(nonatomic, readonly) CGFloat topShadowRadius;
@property(nonatomic, readonly) CGSize topShadowOffset;
@property(nonatomic, readonly) float topShadowOpacity;
@property(nonatomic, readonly) CGFloat bottomShadowRadius;
@property(nonatomic, readonly) CGSize bottomShadowOffset;
@property(nonatomic, readonly) float bottomShadowOpacity;

/**
 The shadow metrics for manually creating shadows given an elevation.

 @param elevation The shadow's elevation in points.
 @return The shadow metrics.
 */
+ (nonnull MDCShadowMetrics *)metricsWithElevation:(CGFloat)elevation;
@end

/**
 The Material shadow effect.

 @see
 https://material.io/guidelines/what-is-material/elevation-shadows.html#elevation-shadows-shadows

 Consider rasterizing your MDCShadowLayer if your view will not generally be animating or
 changing size. If you need to animate a rasterized MDCShadowLayer, disable rasterization first.

 For example, if self's layerClass is MDCShadowLayer, you might introduce the following code:

     self.layer.shouldRasterize = YES;
     self.layer.rasterizationScale = [UIScreen mainScreen].scale;
 */
@interface MDCShadowLayer : CALayer

/**
 The elevation of the layer in points.

 The higher the elevation, the more spread out the shadow is. This is distinct from the layer's
 zPosition which can be used to order overlapping layers, but will have no affect on the size of
 the shadow.

 Negative values act as if zero were specified.

 The default value is 0.
 */
@property(nonatomic, assign) MDCShadowElevation elevation;

/**
 Whether to apply the "cutout" shadow layer mask.

 If enabled, then a mask is created to ensure the interior, non-shadow part of the layer is visible.

 Default is YES. Not animatable.
 */
@property(nonatomic, getter=isShadowMaskEnabled, assign) BOOL shadowMaskEnabled;

/**
 Animates the layer's corner radius

 @note At the end of the animation the corner radius is set to your desired corner radius.

 @param cornerRadius The desired corner radius at the end of the animation
 @param timingFunction The timing function you desire for the animation
 @param duration The duration of the animation
 */
- (void)animateCornerRadius:(CGFloat)cornerRadius
         withTimingFunction:(nonnull CAMediaTimingFunction *)timingFunction
                   duration:(NSTimeInterval)duration;

@end

/**
 Subclasses can depend on MDCShadowLayer implementing CALayerDelegate actionForLayer:forKey: in
 order to implicitly animate 'path' or 'shadowPath' on sublayers.
 */
@interface MDCShadowLayer (Subclassing) <CALayerDelegate>

/**
 Override point.
 Called by the shadow layer before the instance lays out its sublayers.
 */
- (void)prepareShadowPath;

@end

API_DEPRECATED_END
