// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef IOS_CHROME_BROWSER_BUBBLE_UI_BUNDLED_BUBBLE_VIEW_CONTROLLER_H_
#define IOS_CHROME_BROWSER_BUBBLE_UI_BUNDLED_BUBBLE_VIEW_CONTROLLER_H_

#import <UIKit/UIKit.h>

typedef NS_ENUM(NSInteger, BubbleAlignment);
typedef NS_ENUM(NSInteger, BubbleArrowDirection);
typedef NS_ENUM(NSInteger, BubbleViewType);
typedef NS_ENUM(NSInteger, BubblePageControlPage);

@protocol BubbleViewDelegate;

// View controller that manages a BubbleView, which points to a UI element of
// interest.
@interface BubbleViewController : UIViewController

// Initializes the bubble with the given text, titleString, arrow direction,
// alignment, type of bubble view and bubble view's delegate (handles bubble
// view's buttons taps). Optional `page number` that when set, shows a page
// control with the number highlighted.
- (instancetype)initWithText:(NSString*)text
                       title:(NSString*)titleString
              arrowDirection:(BubbleArrowDirection)direction
                   alignment:(BubbleAlignment)alignment
              bubbleViewType:(BubbleViewType)type
             pageControlPage:(BubblePageControlPage)page
                    delegate:(id<BubbleViewDelegate>)delegate;

// Extends initializer above with `customNextButtonTitle`.
- (instancetype)initWithText:(NSString*)text
                       title:(NSString*)titleString
              arrowDirection:(BubbleArrowDirection)direction
                   alignment:(BubbleAlignment)alignment
              bubbleViewType:(BubbleViewType)type
             pageControlPage:(BubblePageControlPage)page
       customNextButtonTitle:(NSString*)customNextButtonTitle
                    delegate:(id<BubbleViewDelegate>)delegate;

// Extends initializer above with `totalPageControlPages`.
- (instancetype)initWithText:(NSString*)text
                       title:(NSString*)titleString
              arrowDirection:(BubbleArrowDirection)direction
                   alignment:(BubbleAlignment)alignment
              bubbleViewType:(BubbleViewType)type
             pageControlPage:(BubblePageControlPage)page
       totalPageControlPages:(NSInteger)totalPageControlPages
       customNextButtonTitle:(NSString*)customNextButtonTitle
                    delegate:(id<BubbleViewDelegate>)delegate
    NS_DESIGNATED_INITIALIZER;

// The total number of pages in the Bubble PageControl.
@property(nonatomic, assign) NSInteger totalPageControlPages;

// Custom title for the action button.
@property(nonatomic, copy) NSString* customNextButtonTitle;

- (instancetype)init NS_UNAVAILABLE;

- (instancetype)initWithNibName:(NSString*)nibNameOrNil
                         bundle:(NSBundle*)nibBundleOrNil NS_UNAVAILABLE;

- (instancetype)initWithCoder:(NSCoder*)aDecoder NS_UNAVAILABLE;

// Animates the bubble view in with a fade-in and sink-down animation if
// `animated` is YES, otherwise it just shows the bubble view.
//
// The caller is responsible for adding the bubble view controller to the
// view hierarchy.
- (void)displayAnimated:(BOOL)animated;

// If `hidden`, the arrow hides behind the bubble; otherwise, it is visible and
// pointing to the anchor point. If `animated`, the arrow will be slid out of /
// back in the bubble.
//
// NOTE: This should only be called when the view is in the view hierarchy.
- (void)setArrowHidden:(BOOL)hidden animated:(BOOL)animated;

// Dismisses the bubble. If `animated` is true, the bubble fades out.
//
// The bubble view controller is automatically removed from the view hierarchy.
- (void)dismissAnimated:(BOOL)animated;

// Changes the bubbleView's alignment offset, this might change the bubbleView's
// size.
- (void)setBubbleAlignmentOffset:(CGFloat)alignmentOffset;

// Sets the maximum content size category for the bubble view. If set, the
// bubble view will not scale its text beyond this category.
@property(nonatomic, copy) UIContentSizeCategory maximumContentSizeCategory;

@end

#endif  // IOS_CHROME_BROWSER_BUBBLE_UI_BUNDLED_BUBBLE_VIEW_CONTROLLER_H_
