/*
 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] init];
    self.typographyScheme = [[MDCTypographyScheme alloc] init];
  }
  return self;
}

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

- (void)viewDidLoad {
  [super viewDidLoad];

  self.view.backgroundColor = [UIColor colorWithWhite:0.9f 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.f]];
  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.f;
  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.f]];
  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
