//
//  MPParsedElement.m
//  MathPad
//
//  Created by Kim Wittenburg on 05.09.14.
//  Copyright (c) 2014 Kim Wittenburg. All rights reserved.
//

#import "MPParsedElement.h"

@implementation MPParsedElement

- (instancetype)init
{
    self = [super init];
    if (self) {
    }
    return self;
}

- (NSDecimalNumber *)valueAtBeginning
{
    NSDecimalNumber *value = self.value;
    if (self.prefixValueExplicit) {
        value = [value decimalNumberByAdding:self.prefixMultiplicator];
    }
    return value;
}

- (NSDecimalNumber *)valueAtEnd
{
    NSDecimalNumber *value = self.value;
    if (self.suffixValueExplicit) {
        value = [value decimalNumberByAdding:self.suffixMultiplicator];
    }
    return value;
}

- (NSDecimalNumber *)standaloneValue
{
    if (self.isFactor) {
        return self.value;
    }
    NSDecimalNumber *value = self.value;
    if (self.prefixValueExplicit) {
        value = [value decimalNumberByAdding:self.prefixMultiplicator];
    }
    if (self.suffixValueExplicit) {
        value = [value decimalNumberByAdding:self.suffixMultiplicator];
    }
    return value;
}

- (BOOL)isValidElementAtBeginning:(MPParseError *__autoreleasing *)error
{
    if (self.prefixOperatorExplicit) {
        if (error) {
            *error = MPParseError(0, @"Expected Number");
        }
        return NO;
    }
    return YES;
}

- (BOOL)isValidStandaloneElement:(MPParseError *__autoreleasing *)error
{
    return [self isValidElementAtBeginning:error] && [self isValidElementAtEnd:error];
}

- (BOOL)isValidElementAtEnd:(MPParseError *__autoreleasing *)error
{
    if (self.suffixOperatorExplicit) {
        if (error) {
            *error = MPParseError(self.suffixIndex, @"Expected Number");
        }
        return NO;
    }
    return YES;
}

- (BOOL)isValidVariableDefinition:(MPParseError *__autoreleasing *)error
{
    if (self.definedVariable == nil) {
        if (error) {
            *error = MPParseError(0, @"Expected Variable Definition");
        }
        return NO;
    }
    return [self isValidElementAtBeginning:error];
}

#pragma mark - NSObject Overrides

- (NSString *)description
{
    NSMutableString *description = [[NSMutableString alloc] initWithString:@"MPParsedElement<"];
    if (self.isFactor) {
        [description appendFormat:@"factor=%@%@%@", self.prefixOperatorExplicit?@"*":@"", self.value, self.suffixOperatorExplicit?@"*":@""];
    } else {
        [description appendFormat:@"prefix=%@%@ prefixValueExplicit=%@", self.prefixOperatorExplicit?@"*":@"", self.prefixMultiplicator, self.prefixValueExplicit?@"YES":@"NO"];
        [description appendFormat:@" suffix=%@%@ suffixValueExplicit=%@", self.suffixMultiplicator, self.suffixOperatorExplicit?@"*":@"", self.suffixValueExplicit?@"YES":@"NO"];
        [description appendFormat:@" value=%@", self.value];
    }
    [description appendString:@">"];
    return [description copy];
}

#pragma mark - NSCopying
- (id)copyWithZone:(NSZone *)zone
{
    MPParsedElement *copy = [[MPParsedElement allocWithZone:zone] init];
    copy.isFactor = self.isFactor;
    copy.value = self.value;
    copy.prefixOperatorExplicit = self.prefixOperatorExplicit;
    copy.prefixValueExplicit = self.prefixValueExplicit;
    copy.prefixMultiplicator = self.prefixMultiplicator;
    copy.suffixOperatorExplicit = self.suffixOperatorExplicit;
    copy.suffixValueExplicit = self.suffixValueExplicit;
    copy.suffixMultiplicator = self.suffixMultiplicator;
    return copy;
}

@end
