package net.sf.jasperreports.charts.fill;

import net.sf.jasperreports.charts.JRXyzSeries;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExpression;
import net.sf.jasperreports.engine.JRHyperlink;
import net.sf.jasperreports.engine.JRHyperlinkHelper;
import net.sf.jasperreports.engine.JRPrintHyperlink;
import net.sf.jasperreports.engine.JRRuntimeException;
import net.sf.jasperreports.engine.fill.JRCalculator;
import net.sf.jasperreports.engine.fill.JRExpressionEvalException;
import net.sf.jasperreports.engine.fill.JRFillExpressionEvaluator;
import net.sf.jasperreports.engine.fill.JRFillHyperlinkHelper;
import net.sf.jasperreports.engine.fill.JRFillObjectFactory;

public class JRFillXyzSeries implements JRXyzSeries {
  JRXyzSeries parent = null;
  
  private Comparable series = null;
  
  private Number xValue = null;
  
  private Number yValue = null;
  
  private Number zValue = null;
  
  private JRPrintHyperlink itemHyperlink;
  
  public JRFillXyzSeries(JRXyzSeries xyzSeries, JRFillObjectFactory factory) {
    factory.put(xyzSeries, this);
    this.parent = xyzSeries;
  }
  
  public JRExpression getSeriesExpression() {
    return this.parent.getSeriesExpression();
  }
  
  public JRExpression getXValueExpression() {
    return this.parent.getXValueExpression();
  }
  
  public JRExpression getYValueExpression() {
    return this.parent.getYValueExpression();
  }
  
  public JRExpression getZValueExpression() {
    return this.parent.getZValueExpression();
  }
  
  protected Comparable getSeries() {
    return this.series;
  }
  
  protected Number getXValue() {
    return this.xValue;
  }
  
  protected Number getYValue() {
    return this.yValue;
  }
  
  protected Number getZValue() {
    return this.zValue;
  }
  
  protected JRPrintHyperlink getPrintItemHyperlink() {
    return this.itemHyperlink;
  }
  
  protected void evaluate(JRCalculator calculator) throws JRExpressionEvalException {
    this.series = (Comparable)calculator.evaluate(getSeriesExpression());
    this.xValue = (Number)calculator.evaluate(getXValueExpression());
    this.yValue = (Number)calculator.evaluate(getYValueExpression());
    this.zValue = (Number)calculator.evaluate(getZValueExpression());
    if (hasItemHyperlinks())
      evaluateItemHyperlink(calculator); 
  }
  
  protected void evaluateItemHyperlink(JRCalculator calculator) throws JRExpressionEvalException {
    try {
      this.itemHyperlink = JRFillHyperlinkHelper.evaluateHyperlink(getItemHyperlink(), (JRFillExpressionEvaluator)calculator, (byte)3);
    } catch (JRExpressionEvalException e) {
      throw e;
    } catch (JRException e) {
      throw new JRRuntimeException(e);
    } 
  }
  
  public JRHyperlink getItemHyperlink() {
    return this.parent.getItemHyperlink();
  }
  
  public boolean hasItemHyperlinks() {
    return !JRHyperlinkHelper.isEmpty(getItemHyperlink());
  }
  
  public Object clone() {
    return null;
  }
}
