// Copyright 2016 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/icons/chrome_icon.h"

#import <CoreGraphics/CoreGraphics.h>

#include "base/logging.h"
#include "ios/chrome/grit/ios_strings.h"
#include "ui/base/l10n/l10n_util_mac.h"

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

namespace {

NSString* AccessibilityLabelForIconNamed(NSString* name) {
  if ([name isEqualToString:@"ic_arrow_back"])
    return l10n_util::GetNSString(IDS_IOS_ICON_ARROW_BACK);
  if ([name isEqualToString:@"ic_close"])
    return l10n_util::GetNSString(IDS_IOS_ICON_CLOSE);
  if ([name isEqualToString:@"ic_info"])
    return l10n_util::GetNSString(IDS_IOS_ICON_INFO);
  if ([name isEqualToString:@"ic_search"])
    return l10n_util::GetNSString(IDS_IOS_ICON_SEARCH);
  return nil;
}

UIImage* IconNamed(NSString* name) {
  UIImage* image = [UIImage imageNamed:name];
  DCHECK(image);
  image.accessibilityIdentifier = name;
  image.accessibilityLabel = AccessibilityLabelForIconNamed(name);
  return image;
}

// Wraps -[UIImage imageFlippedForRightToLeftLayoutDirection] to also support
// porting accessibility properties.
// TODO(crbug.com/622543): remove this workaround if Apple fixes rdar://26962660
UIImage* ImageFlippedForRightToLeftLayoutDirection(UIImage* image) {
  UIImage* imageFlipped = [image imageFlippedForRightToLeftLayoutDirection];
  imageFlipped.accessibilityIdentifier = image.accessibilityIdentifier;
  imageFlipped.accessibilityLabel = image.accessibilityLabel;
  return imageFlipped;
}

}  // namespace

@implementation ChromeIcon

+ (UIImage*)backIcon {
  return ImageFlippedForRightToLeftLayoutDirection(IconNamed(@"ic_arrow_back"));
}

+ (UIImage*)closeIcon {
  return IconNamed(@"ic_close");
}

+ (UIImage*)infoIcon {
  return IconNamed(@"ic_info");
}

+ (UIImage*)searchIcon {
  return IconNamed(@"ic_search");
}

+ (UIImage*)chevronIcon {
  return ImageFlippedForRightToLeftLayoutDirection(
      IconNamed(@"ic_chevron_right"));
}

+ (UIBarButtonItem*)templateBarButtonItemWithImage:(UIImage*)image
                                            target:(id)target
                                            action:(SEL)action {
  UIImage* templateImage =
      [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
  UIBarButtonItem* barButtonItem =
      [[UIBarButtonItem alloc] initWithImage:templateImage
                                       style:UIBarButtonItemStylePlain
                                      target:target
                                      action:action];
  [barButtonItem setAccessibilityIdentifier:image.accessibilityIdentifier];
  [barButtonItem setAccessibilityLabel:image.accessibilityLabel];
  return barButtonItem;
}

@end
