// 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_TOOLBAR_LEGACY_UI_BUNDLED_BUTTONS_LEGACY_TOOLBAR_BUTTON_H_
#define IOS_CHROME_BROWSER_TOOLBAR_LEGACY_UI_BUNDLED_BUTTONS_LEGACY_TOOLBAR_BUTTON_H_

#import <UIKit/UIKit.h>

#import "ios/chrome/browser/shared/ui/util/layout_guide_names.h"
#import "ios/chrome/browser/toolbar/legacy/ui_bundled/buttons/toolbar_component_options.h"

@protocol GeminiCommands;
@class LayoutGuideCenter;
@class ToolbarConfiguration;

using ToolbarButtonImageLoader = UIImage* (^)(void);

// UIButton subclass used as a Toolbar component.
@interface LegacyToolbarButton : UIButton

// Configuration object used to get colors.
@property(nonatomic, weak) ToolbarConfiguration* toolbarConfiguration;
// Bitmask used for SizeClass visibility.
@property(nonatomic, assign) ToolbarComponentVisibility visibilityMask;
// Returns true if the LegacyToolbarButton should be hidden in the current
// SizeClass.
@property(nonatomic, assign) BOOL hiddenInCurrentSizeClass;
// Returns true if the LegacyToolbarButton should be hidden due to a current UI
// state or WebState.
@property(nonatomic, assign) BOOL hiddenInCurrentState;
// Name of the layout guide this button should be constrained to, if not nil.
// The constraints to the layout guide are only valid when the button is
// displayed. Also, they can be dropped/changed upon size class changes or
// rotations. Any view constrained to them is expected to be dismissed on such
// events.
@property(nonatomic, strong) GuideName* guideName;
// The layout guide center for this button.
@property(nonatomic, strong) LayoutGuideCenter* layoutGuideCenter;
// Whether this button is highlighted for an IPH, having a blue background. This
// color will override the spotlighted background color.
@property(nonatomic, assign) BOOL iphHighlighted;
// View used to display the view used for the spotlight effect.
@property(nonatomic, strong) UIView* spotlightView;
// Whether this button has blue dot promo.
@property(nonatomic, assign) BOOL hasBlueDot;
// Dispatcher for Gemini commands.
@property(nonatomic, weak) id<GeminiCommands> geminiHandler;
// String used for voiceover for the blue dot on the icon. Assumes if there is a
// blue dot on the toolbar button then it always has the same meaning.
@property(nonatomic, copy) NSString* blueDotAccessibilityLabel;

// Returns a LegacyToolbarButton with a type system, using the `imageLoader` to
// load the image for normal state. Can only be used when
// `kEnableStartupImprovements` is enabled.
- (instancetype)initWithImageLoader:(ToolbarButtonImageLoader)imageLoader;
// Returns a LegacyToolbarButton using the `imageLoader` to build image for
// normal state and `IPHHighlightedImageLoader` to load image for
// IPHHighlightedImage state. Can only be used when`kEnableStartupImprovements`
// is enabled.
- (instancetype)initWithImageLoader:(ToolbarButtonImageLoader)imageLoader
          IPHHighlightedImageLoader:
              (ToolbarButtonImageLoader)IPHHighlightedImageLoader;

// Checks if the LegacyToolbarButton should be visible in the current SizeClass,
// afterwards it calls setHiddenForCurrentStateAndSizeClass if needed.
- (void)updateHiddenInCurrentSizeClass;

// Sets a new image loader. If the image was previously loaded, it reloads it.
// Otherwise, it stores the image loader block and wait for the image to be
// lazily loaded.
- (void)setImageLoader:(ToolbarButtonImageLoader)imageLoader;

@end

#endif  // IOS_CHROME_BROWSER_TOOLBAR_LEGACY_UI_BUNDLED_BUTTONS_LEGACY_TOOLBAR_BUTTON_H_
