// 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 <QuartzCore/QuartzCore.h>
#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 "MDCLegacyInkLayerDelegate.h"

API_DEPRECATED_BEGIN(
    "🕘 Schedule time to migrate. "
    "Use default system highlight behavior instead: go/material-ios-touch-response. "
    "This is go/material-ios-migrations#not-scriptable 🕘",
    ios(12, 12))

@protocol MDCLegacyInkLayerDelegate;

/**
 A Core Animation layer that draws and animates the ink effect.

 Quick summary of how the ink ripple works:

 1. On touch down, blast initiates from the touch point.
 2. On touch down hold, it continues to spread, but will gravitate to the center point
    of the view.
 3. On touch up, the ink ripple will lose energy, opacity will start to decrease.
 */
@interface MDCLegacyInkLayer : CALayer

/**
 Ink layer animation delegate. Clients set this delegate to receive updates when ink layer
 animations start and end.
 */
@property(nonatomic, weak, nullable) id<MDCLegacyInkLayerDelegate> animationDelegate;

/** Clips the ripple to the bounds of the layer. */
@property(nonatomic, assign, getter=isBounded) BOOL bounded;

/** Maximum radius of the ink. No maximum if radius is 0 or less. This value is ignored if
 @c bounded is set to |YES|.*/
@property(nonatomic, assign) CGFloat maxRippleRadius;

/** Set the foreground color of the ink. */
@property(nonatomic, strong, nonnull) UIColor *inkColor;

/** Spread duration. */
@property(nonatomic, readonly, assign) NSTimeInterval spreadDuration;

/** Evaporate duration */
@property(nonatomic, readonly, assign) NSTimeInterval evaporateDuration;

/**
 Set to YES if the ink layer should be using a custom center.
 */
@property(nonatomic, assign) BOOL useCustomInkCenter;

/**
 Center point which ink gravitates towards.

 Ignored if useCustomInkCenter is not set.
 */
@property(nonatomic, assign) CGPoint customInkCenter;

/**
 Whether linear expansion should be used for the ink, rather than a Quantum curve. Useful for
 ink which needs to fill the bounds of its view completely and leave those bounds at full speed.
 */
@property(nonatomic, assign) BOOL userLinearExpansion;

/**
 Reset any ink applied to the layer.

 @param animated Enables the ink ripple fade out animation.
 */
- (void)resetAllInk:(BOOL)animated;

/**
 Spreads the ink over the whole view.

 Can be called multiple times which will result in multiple ink ripples.

 @param completionBlock Block called after the completion of the animation.
 @param point Point at which the ink spreads from.
 */
- (void)spreadFromPoint:(CGPoint)point completion:(void (^_Nullable)(void))completionBlock;

/**
 Dissipate ink blast, should be called on touch up.

 If there are multiple ripples at once, the oldest ripple will be evaporated.

 @param completionBlock Block called after the completion of the evaporation.
 */
- (void)evaporateWithCompletion:(void (^_Nullable)(void))completionBlock;

/**
 Dissipates the ink blast, but condenses to a point. Used for touch exit or cancel.

 If there are mulitple ripples, the oldest ripple will be evaporated.

 @param point Evaporate the ink towards the point.
 @param completionBlock Block called after the completion of the evaporation.
 */
- (void)evaporateToPoint:(CGPoint)point completion:(void (^_Nullable)(void))completionBlock;

@end

API_DEPRECATED_END
