//
//  TUIConversationSelectController_Minimalist.m
//  Pods
//
//  Created by harvy on 2020/12/8.
//  Copyright © 2023 Tencent. All rights reserved.
//

#import "TUIConversationSelectController_Minimalist.h"
#import <TIMCommon/TIMCommonModel.h>
#import <TIMCommon/TIMDefine.h>
#import <TUICore/NSDictionary+TUISafe.h>
#import <TUICore/TUICore.h>
#import "TUIConversationCellData_Minimalist.h"
#import "TUIConversationForwardSelectCell_Minimalist.h"
#import "TUIConversationSelectDataProvider_Minimalist.h"

typedef void (^TUIConversationSelectCompletHandler)(BOOL);

@interface TUIConversationSelectCollectionCell : UICollectionViewCell
@property(nonatomic, strong) UILabel *textLabel;
@end
@implementation TUIConversationSelectCollectionCell
- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        _textLabel = [[UILabel alloc] init];
        _textLabel.font = [UIFont systemFontOfSize:kScale390(14)];
        _textLabel.textColor = [UIColor tui_colorWithHex:@"#000000"];
        [self.contentView addSubview:_textLabel];
    }
    return self;
}

- (void)layoutSubviews {
    [super layoutSubviews];
    [_textLabel sizeToFit];
    _textLabel.frame = CGRectMake(0, kScale390(14), _textLabel.frame.size.width, _textLabel.frame.size.height);
}
@end
@interface TUIConversationSelectListPicker : UIControl <UICollectionViewDelegate, UICollectionViewDataSource>
@property(nonatomic, strong) UIView *line;
@property(nonatomic, strong) UICollectionView *collectionView;
@property(nonatomic, strong) UIButton *accessoryBtn;
@property(nonatomic, strong) NSArray<TUICommonContactSelectCellData *> *selectArray;
@property(nonatomic, copy) TUIContactListPickerOnCancel onCancel;

@end

@implementation TUIConversationSelectListPicker

- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];

    [self initControl];
    [self setupBinding];

    return self;
}

- (void)initControl {
    self.line = [[UIView alloc] init];
    self.line.backgroundColor = [UIColor tui_colorWithHex:@"#000000" alpha:0.1];
    [self addSubview:self.line];
    UICollectionViewFlowLayout *layout = [[TUICollectionRTLFitFlowLayout alloc] init];
    layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
    layout.minimumLineSpacing = 0;
    layout.minimumInteritemSpacing = 0;
    self.collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout];
    self.collectionView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    self.collectionView.showsHorizontalScrollIndicator = NO;
    self.collectionView.decelerationRate = UIScrollViewDecelerationRateNormal;

    [self.collectionView registerClass:[TUIConversationSelectCollectionCell class] forCellWithReuseIdentifier:@"PickerIdentifier"];
    [self.collectionView setBackgroundColor:[UIColor clearColor]];
    [self.collectionView setDelegate:self];
    [self.collectionView setDataSource:self];

    [self addSubview:_collectionView];

    self.accessoryBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    [self.accessoryBtn setTitle:[NSString stringWithFormat:@" %@ ", TIMCommonLocalizableString(Forward)] forState:UIControlStateNormal];
    [self.accessoryBtn setTitleColor:[UIColor systemBlueColor] forState:UIControlStateNormal];
    self.accessoryBtn.titleLabel.font = [UIFont boldSystemFontOfSize:kScale390(14)];
    self.accessoryBtn.enabled = NO;
    [self addSubview:self.accessoryBtn];
}

- (void)setupBinding {
    [self addObserver:self forKeyPath:@"selectArray" options:NSKeyValueObservingOptionNew context:nil];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey, id> *)change context:(void *)context {
    if ([keyPath isEqualToString:@"selectArray"]) {
        [self.collectionView reloadData];
        NSArray *newSelectArray = change[NSKeyValueChangeNewKey];
        if ([newSelectArray isKindOfClass:NSArray.class]) {
            self.accessoryBtn.enabled = [newSelectArray count];
        }
    }
}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    return [self.selectArray count];
}

- (CGSize)collectionView:(nonnull UICollectionView *)collectionView
                    layout:(nonnull UICollectionViewLayout *)collectionViewLayout
    sizeForItemAtIndexPath:(nonnull NSIndexPath *)indexPath {
    TUICommonContactSelectCellData *model = self.selectArray[indexPath.row];
    NSString *formatTitle = @"";
    if (indexPath.row != 0) {
        formatTitle = [NSString stringWithFormat:@",%@", model.title];
    } else {
        formatTitle = model.title;
    }
    CGSize size = [formatTitle boundingRectWithSize:CGSizeMake(CGFLOAT_MAX, 20)
                                            options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
                                         attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:kScale390(14)]}
                                            context:nil]
                      .size;
    return CGSizeMake(size.width, self.collectionView.frame.size.height);
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    TUIConversationSelectCollectionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"PickerIdentifier" forIndexPath:indexPath];

    TUICommonContactSelectCellData *data = self.selectArray[indexPath.row];

    if (indexPath.row != 0) {
        cell.textLabel.text = [NSString stringWithFormat:@",%@", data.title];
    } else {
        cell.textLabel.text = data.title;
    }

    return cell;
}

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
    [collectionView deselectItemAtIndexPath:indexPath animated:NO];
    if (indexPath.item >= self.selectArray.count) {
        return;
    }
    TUICommonContactSelectCellData *data = self.selectArray[indexPath.item];
    if (self.onCancel) {
        self.onCancel(data);
    }
}

- (void)layoutSubviews {
    [super layoutSubviews];
    self.line.frame = CGRectMake(0, 0, self.mm_w, kScale390(1));
    self.accessoryBtn.mm_sizeToFit().mm_height(30).mm_right(15).mm_top(13);
    self.collectionView.mm_left(kScale390(16)).mm_height(40).mm_width(self.accessoryBtn.mm_x - 30).mm__centerY(self.accessoryBtn.mm_centerY);
}

@end

@interface TUIConversationSelectController_Minimalist () <UITableViewDelegate, UITableViewDataSource>

@property(nonatomic, strong) UITableView *tableView;
@property(nonatomic, strong) TUIConversationSelectListPicker *pickerView;
@property(nonatomic, strong) TUICommonTableViewCell *headerView;

@property(nonatomic, assign) BOOL enableMuliple;
@property(nonatomic, strong) NSMutableArray<TUIConversationCellData *> *currentSelectedList;

@property(nonatomic, strong) TUIConversationSelectDataProvider_Minimalist *dataProvider;

@property(nonatomic, weak) UIViewController *showContactSelectVC;

@end

@implementation TUIConversationSelectController_Minimalist

static NSString *const Id = @"con";

#pragma mark - Life
- (void)viewDidLoad {
    [super viewDidLoad];

    [self setupViews];
}

- (void)viewWillLayoutSubviews {
    [super viewWillLayoutSubviews];
    [self updateLayout];
}

- (TUIConversationSelectDataProvider_Minimalist *)dataProvider {
    if (!_dataProvider) {
        _dataProvider = [[TUIConversationSelectDataProvider_Minimalist alloc] init];
        [_dataProvider loadConversations];
    }
    return _dataProvider;
}

- (void)dealloc {
    NSLog(@"%s dealloc", __FUNCTION__);
}

#pragma mark - API
+ (instancetype)showIn:(UIViewController *)presentVC {
    TUIConversationSelectController_Minimalist *vc = [[TUIConversationSelectController_Minimalist alloc] init];
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc];
    nav.modalPresentationStyle = UIModalPresentationFullScreen;
    UIViewController *pVc = presentVC;
    if (pVc == nil) {
        pVc = UIApplication.sharedApplication.keyWindow.rootViewController;
    }
    [pVc presentViewController:nav animated:YES completion:nil];
    return vc;
}

#pragma mark - UI
- (void)setupViews {
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:TIMCommonLocalizableString(Cancel)
                                                                             style:UIBarButtonItemStylePlain
                                                                            target:self
                                                                            action:@selector(doCancel)];
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:TIMCommonLocalizableString(Multiple)
                                                                              style:UIBarButtonItemStylePlain
                                                                             target:self
                                                                             action:@selector(doMultiple)];

    self.view.backgroundColor = [UIColor whiteColor];

    _headerView = [[TUICommonTableViewCell alloc] init];
    _headerView.textLabel.text = TIMCommonLocalizableString(TUIKitRelayTargetCreateNewChat);
    _headerView.textLabel.font = [UIFont systemFontOfSize:15.0];
    _headerView.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    [_headerView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onCreateSessionOrSelectContact)]];

    _tableView = [[UITableView alloc] init];
    _tableView.delegate = self;
    _tableView.dataSource = self;
    _tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    //    _tableView.tableHeaderView = self.headerView;
    [_tableView registerClass:TUIConversationForwardSelectCell_Minimalist.class forCellReuseIdentifier:Id];
    [self.view addSubview:_tableView];

    _pickerView = [[TUIConversationSelectListPicker alloc] init];

    [_pickerView setBackgroundColor:[UIColor whiteColor]];
    [_pickerView setHidden:YES];
    [_pickerView.accessoryBtn addTarget:self action:@selector(doPickerDone) forControlEvents:UIControlEventTouchUpInside];
    __weak typeof(self) weakSelf = self;
    _pickerView.onCancel = ^(TUICommonContactSelectCellData *data) {
      TUIConversationCellData *tmp = nil;
      for (TUIConversationCellData *convCellData in weakSelf.currentSelectedList) {
          if ([convCellData.conversationID isEqualToString:data.identifier]) {
              tmp = convCellData;
              break;
          }
      }
      if (tmp == nil) {
          return;
      }

      tmp.selected = NO;
      [weakSelf.currentSelectedList removeObject:tmp];
      [weakSelf updatePickerView];
      [weakSelf.tableView reloadData];
    };
    [self.view addSubview:_pickerView];

    @weakify(self);
    [RACObserve(self.dataProvider, dataList) subscribeNext:^(id _Nullable x) {
      @strongify(self);
      [self.tableView reloadData];
    }];
}

- (void)updateLayout {
    [self.pickerView setHidden:!self.enableMuliple];
    self.headerView.frame = CGRectMake(0, 0, self.view.bounds.size.width, 55);
    _headerView.textLabel.text =
        self.enableMuliple ? TIMCommonLocalizableString(TUIKitRelayTargetSelectFromContacts) : TIMCommonLocalizableString(TUIKitRelayTargetCreateNewChat);

    if (!self.enableMuliple) {
        self.tableView.frame = self.view.bounds;
        return;
    }

    CGFloat pH = 55;
    CGFloat pMargin = 0;
    if (@available(iOS 11.0, *)) {
        pMargin = self.view.safeAreaInsets.bottom;
    }
    [self.pickerView setFrame:CGRectMake(0, self.view.bounds.size.height - pH - pMargin, self.view.bounds.size.width, pH + pMargin)];
    self.tableView.frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height - pH - pMargin);
}

- (void)updatePickerView {
    NSMutableArray *arrayM = [NSMutableArray array];
    for (TUIConversationCellData *convCellData in self.currentSelectedList) {
        TUICommonContactSelectCellData *data = [[TUICommonContactSelectCellData alloc] init];
        data.avatarUrl = [NSURL URLWithString:convCellData.faceUrl];
        data.avatarImage = convCellData.avatarImage;
        data.title = convCellData.title;
        data.identifier = convCellData.conversationID;
        [arrayM addObject:data];
    }
    self.pickerView.selectArray = [NSArray arrayWithArray:arrayM];
}

#pragma mark - Action
- (void)doCancel {
    if (self.enableMuliple) {
        self.enableMuliple = NO;

        for (TUIConversationCellData *cellData in self.dataProvider.dataList) {
            cellData.selected = NO;
        }

        [self.currentSelectedList removeAllObjects];
        self.pickerView.selectArray = @[];
        [self updatePickerView];
        [self updateLayout];
        [self.tableView reloadData];
    } else {
        [self dismissViewControllerAnimated:YES completion:nil];
    }
}

- (void)doMultiple {
    self.enableMuliple = YES;
    [self updateLayout];
    [self.tableView reloadData];
}

- (void)onCreateSessionOrSelectContact {
    NSMutableArray *ids = NSMutableArray.new;
    for (TUIConversationCellData *cd in self.currentSelectedList) {
        if (![cd.userID isEqualToString:[[V2TIMManager sharedInstance] getLoginUser]]) {
            if (cd.userID.length > 0) {
                [ids addObject:cd.userID];
            }
        }
    }

    @weakify(self);
    void (^selectContactCompletion)(NSArray<TUICommonContactSelectCellData *> *) = ^(NSArray<TUICommonContactSelectCellData *> *array) {
      @strongify(self);
      [self dealSelectBlock:array];
    };

    UIViewController *vc = [TUICore createObject:TUICore_TUIContactObjectFactory
                                             key:TUICore_TUIContactObjectFactory_GetContactSelectControllerMethod
                                           param:@{
                                               TUICore_TUIContactObjectFactory_GetContactSelectControllerMethod_DisableIdsKey : ids,
                                               TUICore_TUIContactObjectFactory_GetContactSelectControllerMethod_CompletionKey : selectContactCompletion,
                                           }];

    [self.navigationController pushViewController:(UIViewController *)vc animated:YES];
    self.showContactSelectVC = vc;
}

- (void)dealSelectBlock:(NSArray<TUICommonContactSelectCellData *> *)array {
    NSArray<TUICommonContactSelectCellData *> *selectArray = array;
    if (![selectArray.firstObject isKindOfClass:TUICommonContactSelectCellData.class]) {
        NSAssert(NO, @"Error value type");
    }
    if (self.enableMuliple) {
        /**
         * Multiple selection: Select from address book -> Create conversation for each contact -> Every contact will be displayed in pickerView
         */
        for (TUICommonContactSelectCellData *contact in selectArray) {
            if ([self existInSelectedArray:contact.identifier]) {
                continue;
            }
            TUIConversationCellData *conv = [self findItemInDataListArray:contact.identifier];
            if (!conv) {
                conv = [[TUIConversationCellData alloc] init];
                conv.conversationID = contact.identifier;
                conv.userID = contact.identifier;
                conv.groupID = @"";
                conv.avatarImage = contact.avatarImage;
                conv.faceUrl = contact.avatarUrl.absoluteString;
            } else {
                conv.selected = !conv.selected;
            }

            [self.currentSelectedList addObject:conv];
        }

        [self updatePickerView];
        [self.tableView reloadData];
        [self.navigationController popViewControllerAnimated:YES];
    } else {
        /**
         * Single Choice: Create a new chat (or a group chat if there are multiple people) -> Create a group chat for the selected contact -> Forward directly
         */
        if (selectArray.count <= 1) {
            TUICommonContactSelectCellData *contact = selectArray.firstObject;
            if (contact) {
                TUIConversationCellData *conv = [[TUIConversationCellData alloc] init];
                conv.conversationID = contact.identifier;
                conv.userID = contact.identifier;
                conv.groupID = @"";
                conv.avatarImage = contact.avatarImage;
                conv.faceUrl = contact.avatarUrl.absoluteString;
                self.currentSelectedList = [NSMutableArray arrayWithArray:@[ conv ]];
                [self tryFinishSelected:^(BOOL finished) {
                  if (finished) {
                      [self notifyFinishSelecting];
                      [self dismissViewControllerAnimated:YES completion:nil];
                  }
                }];
            }
            return;
        }
        [self tryFinishSelected:^(BOOL finished) {
          if (finished) {
              [self createGroupWithContacts:selectArray
                                 completion:^(BOOL success) {
                                   if (success) {
                                       [self dismissViewControllerAnimated:YES completion:nil];
                                   }
                                 }];
          }
        }];
    }
}

- (BOOL)existInSelectedArray:(NSString *)identifier {
    for (TUIConversationCellData *cellData in self.currentSelectedList) {
        if (cellData.userID.length && [cellData.userID isEqualToString:identifier]) {
            return YES;
        }
    }
    return NO;
}

- (TUIConversationCellData *)findItemInDataListArray:(NSString *)identifier {
    for (TUIConversationCellData *cellData in self.dataProvider.dataList) {
        if (cellData.userID.length && [cellData.userID isEqualToString:identifier]) {
            return cellData;
        }
    }
    return nil;
}

- (void)doPickerDone {
    __weak typeof(self) weakSelf = self;
    [self tryFinishSelected:^(BOOL finished) {
      if (finished) {
          [self notifyFinishSelecting];
          [weakSelf dismissViewControllerAnimated:YES completion:nil];
      }
    }];
}

// confirm whether to forward or not
- (void)tryFinishSelected:(TUIConversationSelectCompletHandler)handler {
    UIAlertController *alertVc = [UIAlertController alertControllerWithTitle:TIMCommonLocalizableString(TUIKitRelayConfirmForward)
                                                                     message:nil
                                                              preferredStyle:UIAlertControllerStyleAlert];
    [alertVc tuitheme_addAction:[UIAlertAction actionWithTitle:TIMCommonLocalizableString(Cancel)
                                                         style:UIAlertActionStyleDefault
                                                       handler:^(UIAlertAction *_Nonnull action) {
                                                         if (handler) {
                                                             handler(NO);
                                                         }
                                                       }]];
    [alertVc tuitheme_addAction:[UIAlertAction actionWithTitle:TIMCommonLocalizableString(Confirm)
                                                         style:UIAlertActionStyleDefault
                                                       handler:^(UIAlertAction *_Nonnull action) {
                                                         if (handler) {
                                                             handler(YES);
                                                         }
                                                       }]];
    [self presentViewController:alertVc animated:YES completion:nil];
}

// notify others that the user has finished selecting conversations
- (void)notifyFinishSelecting {
    if (self.navigateValueCallback) {
        NSMutableArray *temMArr = [NSMutableArray arrayWithCapacity:self.currentSelectedList.count];
        for (TUIConversationCellData *cellData in self.currentSelectedList) {
            [temMArr addObject:@{
                TUICore_TUIConversationObjectFactory_ConversationSelectVC_ResultList_ConversationID : cellData.conversationID ?: @"",
                TUICore_TUIConversationObjectFactory_ConversationSelectVC_ResultList_Title : cellData.title ?: @"",
                TUICore_TUIConversationObjectFactory_ConversationSelectVC_ResultList_UserID : cellData.userID ?: @"",
                TUICore_TUIConversationObjectFactory_ConversationSelectVC_ResultList_GroupID : cellData.groupID ?: @"",
            }];
        }
        self.navigateValueCallback(@{TUICore_TUIConversationObjectFactory_ConversationSelectVC_ResultList : temMArr});
    }
}

// create a new group to receive the forwarding messages
- (void)createGroupWithContacts:(NSArray *)contacts completion:(void (^)(BOOL success))completion {
    @weakify(self);
    void (^createGroupCompletion)(BOOL, NSString *, NSString *) = ^(BOOL success, NSString *groupID, NSString *groupName) {
      @strongify(self);
      if (!success) {
          [TUITool makeToast:TIMCommonLocalizableString(TUIKitRelayTargetCrateGroupError)];
          if (completion) {
              completion(NO);
          }
          return;
      }
      TUIConversationCellData *cellData = [[TUIConversationCellData alloc] init];
      cellData.groupID = groupID;
      cellData.title = groupName;
      self.currentSelectedList = [NSMutableArray arrayWithArray:@[ cellData ]];
      [self notifyFinishSelecting];
      if (completion) {
          completion(YES);
      }
    };
    NSDictionary *param = @{
        TUICore_TUIContactService_CreateGroupMethod_GroupTypeKey : GroupType_Meeting,
        TUICore_TUIContactService_CreateGroupMethod_OptionKey : @(V2TIM_GROUP_ADD_ANY),
        TUICore_TUIContactService_CreateGroupMethod_ContactsKey : contacts,
        TUICore_TUIContactService_CreateGroupMethod_CompletionKey : createGroupCompletion
    };
    [TUICore callService:TUICore_TUIContactService_Minimalist method:TUICore_TUIContactService_CreateGroupMethod param:param];
}

#pragma mark - UITableViewDelegate, UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.dataProvider.dataList.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    TUIConversationForwardSelectCell_Minimalist *cell = [tableView dequeueReusableCellWithIdentifier:Id forIndexPath:indexPath];
    if (indexPath.row < 0 || indexPath.row >= self.dataProvider.dataList.count) {
        return cell;
    }
    TUIConversationCellData *cellData = self.dataProvider.dataList[indexPath.row];
    cellData.showCheckBox = self.enableMuliple;
    [cell fillWithData:cellData];
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [tableView deselectRowAtIndexPath:indexPath animated:NO];
    TUIConversationCellData *cellData = self.dataProvider.dataList[indexPath.row];
    cellData.selected = !cellData.selected;
    if (!self.enableMuliple) {
        self.currentSelectedList = [NSMutableArray arrayWithArray:@[ cellData ]];
        __weak typeof(self) weakSelf = self;
        [self tryFinishSelected:^(BOOL finished) {
          if (finished) {
              [self notifyFinishSelecting];
              [weakSelf dismissViewControllerAnimated:YES completion:nil];
          }
        }];
        return;
    }

    if ([self.currentSelectedList containsObject:cellData]) {
        [self.currentSelectedList removeObject:cellData];
    } else {
        [self.currentSelectedList addObject:cellData];
    }

    [self updatePickerView];
    [self.tableView reloadData];
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 56.0;
}

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    UIView *titleView = [[UIView alloc] init];
    titleView.backgroundColor = [UIColor whiteColor];
    titleView.bounds = CGRectMake(0, 0, self.tableView.bounds.size.width, 30);
    UILabel *label = [[UILabel alloc] init];
    label.text = TIMCommonLocalizableString(TUIKitRelayRecentMessages);
    label.font = [UIFont boldSystemFontOfSize:kScale390(14)];
    label.textColor = [UIColor tui_colorWithHex:@"#000000"];
    label.textAlignment = NSTextAlignmentLeft;
    [titleView addSubview:label];
    label.frame = CGRectMake(kScale390(14), 0, self.tableView.bounds.size.width - 10, 30);
    return titleView;
}

#pragma mark - Lazy

- (NSMutableArray<TUIConversationCellData *> *)currentSelectedList {
    if (_currentSelectedList == nil) {
        _currentSelectedList = [NSMutableArray array];
    }
    return _currentSelectedList;
}

#pragma mark - TUIChatFloatSubViewControllerProtocol
- (void)floatControllerLeftButtonClick {
    [self doCancel];
}

- (void)floatControllerRightButtonClick {
    [self doMultiple];
}

@end
