/*
 Copyright 2016-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 "MaterialPalettes.h"
#import "MaterialProgressView.h"
#import "MaterialTypography.h"

static const CGFloat MDCProgressViewAnimationDuration = 1.f;

@interface ProgressViewExample : UIViewController

@property(nonatomic, strong) MDCProgressView *stockProgressView;
@property(nonatomic, strong) UILabel *stockProgressLabel;

@property(nonatomic, strong) MDCProgressView *tintedProgressView;
@property(nonatomic, strong) UILabel *tintedProgressLabel;

@property(nonatomic, strong) MDCProgressView *fullyColoredProgressView;
@property(nonatomic, strong) UILabel *fullyColoredProgressLabel;

@property(nonatomic, strong) MDCProgressView *backwardProgressResetView;
@property(nonatomic, strong) UILabel *backwardProgressResetLabel;

@property(nonatomic, strong) MDCProgressView *backwardProgressAnimateView;
@property(nonatomic, strong) UILabel *backwardProgressAnimateLabel;

@end

@implementation ProgressViewExample

- (void)setupProgressViews {
  _stockProgressView = [[MDCProgressView alloc] init];
  _stockProgressView.translatesAutoresizingMaskIntoConstraints = NO;
  [self.view addSubview:_stockProgressView];
  // Hide the progress view at setup time.
  _stockProgressView.hidden = YES;

  _tintedProgressView = [[MDCProgressView alloc] init];
  _tintedProgressView.translatesAutoresizingMaskIntoConstraints = NO;
  [self.view addSubview:_tintedProgressView];
  _tintedProgressView.progressTintColor = MDCPalette.redPalette.tint500;
  // Reset the track tint color to be based off of the progress tint color.
  _tintedProgressView.trackTintColor = nil;
  // Hide the progress view at setup time.
  _tintedProgressView.hidden = YES;

  _fullyColoredProgressView = [[MDCProgressView alloc] init];
  _fullyColoredProgressView.translatesAutoresizingMaskIntoConstraints = NO;
  [self.view addSubview:_fullyColoredProgressView];
  _fullyColoredProgressView.progressTintColor = MDCPalette.greenPalette.tint500;
  _fullyColoredProgressView.trackTintColor = MDCPalette.yellowPalette.tint500;
  // Hide the progress view at setup time.
  _fullyColoredProgressView.hidden = YES;

  _backwardProgressResetView = [[MDCProgressView alloc] init];
  _backwardProgressResetView.translatesAutoresizingMaskIntoConstraints = NO;
  [self.view addSubview:_backwardProgressResetView];
  // Have a non-zero progress at setup time.
  _backwardProgressResetView.progress = 0.33f;

  _backwardProgressAnimateView = [[MDCProgressView alloc] init];
  _backwardProgressAnimateView.translatesAutoresizingMaskIntoConstraints = NO;
  _backwardProgressAnimateView.backwardProgressAnimationMode =
      MDCProgressViewBackwardAnimationModeAnimate;
  [self.view addSubview:_backwardProgressAnimateView];
  // Have a non-zero progress at setup time.
  _backwardProgressAnimateView.progress = 0.33f;
}

@end

@implementation ProgressViewExample (Supplemental)

- (void)dealloc {
  [NSObject cancelPreviousPerformRequestsWithTarget:self];
}

- (void)viewDidLoad {
  [super viewDidLoad];
  self.title = @"Progress View";
  self.view.backgroundColor = [UIColor whiteColor];

  [self setupProgressViews];
  [self setupLabels];
  [self setupConstraints];
}

- (void)setupLabels {
  _stockProgressLabel = [[UILabel alloc] init];
  _stockProgressLabel.text = @"Progress";
  _stockProgressLabel.font = [MDCTypography captionFont];
  _stockProgressLabel.alpha = [MDCTypography captionFontOpacity];
  _stockProgressLabel.translatesAutoresizingMaskIntoConstraints = NO;
  [self.view addSubview:_stockProgressLabel];

  _tintedProgressLabel = [[UILabel alloc] init];
  _tintedProgressLabel.text = @"Progress with progress tint";
  _tintedProgressLabel.font = [MDCTypography captionFont];
  _tintedProgressLabel.alpha = [MDCTypography captionFontOpacity];
  _tintedProgressLabel.translatesAutoresizingMaskIntoConstraints = NO;
  [self.view addSubview:_tintedProgressLabel];

  _fullyColoredProgressLabel = [[UILabel alloc] init];
  _fullyColoredProgressLabel.text = @"Progress with custom colors";
  _fullyColoredProgressLabel.font = [MDCTypography captionFont];
  _fullyColoredProgressLabel.alpha = [MDCTypography captionFontOpacity];
  _fullyColoredProgressLabel.translatesAutoresizingMaskIntoConstraints = NO;
  [self.view addSubview:_fullyColoredProgressLabel];

  _backwardProgressResetLabel = [[UILabel alloc] init];
  _backwardProgressResetLabel.text = @"Backward progress (reset)";
  _backwardProgressResetLabel.font = [MDCTypography captionFont];
  _backwardProgressResetLabel.alpha = [MDCTypography captionFontOpacity];
  _backwardProgressResetLabel.translatesAutoresizingMaskIntoConstraints = NO;
  [self.view addSubview:_backwardProgressResetLabel];

  _backwardProgressAnimateLabel = [[UILabel alloc] init];
  _backwardProgressAnimateLabel.text = @"Backward progress (animate)";
  _backwardProgressAnimateLabel.font = [MDCTypography captionFont];
  _backwardProgressAnimateLabel.alpha = [MDCTypography captionFontOpacity];
  _backwardProgressAnimateLabel.translatesAutoresizingMaskIntoConstraints = NO;
  [self.view addSubview:_backwardProgressAnimateLabel];
}

- (void)setupConstraints {
  NSDictionary *views = @{
    @"stockView" : _stockProgressView,
    @"stockLabel" : _stockProgressLabel,
    @"tintedView" : _tintedProgressView,
    @"tintedLabel" : _tintedProgressLabel,
    @"coloredView" : _fullyColoredProgressView,
    @"coloredLabel" : _fullyColoredProgressLabel,
    @"backwardResetView" : _backwardProgressResetView,
    @"backwardResetLabel" : _backwardProgressResetLabel,
    @"backwardAnimateView" : _backwardProgressAnimateView,
    @"backwardAnimateLabel" : _backwardProgressAnimateLabel,
  };
  NSDictionary *metrics = @{
    @"p" : @20,
    @"s" : @40,
    @"h" : @2,
  };

  NSArray *verticalConstraints = [NSLayoutConstraint
      constraintsWithVisualFormat:@"V:|-(p)-"
                                   "[stockView(==h)]-(p)-[stockLabel]-(s)-"
                                   "[tintedView(==h)]-(p)-[tintedLabel]-(s)-"
                                   "[coloredView(==h)]-(p)-[coloredLabel]-(s)-"
                                   "[backwardResetView(==h)]-(p)-[backwardResetLabel]-(s)-"
                                   "[backwardAnimateView(==h)]-(p)-[backwardAnimateLabel]"
                          options:0
                          metrics:metrics
                            views:views];
  [self.view addConstraints:verticalConstraints];

  NSMutableArray *horizontalConstraints = [NSMutableArray array];
  NSArray *horizontalVisualFormats = @[
    @"H:|-(p)-[stockView]-(p)-|",
    @"H:|-(p)-[tintedView]-(p)-|",
    @"H:|-(p)-[coloredView]-(p)-|",
    @"H:|-(p)-[backwardResetView]-(p)-|",
    @"H:|-(p)-[backwardAnimateView]-(p)-|",
    @"H:|-(>=p)-[stockLabel]-(>=p)-|",
    @"H:|-(>=p)-[tintedLabel]-(>=p)-|",
    @"H:|-(>=p)-[coloredLabel]-(>=p)-|",
    @"H:|-(>=p)-[backwardResetLabel]-(>=p)-|",
    @"H:|-(>=p)-[backwardAnimateLabel]-(>=p)-|",
  ];
  for (NSString *format in horizontalVisualFormats) {
    [horizontalConstraints
        addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:format
                                                                    options:0
                                                                    metrics:metrics
                                                                      views:views]];
  }
  [self.view addConstraints:horizontalConstraints];
}

- (void)viewDidAppear:(BOOL)animated {
  [super viewDidAppear:animated];
  [self animateStep1:_stockProgressView];
  [self animateStep1:_tintedProgressView];
  [self animateStep1:_fullyColoredProgressView];
  [self animateBackwardProgressResetView];
  [self animateBackwardProgressAnimateView];
}

- (void)animateStep1:(MDCProgressView *)progressView {
  progressView.progress = 0;
  __weak MDCProgressView *weakProgressView = progressView;
  [progressView setHidden:NO
                 animated:YES
               completion:^(BOOL finished) {
                 [self performSelector:@selector(animateStep2:)
                            withObject:weakProgressView
                            afterDelay:MDCProgressViewAnimationDuration];
               }];
}

- (void)animateStep2:(MDCProgressView *)progressView {
  [progressView setProgress:0.5 animated:YES completion:nil];
  [self performSelector:@selector(animateStep3:)
             withObject:progressView
             afterDelay:MDCProgressViewAnimationDuration];
}

- (void)animateStep3:(MDCProgressView *)progressView {
  [progressView setProgress:1 animated:YES completion:nil];
  [self performSelector:@selector(animateStep4:)
             withObject:progressView
             afterDelay:MDCProgressViewAnimationDuration];
}

- (void)animateStep4:(MDCProgressView *)progressView {
  __weak MDCProgressView *weakProgressView = progressView;
  [progressView setHidden:YES
                 animated:YES
               completion:^(BOOL finished) {
                 [self performSelector:@selector(animateStep1:)
                            withObject:weakProgressView
                            afterDelay:MDCProgressViewAnimationDuration];
               }];
}

- (void)animateBackwardProgressResetView {
  __weak ProgressViewExample *weakSelf = self;

  [_backwardProgressResetView setProgress:1 - _backwardProgressResetView.progress
                                 animated:YES
                               completion:^(BOOL finished) {
                                 [weakSelf
                                     performSelector:@selector(animateBackwardProgressResetView)
                                          withObject:nil
                                          afterDelay:MDCProgressViewAnimationDuration];
                               }];
}

- (void)animateBackwardProgressAnimateView {
  __weak ProgressViewExample *weakSelf = self;

  [_backwardProgressAnimateView setProgress:1 - _backwardProgressResetView.progress
                                   animated:YES
                                 completion:^(BOOL finished) {
                                   [weakSelf
                                       performSelector:@selector(animateBackwardProgressAnimateView)
                                            withObject:nil
                                            afterDelay:MDCProgressViewAnimationDuration];
                                 }];
}

#pragma mark - CatalogByConvention

+ (NSArray *)catalogBreadcrumbs {
  return @[ @"Progress View", @"Progress View" ];
}

+ (NSString *)catalogDescription {
  return @"Progress indicators display the length of a process or express an unspecified wait "
          "time.";
}

+ (BOOL)catalogIsPrimaryDemo {
  return YES;
}

+ (BOOL)catalogIsPresentable {
  return YES;
}

@end
