// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#import "ios/chrome/browser/ui/autofill/manual_fill/action_cell.h"

#import "ios/chrome/browser/ui/autofill/manual_fill/manual_fill_cell_utils.h"
#import "ios/chrome/browser/ui/autofill/manual_fill/uicolor_manualfill.h"
#import "ios/chrome/browser/ui/list_model/list_model.h"
#import "ios/chrome/common/ui_util/constraints_ui_util.h"

#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif

namespace {

// The multiplier for the base system spacing at the top margin.
static const CGFloat TopBaseSystemSpacingMultiplier = 1.1;

// The multiplier for the base system spacing at the bottom margin.
static const CGFloat BottomBaseSystemSpacingMultiplier = 1.5;

}  // namespace

@interface ManualFillActionItem ()

// The action block to be called when the user taps the title.
@property(nonatomic, copy, readonly) void (^action)(void);

// The title for the action.
@property(nonatomic, copy, readonly) NSString* title;

@end

@implementation ManualFillActionItem

- (instancetype)initWithTitle:(NSString*)title action:(void (^)(void))action {
  self = [super initWithType:kItemTypeEnumZero];
  if (self) {
    _title = [title copy];
    _action = [action copy];
    _enabled = YES;
    self.cellClass = [ManualFillActionCell class];
  }
  return self;
}

- (void)configureCell:(ManualFillActionCell*)cell
           withStyler:(ChromeTableViewStyler*)styler {
  [super configureCell:cell withStyler:styler];
  cell.accessibilityIdentifier = nil;
  [cell setUpWithTitle:self.title
       accessibilityID:self.accessibilityIdentifier
                action:self.action
               enabled:self.enabled
         showSeparator:self.showSeparator];
}

@end

@interface ManualFillActionCell ()

// The action block to be called when the user taps the title button.
@property(nonatomic, copy) void (^action)(void);

// The vertical constraints for all the lines.
@property(nonatomic, strong) NSArray<NSLayoutConstraint*>* verticalConstraints;

// The title button of this cell.
@property(nonatomic, strong) UIButton* titleButton;

// Separator line after cell, if needed.
@property(nonatomic, strong) UIView* grayLine;

@end

@implementation ManualFillActionCell

#pragma mark - Public

- (void)prepareForReuse {
  [super prepareForReuse];
  [NSLayoutConstraint deactivateConstraints:self.verticalConstraints];
  self.verticalConstraints = @[];
  self.action = nil;
  [self.titleButton setTitle:nil forState:UIControlStateNormal];
  self.titleButton.accessibilityIdentifier = nil;
  [self.titleButton setTitleColor:UIColor.cr_manualFillTintColor
                         forState:UIControlStateNormal];
  self.titleButton.enabled = YES;
}

- (void)setUpWithTitle:(NSString*)title
       accessibilityID:(NSString*)accessibilityID
                action:(void (^)(void))action
               enabled:(BOOL)enabled
         showSeparator:(BOOL)showSeparator {
  if (self.contentView.subviews.count == 0) {
    [self createView];
  }

  self.grayLine.hidden = !showSeparator;

  [self.titleButton setTitle:title forState:UIControlStateNormal];
  self.titleButton.accessibilityIdentifier = accessibilityID;
  self.titleButton.enabled = enabled;
  if (!enabled) {
    [self.titleButton setTitleColor:UIColor.lightGrayColor
                           forState:UIControlStateNormal];
  }
  self.action = action;

  NSMutableArray<UIView*>* verticalLeadViews = [[NSMutableArray alloc] init];
  [verticalLeadViews addObject:self.titleButton];

  self.verticalConstraints =
      VerticalConstraintsSpacingForViewsInContainerWithMultipliers(
          verticalLeadViews, self.contentView, TopBaseSystemSpacingMultiplier,
          BottomBaseSystemSpacingMultiplier, BottomBaseSystemSpacingMultiplier);
}

#pragma mark - Private

- (void)createView {
  self.selectionStyle = UITableViewCellSelectionStyleNone;

  UIView* guide = self.contentView;
  self.grayLine = CreateGraySeparatorForContainer(guide);

  self.titleButton = CreateButtonWithSelectorAndTarget(
      @selector(userDidTapTitleButton:), self);
  self.titleButton.titleLabel.lineBreakMode = NSLineBreakByTruncatingTail;
  [self.contentView addSubview:self.titleButton];
  HorizontalConstraintsForViewsOnGuideWithShift(@[ self.titleButton ], guide,
                                                0);

  self.verticalConstraints = @[];
}

- (void)userDidTapTitleButton:(UIButton*)sender {
  if (self.action) {
    self.action();
  }
}

@end
