/*
 * Copyright 2012 ZXing authors
 *
 * 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 "ZXBinaryUtil.h"

@implementation ZXBinaryUtil

/*
 * Constructs a BitArray from a String like the one returned from BitArray.toString()
 */
+ (ZXBitArray *)buildBitArrayFromString:(NSString *)data {
  NSString *dotsAndXs = [[data stringByReplacingOccurrencesOfString:@"1" withString:@"X"]
                         stringByReplacingOccurrencesOfString:@"0" withString:@"."];
  ZXBitArray *binary = [[ZXBitArray alloc] initWithSize:(int)[dotsAndXs stringByReplacingOccurrencesOfString:@" " withString:@""].length];
  int counter = 0;

  for (int i = 0; i < dotsAndXs.length; ++i){
    if(i % 9 == 0) { // spaces
      if([dotsAndXs characterAtIndex:i] != ' ') {
        @throw [NSException exceptionWithName:@"IllegalStateException" reason:@"space expected" userInfo:nil];
      }
      continue;
    }

    unichar currentChar = [dotsAndXs characterAtIndex:i];
    if (currentChar == 'X' || currentChar == 'x') {
      [binary set:counter];
    }
    counter++;
  }
  return binary;
}

+ (ZXBitArray *)buildBitArrayFromStringWithoutSpaces:(NSString *)data {
  NSMutableString *sb = [NSMutableString string];

  NSString *dotsAndXs = [[data stringByReplacingOccurrencesOfString:@"1" withString:@"X"]
                         stringByReplacingOccurrencesOfString:@"0" withString:@"."];

  int current = 0;
  while (current < dotsAndXs.length) {
    [sb appendString:@" "];
    for (int i = 0; i < 8 && current < dotsAndXs.length; ++i){
      [sb appendFormat:@"%C", [dotsAndXs characterAtIndex:current]];
      current++;
    }
  }

  return [self buildBitArrayFromString:sb];
}


@end
