1// Copyright 2018 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#import "ios/web_view/internal/autofill/cwv_credit_card_internal.h"
6
7#include "base/strings/sys_string_conversions.h"
8#include "components/autofill/core/browser/data_model/credit_card.h"
9#include "ios/web_view/internal/app/application_context.h"
10#import "ios/web_view/internal/utils/nsobject_description_utils.h"
11#include "ui/base/resource/resource_bundle.h"
12
13#if !defined(__has_feature) || !__has_feature(objc_arc)
14#error "This file requires ARC support."
15#endif
16
17@interface CWVCreditCard ()
18
19// Gets |value| for |type| from |_internalCard|.
20- (NSString*)valueForType:(autofill::ServerFieldType)type;
21
22@end
23
24@implementation CWVCreditCard {
25  autofill::CreditCard _internalCard;
26}
27
28- (instancetype)initWithCreditCard:(const autofill::CreditCard&)creditCard {
29  self = [super init];
30  if (self) {
31    _internalCard = creditCard;
32  }
33  return self;
34}
35
36#pragma mark - Public Methods
37
38- (NSString*)cardHolderFullName {
39  return [self valueForType:autofill::CREDIT_CARD_NAME_FULL];
40}
41
42- (NSString*)cardNumber {
43  return [self valueForType:autofill::CREDIT_CARD_NUMBER];
44}
45
46- (NSString*)networkName {
47  return [self valueForType:autofill::CREDIT_CARD_TYPE];
48}
49
50- (UIImage*)networkIcon {
51  int resourceID =
52      autofill::CreditCard::IconResourceId(_internalCard.network());
53  return ui::ResourceBundle::GetSharedInstance()
54      .GetNativeImageNamed(resourceID)
55      .ToUIImage();
56}
57
58- (NSString*)expirationMonth {
59  return [self valueForType:autofill::CREDIT_CARD_EXP_MONTH];
60}
61
62- (NSString*)expirationYear {
63  return [self valueForType:autofill::CREDIT_CARD_EXP_4_DIGIT_YEAR];
64}
65
66- (NSString*)bankName {
67  return base::SysUTF8ToNSString(_internalCard.bank_name());
68}
69
70#pragma mark - NSObject
71
72- (NSString*)debugDescription {
73  NSString* debugDescription = [super debugDescription];
74  return [debugDescription
75      stringByAppendingFormat:@"\n%@", CWVPropertiesDescription(self)];
76}
77
78#pragma mark - Internal
79
80- (autofill::CreditCard*)internalCard {
81  return &_internalCard;
82}
83
84#pragma mark - Private Methods
85
86- (NSString*)valueForType:(autofill::ServerFieldType)type {
87  const std::string& locale =
88      ios_web_view::ApplicationContext::GetInstance()->GetApplicationLocale();
89  return base::SysUTF16ToNSString(_internalCard.GetInfo(type, locale));
90}
91
92@end
93