//
//  EXPTableComponent.m
//  Expression
//
//  Created by ashley on 31/12/2008.
//  Copyright 2008 __MyCompanyName__. All rights reserved.
//

#import "EXPTableComponent.h"

@implementation EXPTableComponent

- (id) init
{
	self = [super init];
	
	if (self!=nil) {
		_xPoints = [[NSMutableArray alloc] init];
		_yPoints = [[NSMutableArray alloc] init];
	}
	
	return self;
}

- (id) componentType
{
	return @"Table";
}

- (void) setFromElement:(NSXMLElement *)element
{
//			EXPTableElement *table = (EXPTableElement *)variable;
	[super setFromElement:element];
	id error = nil;
	NSString *spacing = [[self getElementChild:@"spacing" forElement:element] stringValue];
	BOOL isRegular = [spacing isEqualToString:@"Regular"];
	[self setIsRegular:isRegular];

	NSString *tableType = [[self getElementChild:@"interpolator" forElement:element] stringValue];
	if ([tableType isEqualToString:@"Linear"]) {
		[self setInterpType:LINEAR];
	} else if ([tableType isEqualToString:@"Cspline"] || [tableType isEqualToString:@"Spline"]) {
		[self setInterpType:SPLINE];
	} else if ([tableType isEqualToString:@"Piecewise"]) {
		[self setInterpType:STEPWISE];
	} else {
		[error addError:@"Invalid interpolator name for table function" atLine:99999];
	}
			
	if (isRegular) {
/*		double xmin = [[self getelement:@"xmin" forElement:element default:@"0.0"] doubleValue];
		EXPConstant *constant = [[EXPConstant alloc] initWithName:nil];
		[constant setValue:xmin];
		[constant setExpressionType:doubleType];
		[self setXMin:constant];
		[constant release]; */
		NSString *xmin = [[self getElementChild:@"xmin" forElement:element] stringValue];
		[self setXMin:xmin];
		
/*		double xmax = [[self getelement:@"xmax" forElement:element default:@"1.0"] doubleValue];
		constant = [[EXPConstant alloc] initWithName:nil];
		[constant setValue:xmax];
		[constant setExpressionType:doubleType];
		[self setXMax:constant];
		[constant release]; */
		NSString *xmax = [[self getElementChild:@"xmax" forElement:element] stringValue];
		[self setXMax:xmax];
	} else {
		NSArray *xpoints = [element elementsForName:@"x"];
		int nxpoints = [xpoints count];
		int i;
		for(i=0; i<nxpoints; i++) {
			NSString *xvalue = [[xpoints objectAtIndex:i] stringValue];
			[self addXPoint:xvalue];
/*			EXPConstant *constant = [[EXPConstant alloc] initWithName:nil];
			[constant setValue:[xvalue doubleValue]];
			[constant setExpressionType:doubleType];
			[self addXPoint:constant];
			[constant release]; */
		}
	}
	
	NSArray *ypoints = [element elementsForName:@"y"];
	int npoints = [ypoints count];
	int i;
	for(i=0; i<npoints; i++) {
		NSString *yvalue = [[ypoints objectAtIndex:i] stringValue];
		[self addYPoint:yvalue];
	}
	
/*	EXPSymbolReference *reference = [[EXPSymbolReference alloc] init]; 
	[reference setElement:self];
	EXPTableDefinitionOp *definition = [[EXPTableDefinitionOp alloc] initWithLeft:reference right:nil];
	[reference release];
	[model addInitialiser:definition error:error];
	[definition release]; */
}

- (void) setXPoints:(id)xPoints
{
	[xPoints retain];
	[_xPoints release];
	_xPoints = xPoints;
}

- (id) xPoints
{
	return _xPoints;
}

- (void) addXPoint:(id)xPoint
{
	[[self xPoints] addObject:xPoint];
}

- (void) setYPoints:(id)yPoints
{
	[yPoints retain];
	[_yPoints release];
	_yPoints = yPoints;
}

- (id) yPoints
{
	return _yPoints;
}

- (void) addYPoint:(id)yPoint
{
	[[self yPoints] addObject:yPoint];
}

- (int) nPoints
{
	return [[self yPoints] count];
}

- (void) setIsRegular:(BOOL)isRegular
{
	_isRegular = isRegular;
}

- (BOOL) isRegular
{
	return _isRegular;
}

- (void) setXMin:(id)xMin
{
	[xMin retain];
	[_xMin release];
	_xMin = xMin;
}

- (id) xMin
{
	return _xMin;
}

- (void) setXMax:(id)xMax
{
	[xMax retain];
	[_xMax release];
	_xMax = xMax;
}

- (id) xMax
{
	return _xMax;
}

- (void) setInterpType:(int)interpType
{
	_interpType = interpType;
}

- (int) interpType
{
	return _interpType;
}

- (void) setExpressions:(id)expressions
{
	NSLog(@"setExpressions: %@", self);
}

- (NSString *)elementType
{
	return @"table";
}

/* - (EXPExpressionType) expressionType
{
	return doubleType;
} */

- (NSString *)description
{
	NSMutableString *desc = [[NSMutableString alloc] initWithString:[self name]];
	[desc appendString:@"("];
	
	NSArray *xPoints = [self xPoints];
	NSArray *yPoints = [self yPoints];
	int i;
	for(i=0; i<[self nPoints]; i++) {
		NSString *xp = [[xPoints objectAtIndex:i] description];
		NSString *yp = [[yPoints objectAtIndex:i] description];
		if (i>0) {
			[desc appendString:@", "];
		}
		[desc appendFormat:@"{%@, %@}", xp, yp];
	}
	
	[desc appendString:@")"];

	return desc;
}

- (void) dealloc
{
	[_xPoints release];
	[_yPoints release];
	[_xMin release];
	[_xMax release];
	[super dealloc];
}

@end