// 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 "supplemental/FeatureHighlightExampleSupplemental.h"
#import "MaterialButtons.h"
#import "MaterialButtons+Theming.h"
#import "MaterialFeatureHighlight+ColorThemer.h"
#import "MaterialFeatureHighlight.h"
#import "MaterialColorScheme.h"
#import "MaterialContainerScheme.h"
#import "MaterialTypographyScheme.h"

@implementation FeatureHighlightShownViewExample

- (id)init {
  self = [super init];
  if (self) {
    self.colorScheme =
        [[MDCSemanticColorScheme alloc] initWithDefaults:MDCColorSchemeDefaultsMaterial201804];
    self.typographyScheme = [[MDCTypographyScheme alloc] init];
  }
  return self;
}

- (MDCContainerScheme *)containerScheme {
  MDCContainerScheme *scheme = [[MDCContainerScheme alloc] init];
  scheme.colorScheme = self.colorScheme;
  scheme.typographyScheme = self.typographyScheme;
  return scheme;
}

- (void)didTapButton:(id)sender {
  MDCFloatingButton *fab = [[MDCFloatingButton alloc] init];
  [fab setImage:[UIImage imageNamed:@"ic_add"] forState:UIControlStateNormal];
  [fab sizeToFit];
  fab.center = _button.center;

  [fab applySecondaryThemeWithScheme:self.containerScheme];

  MDCFeatureHighlightViewController *vc =
      [[MDCFeatureHighlightViewController alloc] initWithHighlightedView:_button
                                                             andShowView:fab
                                                              completion:^(BOOL accepted) {
                                                                if (accepted) {
                                                                  [self fabDidTap:fab];
                                                                }
                                                              }];
  [MDCFeatureHighlightColorThemer applySemanticColorScheme:self.colorScheme
                          toFeatureHighlightViewController:vc];
  vc.titleFont = self.typographyScheme.headline6;
  vc.bodyFont = self.typographyScheme.body2;
  vc.titleText = @"Shown views can be interactive";
  vc.bodyText = @"The shown button has custom tap animations.";
  [self presentViewController:vc animated:YES completion:nil];
}

- (void)fabDidTap:(MDCFloatingButton *)sender {
  NSLog(@"Tapped %@", sender);
}

@end
