//
//  DataPickerState.m
//
//  Copyright 2014 Google Inc.
//
//  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 "DataPickerState.h"

NSString * const kMultipleSelectKey = @"multiple-select";
NSString * const kElementsKey = @"elements";
NSString * const kLabelKey = @"label";
NSString * const kShortLabelKey = @"shortLabel";
NSString * const kSelectedKey = @"selected";

@implementation DataPickerState

- (id)initWithDictionary:(NSDictionary *)dict {
  self = [super init];
  if (self) {
    _multipleSelectEnabled =
        [[dict objectForKey:kMultipleSelectKey] boolValue];

    NSMutableArray *cellLabels = [[NSMutableArray alloc] init];
    NSMutableSet *selectedCells = [[NSMutableSet alloc] init];

    NSArray *elements = [dict objectForKey:kElementsKey];
    for (NSDictionary *elementDict in elements) {
      NSMutableDictionary *cellLabelDict = [NSMutableDictionary dictionary];
      NSString *label = [elementDict objectForKey:kLabelKey];
      cellLabelDict[kLabelKey] = label;

      if ([elementDict objectForKey:kShortLabelKey]) {
        cellLabelDict[kShortLabelKey] = [elementDict objectForKey:kShortLabelKey];
      }
      [cellLabels addObject:cellLabelDict];

      // Default selection mode is unselected, unless specified in plist.
      if ([[elementDict objectForKey:kSelectedKey] boolValue]) {
        [selectedCells addObject:label];
      }
    }

    self.cellLabels = cellLabels;
    self.selectedCells = selectedCells;
  }
  return self;
}

@end
