// Copyright 2015 Google Inc. All rights reserved.
//
// 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 "Equation.h"

@implementation Equation {
  NSMutableArray *_children;
}

@synthesize operation = _operation;

- (id)init {
  [self doesNotRecognizeSelector:_cmd];
  return nil;
}

- (id)initWithOperation:(Operation)operation {
  self = [super init];
  if (self) {
    _children = [NSMutableArray array];
    _operation = operation;
  }
  return self;
}

- (NSArray *)children {
  return [_children copy];
}

- (void)addExpressionAsChild:(Expression *)child {
  [_children addObject:child];
}

- (double)calculate {
  if ([_children count] == 1) {
    return (_operation == kSubtract)
        ? -[_children[0] calculate] : [_children[0] calculate];
  } else if ([_children count] == 0) {
    return (_operation == kSubtract || _operation == kAdd) ? 0 : 1;
  }
  double value = [_children[0] calculate];
  for (Equation *child in [_children subarrayWithRange:
      NSMakeRange(1, [_children count] - 1)]) {
    double childValue = [child calculate];
    switch (_operation) {
      case kAdd:
        value += childValue;
        break;
      case kSubtract:
        value -= childValue;
        break;
      case kMultiply:
        value *= childValue;
        break;
      case kDivide:
        value /= childValue;
        break;
    }
  }
  return value;
}

- (NSString *)description {
  NSMutableString *result = [[NSMutableString alloc] init];
  [result appendString:@"("];
  switch (_operation) {
    case kAdd:
      [result appendString:@"+"];
      break;
    case kSubtract:
      [result appendString:@"-"];
      break;
    case kMultiply:
      [result appendString:@"*"];
      break;
    case kDivide:
      [result appendString:@"/"];
      break;
  }
  for (Equation *child in _children) {
    [result appendString:@" "];
    [result appendString:[child description]];
  }
  [result appendString:@")"];
  return [result copy];
}

- (BOOL)isEqual:(id)object {
  if (![object isKindOfClass:[self class]]) {
    return NO;
  }
  Equation *other = object;
  return other->_operation == _operation &&
      [other->_children isEqual:_children];
}

@end
