/*
 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 <UIKit/UIKit.h>

#import "MaterialButtons.h"
#import "MaterialButtons+ButtonThemer.h"

@interface ButtonsContentEdgeInsetsExample : UIViewController
@property(weak, nonatomic) IBOutlet MDCButton *textButton;
@property(weak, nonatomic) IBOutlet MDCButton *containedButton;
@property(weak, nonatomic) IBOutlet MDCFloatingButton *floatingActionButton;
@property(weak, nonatomic) IBOutlet UISwitch *inkBoundingSwitch;
@end

@implementation ButtonsContentEdgeInsetsExample

#pragma mark - Catalog by Convention

+ (NSArray<NSString *> *)catalogBreadcrumbs {
  return @[ @"Buttons", @"Buttons (Content Edge Insets)" ];
}

+ (NSString *)catalogStoryboardName {
  return @"ButtonsContentEdgeInsets";
}

+ (BOOL)catalogIsPrimaryDemo {
  return NO;
}

#pragma mark - UIViewController

- (void)viewDidLoad {
  [super viewDidLoad];

  MDCButtonScheme *buttonScheme = [[MDCButtonScheme alloc] init];
  [MDCContainedButtonThemer applyScheme:buttonScheme toButton:self.containedButton];
  [MDCTextButtonThemer applyScheme:buttonScheme toButton:self.textButton];

  self.textButton.contentEdgeInsets = UIEdgeInsetsMake(64, 64, 0, 0);
  self.containedButton.contentEdgeInsets = UIEdgeInsetsMake(0, 0, 64, 64);
  [self.floatingActionButton setContentEdgeInsets:UIEdgeInsetsMake(40, 40, 0, 0)
                                         forShape:MDCFloatingButtonShapeDefault
                                           inMode:MDCFloatingButtonModeNormal];

  [self updateInkStyle:self.inkBoundingSwitch.isOn ? MDCInkStyleBounded : MDCInkStyleUnbounded];
}

- (void)updateInkStyle:(MDCInkStyle)inkStyle {
  self.textButton.inkStyle = inkStyle;
  self.containedButton.inkStyle = inkStyle;
  self.floatingActionButton.inkStyle = inkStyle;
}

- (IBAction)didChangeInkStyle:(UISwitch *)sender {
  [self updateInkStyle:sender.isOn ? MDCInkStyleBounded : MDCInkStyleUnbounded];
}

@end
