// Copyright 2018-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 "MaterialButtons.h"
#import "MaterialButtons+ButtonThemer.h"
#import "MaterialButtons+ColorThemer.h"
#import "MaterialButtons+TypographyThemer.h"
#import "MaterialShapes.h"
#import "MaterialShapeLibrary.h"
#import "MaterialTypography.h"
#import "supplemental/ButtonsTypicalUseSupplemental.h"

@interface ButtonsShapesExampleViewController ()
@property(nonatomic, strong) MDCFloatingButton *floatingButton;
@end

@implementation ButtonsShapesExampleViewController

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

- (MDCButton *)buildCustomStrokedButton {
  MDCButton *button = [[MDCButton alloc] init];
  [button setBorderWidth:1.0 forState:UIControlStateNormal];
  [button setBorderColor:[UIColor colorWithWhite:(CGFloat)0.1 alpha:1]
                forState:UIControlStateNormal];
  return button;
}

- (void)viewDidLoad {
  [super viewDidLoad];

  self.view.backgroundColor = [UIColor colorWithWhite:(CGFloat)0.9 alpha:1];
  UIColor *titleColor = [UIColor whiteColor];

  MDCButtonScheme *buttonScheme = [[MDCButtonScheme alloc] init];
  buttonScheme.colorScheme = self.colorScheme;
  buttonScheme.typographyScheme = self.typographyScheme;

  // Raised button

  MDCButton *containedButton = [[MDCButton alloc] init];
  [containedButton setTitle:@"Add To Cart" forState:UIControlStateNormal];
  [MDCContainedButtonThemer applyScheme:buttonScheme toButton:containedButton];

  UIImage *plusImage = [UIImage imageNamed:@"Plus"];
  plusImage = [plusImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
  [containedButton setImage:plusImage forState:UIControlStateNormal];

  MDCRectangleShapeGenerator *raisedShapeGenerator =
      [[MDCRectangleShapeGenerator alloc] init];
  [raisedShapeGenerator setCorners:[[MDCCutCornerTreatment alloc] initWithCut:8]];
  containedButton.shapeGenerator = raisedShapeGenerator;

  [containedButton sizeToFit];
  [containedButton addTarget:self
                   action:@selector(didTap:)
         forControlEvents:UIControlEventTouchUpInside];
  [self.view addSubview:containedButton];

  // Disabled raised button

  MDCButton *disabledContainedButton = [[MDCButton alloc] init];
  [disabledContainedButton setTitle:@"Disabled" forState:UIControlStateNormal];
  [MDCContainedButtonThemer applyScheme:buttonScheme toButton:disabledContainedButton];

  MDCRectangleShapeGenerator *disabledRaisedShapeGenerator =
      [[MDCRectangleShapeGenerator alloc] init];
  MDCCurvedCornerTreatment *curvedCorners = [[MDCCurvedCornerTreatment alloc] init];
  curvedCorners.size = CGSizeMake(10, 30);
  [disabledRaisedShapeGenerator setCorners:curvedCorners];
  disabledContainedButton.shapeGenerator = disabledRaisedShapeGenerator;

  [disabledContainedButton sizeToFit];
  [disabledContainedButton addTarget:self
                           action:@selector(didTap:)
                 forControlEvents:UIControlEventTouchUpInside];
  [disabledContainedButton setEnabled:NO];
  [self.view addSubview:disabledContainedButton];

  // Flat button

  MDCButton *flatButton = [[MDCButton alloc] init];
  [flatButton setTitle:@"Oval Flat" forState:UIControlStateNormal];
  [MDCTextButtonThemer applyScheme:buttonScheme toButton:flatButton];

  MDCPillShapeGenerator *flatShapeGenerator = [[MDCPillShapeGenerator alloc] init];
  flatButton.shapeGenerator = flatShapeGenerator;

  [flatButton sizeToFit];
  [flatButton addTarget:self
                 action:@selector(didTap:)
       forControlEvents:UIControlEventTouchUpInside];
  [self.view addSubview:flatButton];

  // Custom stroked button

  MDCButton *strokedButton = [self buildCustomStrokedButton];
  [strokedButton setTitle:@"Button" forState:UIControlStateNormal];
  [MDCButtonTypographyThemer applyTypographyScheme:self.typographyScheme toButton:strokedButton];
  [MDCButtonColorThemer applySemanticColorScheme:self.colorScheme toButton:strokedButton];

  MDCSlantedRectShapeGenerator *strokedShapeGenerator =
      [[MDCSlantedRectShapeGenerator alloc] init];
  strokedShapeGenerator.slant = 10;
  strokedButton.shapeGenerator = strokedShapeGenerator;

  [strokedButton sizeToFit];
  [strokedButton addTarget:self
                    action:@selector(didTap:)
          forControlEvents:UIControlEventTouchUpInside];
  [self.view addSubview:strokedButton];

  // Disabled custom stroked button

  MDCButton *disabledStrokedButton = [self buildCustomStrokedButton];
  [disabledStrokedButton setTitle:@"Button" forState:UIControlStateNormal];
  [MDCButtonTypographyThemer applyTypographyScheme:self.typographyScheme
                                          toButton:disabledStrokedButton];
  [MDCButtonColorThemer applySemanticColorScheme:self.colorScheme
                                        toButton:disabledStrokedButton];

  MDCRectangleShapeGenerator *disabledStrokedShapeGenerator =
      [[MDCRectangleShapeGenerator alloc] init];
  [disabledStrokedShapeGenerator setTopEdge:
      [[MDCTriangleEdgeTreatment alloc] initWithSize:5 style:MDCTriangleEdgeStyleCut]];
  [disabledStrokedShapeGenerator setTopLeftCorner:[[MDCCutCornerTreatment alloc] initWithCut:10]];
  [disabledStrokedShapeGenerator setTopRightCorner:
      [[MDCCurvedCornerTreatment alloc] initWithSize:CGSizeMake(5, 20)]];
  [disabledStrokedShapeGenerator setBottomEdge:
      [[MDCTriangleEdgeTreatment alloc] initWithSize:5 style:MDCTriangleEdgeStyleHandle]];
  [disabledStrokedShapeGenerator setBottomRightCorner:
      [[MDCCutCornerTreatment alloc] initWithCut:5]];
  [disabledStrokedShapeGenerator setBottomLeftCorner:
      [[MDCCurvedCornerTreatment alloc] initWithSize:CGSizeMake(10, 5)]];
  disabledStrokedButton.shapeGenerator = disabledStrokedShapeGenerator;

  [disabledStrokedButton sizeToFit];
  [disabledStrokedButton addTarget:self
                            action:@selector(didTap:)
                  forControlEvents:UIControlEventTouchUpInside];
  [disabledStrokedButton setEnabled:NO];
  [self.view addSubview:disabledStrokedButton];

  // Floating action button

  self.floatingButton = [[MDCFloatingButton alloc] init];
  [self.floatingButton setTitleColor:titleColor forState:UIControlStateNormal];
  [self.floatingButton setImageTintColor:UIColor.whiteColor forState:UIControlStateNormal];
  [self.floatingButton setImage:plusImage forState:UIControlStateNormal];
  [self.floatingButton sizeToFit];

  MDCRectangleShapeGenerator *floatingShapeGenerator = [[MDCRectangleShapeGenerator alloc] init];
  [floatingShapeGenerator
      setCorners:[[MDCCutCornerTreatment alloc]
                     initWithCut:CGRectGetWidth(self.floatingButton.bounds) / 2]];
  self.floatingButton.shapeGenerator = floatingShapeGenerator;
  [MDCFloatingActionButtonThemer applyScheme:buttonScheme toButton:self.floatingButton];

  [self.floatingButton addTarget:self
                          action:@selector(didTap:)
                forControlEvents:UIControlEventTouchUpInside];
  [self.view addSubview:self.floatingButton];

  self.buttons = @[
    containedButton, disabledContainedButton, flatButton, strokedButton,
    disabledStrokedButton, self.floatingButton
  ];

  [self setupShapeExampleViews];
}

- (void)setupShapeExampleViews {
  UILabel *raisedButtonLabel = [self addLabelWithText:@"Contained: Cut Corners"];
  UILabel *disabledRaisedButtonLabel = [self addLabelWithText:@"Disabled Contained: Curved Cut"];
  UILabel *flatButtonLabel = [self addLabelWithText:@"Flat: Oval Ink"];
  UILabel *strokedButtonLabel = [self addLabelWithText:@"Stroked: Triangular"];
  UILabel *disabledStrokedButtonLabel = [self addLabelWithText:@"Stroked Disabled: Freeform"];
  UILabel *floatingDiamondLabel = [self addLabelWithText:@"Floating Action: Diamond"];

  self.labels = @[
    raisedButtonLabel, disabledRaisedButtonLabel, flatButtonLabel, strokedButtonLabel,
    disabledStrokedButtonLabel, floatingDiamondLabel
  ];
}

- (void)didTap:(id)sender {
  NSLog(@"%@ was tapped.", NSStringFromClass([sender class]));
  if (sender == self.floatingButton) {
    [self.floatingButton
          collapse:YES
        completion:^{
          dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)),
                         dispatch_get_main_queue(), ^{
                           [self.floatingButton expand:YES completion:nil];
                         });
        }];
  }
}

- (void)viewWillAppear:(BOOL)animated {
  [super viewWillAppear:animated];
  if (animated) {
    [self.floatingButton collapse:NO completion:nil];
  }
}

- (void)viewDidAppear:(BOOL)animated {
  [super viewDidAppear:animated];
  if (animated) {
    [self.floatingButton expand:YES completion:nil];
  }
}

@end
