// Copyright 2015 The Bazel Authors. 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 "examples/ios/PrenotCalculator/CalculatorViewController.h"

#import "examples/ios/PrenotCalculator/CalculatedValues.h"
#import "examples/ios/PrenotCalculator/CoreData.h"
#import "examples/ios/PrenotCalculator/Equation.h"
#import "examples/ios/PrenotCalculator/Expression.h"
#import "examples/ios/PrenotCalculator/Literal.h"

@interface CalculatorViewController ()
- (void)updateEnabledViews;
- (void)updateButtonColor:(UIButton *)button;
@end

@implementation CalculatorViewController {
  NSMutableArray *_locationStack;
  NSMutableString *_currentNumber;
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
  self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
  if (self) {
    self.title = @"Calculator";
    CoreData *coreData = [[CoreData alloc] init];
    [coreData verify];
  }
  return self;
}

- (void)viewDidLoad {
  [super viewDidLoad];
  _locationStack = [NSMutableArray array];
  _currentNumber = [NSMutableString stringWithString:@""];
  [self updateEnabledViews];
}

- (IBAction)enterDigit:(id)sender {
  UIButton *button = (UIButton *)sender;
  [_currentNumber appendString:button.titleLabel.text];
  self.resultLabel.text = _currentNumber;
  [self updateEnabledViews];
}

- (IBAction)finish:(id)sender {
  if (![_locationStack count]) {
    _currentNumber = [NSMutableString stringWithString:@""];
    self.resultLabel.text = @"hello";
  }
  if (![_locationStack count]) {
    _currentNumber = [NSMutableString stringWithString:@""];
  } else if ([_currentNumber length]) {
    Equation *last = [_locationStack lastObject];
    [last addExpressionAsChild:[[Literal alloc] initWithDouble:
        atof([_currentNumber cStringUsingEncoding:NSUTF8StringEncoding])]];
    _currentNumber = [NSMutableString stringWithString:@""];
    self.resultLabel.text = [NSString stringWithFormat:@"%@", last];
  } else {
    Equation *popped = [_locationStack lastObject];
    [_locationStack removeLastObject];
    [[CalculatedValues sharedInstance] addEquation:popped];
    self.resultLabel.text =
        [NSString stringWithFormat:@"%lf", [popped calculate]];
  }
  [self updateEnabledViews];
}

- (IBAction)operate:(id)sender {
  Operation operation;
  if ([_currentNumber length]) {
    // finish the current number first automatically:
    [self finish:nil];
  }
  if (sender == self.multiplyButton) {
    operation = kMultiply;
  } else if (sender == self.plusButton) {
    operation = kAdd;
  } else if (sender == self.divideButton) {
    operation = kDivide;
  } else if (sender == self.minusButton) {
    operation = kSubtract;
  } else {
    // Shouldn't happen
    operation = kAdd;
  }
  Equation *newEquation = [[Equation alloc] initWithOperation:operation];
  if ([_locationStack count]) {
    [[_locationStack lastObject] addExpressionAsChild:newEquation];
  }
  [_locationStack addObject:newEquation];
  self.resultLabel.text = [NSString stringWithFormat:@"%@", _locationStack[0]];
  [self updateEnabledViews];
}

#pragma mark - Private


- (void)updateEnabledViews {
  self.finishButton.enabled = [_locationStack count] || [_currentNumber length];
  [self updateButtonColor:self.finishButton];
  self.zeroButton.enabled = self.finishButton.enabled;
  [self updateButtonColor:self.zeroButton];
  BOOL enableNonZeroDigits = ![_currentNumber isEqualToString:@"0"];
  for (UIButton *digit in self.nonZeroDigitButtons) {
    digit.enabled = enableNonZeroDigits;
    [self updateButtonColor:digit];
  }
}

- (void)updateButtonColor:(UIButton *)button {
  button.backgroundColor = button.enabled ?
      [UIColor whiteColor] : [UIColor grayColor];
}

@end
